1.数组
数组属于引用数据类型,所以在把数组传递进方法之后,如果方法对数组本身做了任何修改,修改结果都是会保存下来的。
public class ArrayRefDemo01 {
public static void main(String[] args) {
int temp[] = { 1, 3, 5 }; // 使用静态初始化定义数组
fun(temp); // 传递数组引用
for (int i = 0; i < temp.length; i++) { // 循环输出
System.out.print(temp[i] + "、");
}
}
public static void fun(int x[]) { // 接收整型数组引用
x[0] = 6; // 修改第一个元素的内容
}
}
2.对象引用传递
Person per1 = new Person(); // 实例化per1对象
Person per2 = new Person(); // 实例化per2对象
显而易见,两者单独开辟堆内存
Person per1 = new Person(); // 只实例化per1一个对象
Person per2 = per1 ; // 把per1的堆内存空间使用权给per2
per1.name = "张三"; // 设置per1对象的name属性内容
per1.age = 30; // 设置per1对象的age属性内容
// 设置per2对象的内容,实际上就是设置per1对象的内容
per2.age = 33;
System.out.print("per1对象中的内容 --> ") ;
per1.tell(); // 调用类中的方法
System.out.print("per2对象中的内容 --> ") ;
per2.tell();
这种情况,两个输出就会是一样的,因为指向为同一块堆内存
3.下面来看三种引用传递
class Demo {
int temp = 30; // 此处为了访问方便,属性暂不封装
}
public class RefDemo01{
public static void main(String[] args) {
Demo d1 = new Demo();
d1.temp = 50;
System.out.println("fun()方法调用之前:" + d1.temp);
fun(d1);
System.out.println("fun()方法调用之后:" + d1.temp);
}
public static void fun(Demo d2) { // 此处的方法由主方法直接调用
d2.temp = 1000;
}
}
第一种很好理解,方法调用没有开辟新的堆内存,输出为d1d2指向同一堆内存,修改直接修改内存里的值
public class RefDemo02 {
public static void main(String[] args) {
String str1 =new String("hello") ; // 实例化字符串对象
System.out.println("fun()方法调用之前:" + str1);
fun(str1); // 调用fun()方法
System.out.println("fun()方法调用之后:" + str1);
}
public static void fun(String str2) { // 此处的方法由主方法直接调用
str2 = new String( "MLDN") ; // 修改字符串内容
}
}
第二种与前一种不同之处在str2开辟了一块新内存并由hello指向MLDN,str1还为原来的hello,内存并未被修改
class Demo {
String temp =new String("hello"); // 此处为了访问方便,属性暂不封装
}
public class RefDemo03 {
public static void main(String[] args) {
Demo d1 = new Demo(); // 实例化对象
d1.temp = new String( "world"); // 修改对象中的temp属性
System.out.println("fun()方法调用之前:" + d1.temp);
fun(d1); // 调用fun()方法
System.out.println("fun()方法调用之后:" + d1.temp);
}
public static void fun(Demo d2) { // 此处的方法由主方法直接调用
d2.temp =new String( "MLDN"); // 修改属性的内容
}
}
第三种方法将前两种结合,fun方法实际是将temp的属性修改,并未开辟新的堆空间