Java参数传递是指在Java程序中,将一个变量或者对象从一个方法传递到另一个方法的过程。Java中有两种不同的参数传递方式:值传递和引用传递。
值传递是指在调用函数时,将实际参数的值复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。例如:
public static void main(String[] args) { int a = 10; System.out.println("Before change, a = " + a); change(a); System.out.println("After change, a = " + a); } public static void change(int b) { b = 20; }
上面代码中change()方法是使用值传递的方式来调用的,执行后输出结果为:Before change, a = 10 After change, a = 10 可以看到change()方法对b的修改并没有影响到main()方法中a的值。
引用传递是指在调用函数时,将实际参数的地址复制一份传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。例如:
public static void main(String[] args) { int[] arr = {1, 2, 3, 4}; System.out.println("Before change, arr[0] = " + arr[0]); change(arr); System.out.println("After change, arr[0] = " + arr[0]); } public static void change(int[] b) { b[0] = 10; }
上面代码中change()方法是使用引用传递的方式来被被访问的,执行后输出结果为:Before change, arr[0] = 1 After change, arr[0] = 10 可以看到change()方法对b[0] 的修改影响了main() 方法中arr[0] 的值。
Java支持两种数据类型:基本数据类型和引用数据类型。
原始数据类型是一个简单的数据结构,它只有一个与之相关的值。引用数据类型是一个复杂的数据结构,它表示一个对象。
原始数据类型的变量将该值直接存储在其存储器地址处。
使用对象和引用变量时,事情会有所不同。
Java中的所有参数都通过值传递。
当参数是原始数据类型时,实际参数的值将复制到参数中。
对方法主体中的参数值进行的任何更改只会更改形式参数的副本,而不会更改实际参数的值。
当参数通过参考值传递时,存储在实际参数中的参考被复制到形式参数。实际参数和形式参数都指向内存中的相同对象。
您可以将另一个对象的引用分配给方法主体中的形式参数。
下面的代码演示了Java中的引用传递机制。
class Phone { public String model = "Unknown"; public int year = 2014; public double price = 0.0; } public class Main { public static void main(String[] args) { Phone myPhone = new Phone(); myPhone.model = "iPhone"; myPhone.year = 2009; myPhone.price = 16000.0; System.out.println("#1: model = " + myPhone.model + ", year = " + myPhone.year + ", price = " + myPhone.price); Main.test(myPhone); System.out.println("#4: model = " + myPhone.model + ", year = " + myPhone.year + ", price = " + myPhone.price); } public static void test(Phone xPhone) { System.out.println("#2: model = " + xPhone.model + ", year = " + xPhone.year + ", price = " + xPhone.price); // Let"s make xyCar refer to a new object xPhone = new Phone(); System.out.println("#3: model = " + xPhone.model + ", year = " + xPhone.year + ", price = " + xPhone.price); } }
上面的代码生成以下结果。
当引用类型参数传递给方法时,形式参数可以访问对象,实际参数可以访问该对象。
形式参数可以通过直接更改实例变量的值或通过调用对象上的方法来修改对象。
通过形式参数对对象进行的任何修改都可以通过实际参数立即可见,因为它们都保存对内存中同一对象的引用。
形式参数本身可以被修改以引用方法内的另一个对象。
要禁用将引用类型形式参数更改为引用不同对象的方法,请在引用类型形式参数声明中使用关键字final
。
public class Main { public static void main(String[] args) { Phone myPhone = new Phone(); myPhone.model = "iPhone"; myPhone.year = 2009; myPhone.price = 16000.0; Main.test(myPhone); } public static void test(final Phone xPhone) { System.out.println("#2: model = " + xPhone.model + ", year = " + xPhone.year + ", price = " + xPhone.price); // Let"s make xyCar refer to a new object //xPhone = new Phone(); } } class Phone { public String model = "Unknown"; public int year = 2014; public double price = 0.0; }
上面的代码生成以下结果。
Java面向对象设计 -Java Objects类Java在java.util包中有一个实用程序类Objects用于处理对象。它由所有静态方法组成。 Objects类...
Java面向对象设计 -Java泛型类使用泛型,我们可以在不知道代码操作对象的类型的情况下编写代码。它允许我们创建泛型类,构造函数...
Java面向对象设计 -Java对注释类型的限制注释类型的限制注释类型不能从另一个注释类型继承。每个注释类型都隐式地继承java.lang....
Java面向对象设计 -Java枚举类枚举类型的超类编译枚举类型时,编译器会创建一个类。枚举类型可以具有构造函数,字段和方法。枚举...