A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

示例1:基本数据类型参数传递
//基本数据类型参数传递
class Demo
{
        public static void main(String[] args){
                int x = 3;
                show(x);
                System.out.println("x=" + x);
        }
        
        public static void show(int x){
                x = 4;
        }
}
打印的是3,  执行过程说明:
    1、jvm调用main方法,main方法入栈。
    2、将x变量值设置为3。
    3、main方法调用show方法,3作为基本数据类型参数赋值给show方法参数x,也就是说,此时show方法的参数x值为3。
    4、show方法执行x=4后,show方法的参数x值变为4。
    5、show方法执行结束,show方法出栈。show方法参数x也随之出栈。
    6、main方法打印x的值。此时x指的是main方法中的x变量的值(show方法中的参数x已经随show方法一块出栈了)。所以,打印出来的x值为3而不是4。
    7、main方法执行结束,出栈。

示例2:引用数据类型参数传递
//引用数据类型参数传递
class Demo
{
        int x = 3;
        
        public static void main(String[] args){
                Demo d = new Demo();
                d.x = 9;
                show(d);
                System.out.println(d.x);
        }
        
        public static void show(Demo d){
                d.x = 4;
        }
}
4
    执行过程说明:
    1、jvm调用main方法,main方法入栈。
    2、创建Demo对象d(在堆内存中创建,d作为引用变量,指向堆内存中创建的实体对象),并将d指向的实体对象中的属性x的值设置为9。
    3、main方法调用show方法,d作为引用数据类型参数赋值给show方法参数d,也就是说,此时show方法的参数d和main方法中的变量d同时指向了堆内存中同一个实体对象。
    4、show方法执行d.x=4后,堆内存中的实体对象的x属性值变为4。
    5、show方法执行结束,show方法出栈,show方法参数d也随之出栈。虽然show方法参数d出栈了,但是,由于main方法的变量d依然引用着堆内存中的实体对象,因此堆内存中的实体对象不会被垃圾回收器清除。
    6、main方法打印d.x的值。此时,d指的是main方法中的引用变量x,d.x指的依然是堆内存中的实体对象中x的值。所以,打印出来的值为4而不是9。
    7、main方法执行结束,出栈。

    总结:
    在java中,方法参数的传递永远都是传值,而这个值,对于基本数据类型,值就是你赋给变量的那个值。而对于引用数据类型,这个值是对象的引用,而不是这个对象本身。

2 个回复

倒序浏览
原来是这样
回复 使用道具 举报
学习了,谢谢分享!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马