Java支持两种数据类型:基本数据类型和引用数据类型。
原始数据类型是一个简单的数据结构,它只有一个与之相关的值。 引用数据类型是一个复杂的数据结构,它表示一个对象。
原始数据类型的变量将该值直接存储在其存储器地址处。使用对象和引用变量时会有所不同。Java中的所有参数都通过值传递。
当参数是原始数据类型时,实际参数的值将复制到参数。
在方法主体中对参数值进行的任何更改只会更改形式参数的副本,而不会更改实际参数的值。当参数通过参考值传递时,存储在实际参数中的参考被复制到形式参数。 实际参数和形式参数都指向内存中的相同对象。
可以将另一个对象的引用分配给方法主体中的形式参数。
下面的代码演示了Java中的引用传递机制。
class Phone { public String model = "Unknown"; public int year = 2016; public double price = 0.0; } public class Main { public static void main(String[] args) { Phone myPhone = new Phone(); myPhone.model = "iPhone"; myPhone.year = 2018; 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); } }
上面的代码生成以下结果。
#1: model = iPhone, year = 2018, price = 16000.0 #2: model = iPhone, year = 2018, price = 16000.0 #3: model = Unknown, year = 2016, price = 0.0 #4: model = iPhone, year = 2018, price = 16000.0
注意
当引用类型参数传递给方法时,形式参数可以访问对象,实际参数也可以访问该对象。
形式参数可以通过直接更改实例变量的值或通过调用对象上的方法来修改对象。通过形式参数对对象进行的任何修改都可以通过实际参数立即可见,因为它们都保存对内存中同一对象的引用。形式参数本身可以被修改以引用方法内的另一个对象。
要禁用将引用类型形式参数更改为引用不同对象的方法,请在引用类型形式参数声明中使用关键字final
。
public class Main { public static void main(String[] args) { Phone myPhone = new Phone(); myPhone.model = "iPhone"; myPhone.year = 2017; 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; }
上面的代码生成以下结果。
#2: model = iPhone, year = 2017, price = 16000.0