开发者社区> 问答> 正文

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"变成垃圾?

展开
收起
蛮大人123 2016-02-29 15:36:45 2059 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    这段代码是不是生成了一个匿名对象"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一样能改变 .

    2019-07-17 18:50:23
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载