zoukankan      html  css  js  c++  java
  • JAVA中关于基本数据和引用数据参数传递过程

    基本数据和引用数据参数传递过程

    案例1:判断程序的输出结果

    
    class Demo{
        public static void main(String[] atgs){
            int x =4;
            show(x);
            System.out.println("x="+x); // 最终输出: x=4
        }
        
        public static void show(int x){
            x = 5;
        }
    
    }
    
    

    执行过程第1步:主函数main()方法压栈,内部变量x赋值为4。

    第2步:show()方法压栈,在show()方法中,有一个局部变量x,注意,此 X 非main()中的 x。

    第3-4步:show()方法内部的x被main函数中的x赋值为4。

    第5步:show()方法执行最后的return(代码省略不写);show()方法弹栈。

    第6步:此时栈内还剩main()方法,main()方法内部该执行输出语句了,此时main()方法中只有一个 x,且 x 的值为4,故输出:x=4。

    第7步:主函数执行return,程序执行结束。

    类似地,

    
    class Demo{
        public static void main(String[] args){
            int x =4;
            show(x);
            System.out.println("x="+x); // 最终输出: x=4
        }
        
        public static int show(int x){
            x = 5;
    		return x;
        }
    
    }
    
    

    在show()方法中添加返回值,将x返回,此时输出结果仍为4。
    因为 return x 该语句将x的值5返回给了主函数的show()中,但是并没有用,并没有进行再赋值,所以输出结果仍为x=4。

    案例2

    
    
    class Demo{
    	int x;
        public static void main(String[] args){
            Demo d = new Demo();
            d.x = 5;
    		show(d);
            System.out.println("x="+d.x); 
        }
        
        public static void show(Demo d){
            d.x = 6;
        }
    
    }
    
    

    第1步:main()方法进栈,Demo d = new Demo() 该语句分为两部分执行,先执行右边,先在堆内存中开辟空间,其成员变量x默认值为0。

    第2步:将开辟的堆内存空间的地址赋值给main()方法中的d,此时d指向0x45该地址。

    第3步:执行d.x = 5,用d持有的地址去寻找对象,把对象中的x赋值为5。

    第4步:show()方法压栈,将main()方法中的d的值赋给show()方法中的d,此时二者(main()方法和show()方法中的d)所持有的地址相同,均指向堆内存中的0x45地址所代表的对象。

    第5步:执行show()方法中的 d.x = 6,将 show()方法中d指向的对象中的x值赋值为6。

    第6步:show()方法执行完毕,弹栈。

    第7步:执行main()方法中的输出语句,因为前面main()和show()方法中d指向的对象是同一个,所以此时对象中的x的值已经成为6,所以输出为:x=6。

    如果,将show()方法稍作更改,代码如下

    
    
    class Demo{
    	int x;
        public static void main(String[] args){
            Demo d = new Demo();
            d.x = 5;
    		show(new Demo());
            System.out.println("x="+d.x); 
        }
        
        public static void show(Demo d){
            d.x = 6;
        }
    
    }
    
    

    最后输出结果为x=5。因为在内存中创建了两个对象,而最终输出的对象的x值为5。

  • 相关阅读:
    shiro登录验证原理
    注解 java.lang.annotation.Inherited 介绍
    Spring Boot默认Initializer(1)——ConfigurationWarningsApplicationContextInitializer
    Java的static类
    Spring Boot中的initializers的作用分析
    2. Spring Boot项目启动原理初探
    1.Spring Boot入门及其jar包依赖模型分析
    关于正则式中的 |
    iOS :ViewDidAppear
    Xcode
  • 原文地址:https://www.cnblogs.com/zhqin/p/11198453.html
Copyright © 2011-2022 走看看