java类
### Java 类:传值还是传引用? 在Java编程语言中,理解变量的传递方式对于编写高效、可维护的代码至关重要。本文将通过一个具体的例子来深入探讨Java中的传值与传引用的区别,并解释如何利用这一特性来更好地管理程序的状态。 #### 1. 传值与传引用的概念 在Java中,基本数据类型(如int、char等)的参数传递遵循“传值”原则,即函数接收的是实际参数的一个副本。因此,对函数内的形参所做的任何修改都不会影响到调用者传入的实际参数。 而对象则是按照引用传递的,这意味着当我们将一个对象作为参数传递给方法时,实际上是将该对象的引用(内存地址)传递给了方法。因此,在方法内部对对象的任何修改都会反映到原始对象上。 #### 2. 示例分析 接下来,我们通过分析提供的`TestRef`类的代码来更深入地理解这些概念。 ```java public class TestRef { static Abc anotherAbc = new Abc("this is another object of Abc"); public static void change(Abc abc) { abc.setStr("be changed"); } public static void change(Abc abc, int foo) { abc = anotherAbc; } public static void change(String s) { s = "string has been changed"; } public static void main(String[] args) { Abc abc = new Abc("foo1"); // the property of abc can be changed change(abc); System.out.println(abc.getStr()); // result: "be changed" Abc abc2 = new Abc("foo2"); // the address of abc2 can't be changed change(abc2, 0); System.out.println(abc2.getStr()); // result: "foo2" String s = "foo3"; // the value of s can't be changed change(s); System.out.println(s); // result: "foo3" } } class Abc { private String str; public Abc(String s) { this.str = s; } public String getStr() { return str; } public void setStr(String str) { this.str = str; } } ``` ##### 2.1 对象引用的改变 - 在`change(Abc abc)`方法中,通过调用`abc.setStr("be changed")`改变了`abc`对象的`str`属性。这是因为`abc`是`Abc`对象的引用,因此在这个方法内部对`abc`所做的修改会影响到原始对象。 - 而在`change(Abc abc, int foo)`方法中,虽然执行了`abc = anotherAbc`,但并没有真正改变`main`方法中`abc2`所指向的对象。这是因为这里只是简单地改变了局部变量`abc`所引用的对象,并没有影响到原始对象的引用。因此,`abc2`对象的`str`属性依然保持不变。 ##### 2.2 基本类型的传递 - `change(String s)`方法展示了字符串常量是如何被处理的。由于字符串在Java中是不可变的,即使尝试重新赋值给`s`也不会影响到原始的`String`对象。因此,在这个例子中,`s`的值依然是"foo3"。 #### 3. 总结 - 对于对象类型的参数传递,Java实际上传递的是对象的引用,而不是对象本身。这意味着在方法内部对对象所做的任何修改都会影响到原始对象。 - 对于基本数据类型,Java采用传值的方式进行参数传递。这意味着在方法内部对这些类型的参数所做的任何修改都不会影响到原始数据。 通过以上分析,我们可以看到Java中传值与传引用的区别,并且了解如何根据这些区别来更有效地编写代码。这对于避免潜在的错误以及提高代码质量都具有重要意义。