Java小白进阶之值传递-引用传递

class ClassA{
        int value;//成员变量
    }
        public class TestClassA{
            
            public static void main(String args[]){ 
                int value = 10;//局部变量
                changeInt(value); 
                System.out.println(value);// 10
                
                ClassA ca = new ClassA();
                 ca.value = 10;
 
                changeObject(ca); 
        
                System.out.println(ca.value);//11
        }
            public static void changeInt(int value){ 
                value++;
        }
            public static void changeObject(ClassA ca){
             ca.value++;
        }

    }

解释一:
1.Java只有值传递,地址传递也是传递的那个地址值,第一个value++之后是一个新地址,第18行传入value,在里面++之后成为一个新的value,
是一个局部变量,而打印语句打印的的是外面的那个value,所以是10;

2.第二个value++是地址传递,地址没有改变,而是把地址指向的值加了1,而外面打印语句仍是这个地址,因为里面的值++了,
所以打印出来是11;

解释二:
1.第一个++之后还是10是对的,【基本数据类型对象】被修改之后是一个新地址,不影响原来的【基本数据类型对象】,值传递,value++之后的value是个局部变量,和外面的value无关,value++改的是参数value,改了之后是个局部的value,和外面的value就是两个不同的了,外面的还是外面的,没有被修改,值传递的基本数据类型本身是不会被别人修改的

2.第二个++之后看起来改变了,是因为传入的是一个对象,这个对象里面的成员的值被改变了,但是这个对象本身地址没变,所以看起来像是引用传递,其实还是原来那个对象

最后

欢迎工作一到五年的Java工程师朋友们加入Java架构开发: 957734884群内提供免费的Java架构进阶学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

猜你喜欢

转载自blog.csdn.net/weixin_44195108/article/details/88367080