java引用传递的问题
高洛峰
高洛峰 2017-04-17 12:01:03
[Java讨论组]
class Demo{
    String temp = "hello" ;     // 此处为了方便,属性暂时不封装
};
public class RefDemo03{
    public static void main(String args[]){
        Demo d1 = new Demo() ;  // 实例化Demo对象,实例化之后里面的temp="hello" 
        d1.temp = "world" ;     // 修改temp属性的内容
        System.out.println("fun()方法调用之前:" + d1.temp) ;
        fun(d1) ;
        System.out.println("fun()方法调用之后:" + d1.temp) ;
    }
    public static void fun(Demo d2){        // 此处的方法由主方法直接调用
        d2.temp = "123";                        // 修改temp值
    }
};

第一个问题:

d1.temp = "world" ;     // 修改temp属性的内容

这段代码是不是生成了一个匿名对象"world",然后d1.temp指向它,"hello"变成了垃圾?

第二个问题:

fun()方法调用之后输出的结果是123

不是说“因为String为一个特殊的类,其内容不能改变”吗?
那temp到底是Demo的一个属性还是Demo里面的一个内部类呢?
为什么d2指向d1的堆内存后可以改变d1里面的String类型的值呢?是不是也像上面的代码一样,先生成匿名对象"123",之后"world"变成垃圾?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(2)
伊谢尔伦

这段代码是不是生成了一个匿名对象"world",然后d1.temp指向它,"world"变成了垃圾?
答: 是想问"hello"变成了垃圾吗?如果问题是这样。从某个程度来说是的,字符串"hello"还会继续在JVM的静态内存区,等到GC的时候就会回收。不过这个区域并不经常GC。

不是说“因为String为一个特殊的类,其内容不能改变”吗?
答:这里题主要理解String是不可变性。 这里无论是 d1.temp = "world" 还是 d2.temp = "123"; 都是改变同一个对象同一个字段的引用地址而已。

那temp到底是Demo的一个属性还是Demo里面的一个内部类呢?
答:属性,已经不知道题主怎么理解的。

为什么d2指向d1的堆内存后可以改变d1里面的String类型的值呢?
答:这里明显是d1、d2都指向同一个堆对象。所以d1能改变,d2一样能改变 。。。。

是不是也像上面的代码一样,先生成匿名对象"123",之后"world"变成垃圾?
同上。。。。。。。

黄舟

String的不可变性 是说一旦字符串被创建,对其所做的任何修改都会生成新的字符串对象
例子如下

public static void main(String[] args) {
    String a = "aaa";
    //当a发生变化时,返回新的字符串
    String b = a.toUpperCase();
    System.out.println("a: " + a);
    System.out.println("b: " + b);
    System.out.println("a==b: "+ (a==b));

    //当a不发生变化时,不返回新字符串。
    String c = a.toLowerCase();
    System.out.println("c: " + c);
    System.out.println("a==c: "+ (a==c));
 }

运行结果:

a: aaa
b: AAA
a==b: false
c: aaa
a==c: true
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号