java中的引用传递问题

---恢复内容开始---

第一个引用传递案例:

class Message{
    private int num;
    public Message(int num){
        this.num=num;
    }
    public void setNum(int num){
        this.num=num;
    }
    public int getNum(){
        return this.num;
    }
}
public class Test{
    public static void main(String args[]){    
        Message msg = new Message(10);
        change(msg);//引用传递
        System.out.println(msg.getNum());//输出100
    }
    public static void change(Message temp){
        msg.setNum(100);
    }
}

对该代码进行内存分析,值类型不会独自占有一块堆内存,必须要有实例化对象,而String类的匿名对象会独自占用一块堆内存,不需要对象

第二道引用传递案例

public class Test{
    public static void main(String args[]){    
        String msg = "hello";
        change(msg);
        System.out.println(msg);//输出hello
    }
    public static void change(String temp){
        temp="word";
    }
}

String的匿名对象有独立的堆内存空间,此外字符串一旦声明则不可以被改变,若想改变只有改变其对象地址,内存分析:

第三个引用传递案例

class Message{
    private String str;
    public Message(String str){
        this.str=str;
    }
    public void setStr(String str){
        this.str=str;
    }
    public String getStr(){
        return this.str;
    }
}
public class Test{
    public static void main(String args[]){    
        Message msg = new Message("hello");
        change(msg);
        System.out.println(msg.getStr());    //输出word
    }
    public static void change(Message temp){
        temp.setStr("word");
    }
}

---恢复内容结束---

第一个引用传递案例:

class Message{
    private int num;
    public Message(int num){
        this.num=num;
    }
    public void setNum(int num){
        this.num=num;
    }
    public int getNum(){
        return this.num;
    }
}
public class Test{
    public static void main(String args[]){    
        Message msg = new Message(10);
        change(msg);//引用传递
        System.out.println(msg.getNum());//输出100
    }
    public static void change(Message temp){
        msg.setNum(100);
    }
}

对该代码进行内存分析,值类型不会独自占有一块堆内存,必须要有实例化对象,而String类的匿名对象会独自占用一块堆内存,不需要对象

第二道引用传递案例

public class Test{
    public static void main(String args[]){    
        String msg = "hello";
        change(msg);
        System.out.println(msg);//输出hello
    }
    public static void change(String temp){
        temp="word";
    }
}

String的匿名对象有独立的堆内存空间,此外字符串一旦声明则不可以被改变,若想改变只有改变其对象地址,内存分析:

第三个引用传递案例

class Message{
    private String str;
    public Message(String str){
        this.str=str;
    }
    public void setStr(String str){
        this.str=str;
    }
    public String getStr(){
        return this.str;
    }
}
public class Test{
    public static void main(String args[]){    
        Message msg = new Message("hello");
        change(msg);
        System.out.println(msg.getStr());    //输出word
    }
    public static void change(Message temp){
        temp.setStr("word");
    }
}
原文地址:https://www.cnblogs.com/hu1056043921/p/7275359.html