我觉得引用传递 真的很好理解,不知道为什么大家觉得这么难,你只要掌握这几点就可以了
在Java机制中他自己提供的那些数据类型(String ,Object等)要这样理解:
1)在Java中 引用 说的就是 地址指针,或者叫地址变量,
2)引用传递 一般发生在函数调用的时候,最明显的特征就是 函数参数
3)如果引用传递 实用过程中 ,函数没有返回值,这个叫真正的引用传递,没有改变对象的真实值,一切只发生在函数内部,离开函数就无效,一切只对函数内部有影响;说白了:这个时候参数其实是变量地址的一个拷贝,一个副本,只是给你用,你是不能改变我真正的面目,但是我的副本你想怎么玩就怎么玩。也不用还给我!但是,请你记住一点,如果你改变了我的副本的值,对不起,你可能在你函数内部使用的过程中再也无法正确的调用我指向的内容值了,请认真对待这个问题。
4)如果引用传递 实用过程中,函数有返回值,且返回值的类型和参数是一致的,那么在外部 通过调用函数进行重新赋值,就会改变 对象的真实值,我一般把它叫做假的引用传递,
看懂了上面的4点,关于引用传递就没有问题了
看代码:
public static void main(String[] args) {
Object o = new Object();
System.out.println(o);
o = change2(o);
System.out.println(o);
}
public static void change(Object o){
o = null;
System.out.println(o);
}
public static Object change2(Object o){
o = null;
System.out.println(o);
return o;
}
这个main函数执行的结果是这样的:
java.lang.Object@2a139a55
null
null
再看一代代码,把main函数里面的执行函数换下:
public static void main(String[] args) {
Object o = new Object();
System.out.println(o);
//o = change2(o);
change(o);
System.out.println(o);
}
public static void change(Object o){
o = null;
System.out.println(o);
}
public static Object change2(Object o){
o = null;
System.out.println(o);
return o;
}
运行结果是这样的:
java.lang.Object@2a139a55
null
java.lang.Object@2a139a55
在Java机制中自己定义的数据类型,也就是通常意义上的 类 要这样理解:
他传递进去的也是引用传递,在函数里面如果调用了set方法或者.方法进行重新赋值,那么自定义的实例化对象的内容值一定发生了变化。
Java是按引用传递的,在函数里面可以修改对象的值
String a = "123";
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
public static void change(ClassReferenceTransferTest test) {
test.setA("abc");
//test.a="abc";
}
public static void main(String[] args) {
ClassReferenceTransferTest test1=new ClassReferenceTransferTest();
System.out.println(test1.a);
System.out.println(test1.getA());
change(test1);
System.out.println(test1.a);
System.out.println(test1.getA());
}
其实关于 为什么传递 自己定义的类的时候,是可以改变值,而传递的是String对象或者Object 对象,就不能了,
把上面的代码改成这样的,你就明白了:
String a = "123";
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
public static void change(ClassReferenceTransferTest test) {
//test.setA("abc");
//test.a="abc";
test = null;
}
public static void main(String[] args) {
ClassReferenceTransferTest test1=new ClassReferenceTransferTest();
System.out.println(test1.a);
System.out.println(test1.getA());
change(test1);
System.out.println(test1.a);
System.out.println(test1.getA());
}
输出结果全是123;
相信看完你就知道了,如果你去改变对象(这个对象指的是class)的值,那么一定可以改变,