JAVA 对象内存

对象内存

观察下面代码

public class Phone {
    //成员变量
    String cpu;//cpu
    int rom;//内存


    public static void main(String[] args) {
        Phone iphone=new Phone();
        System.out.println(iphone);
        iphone.cpu="A11";
        iphone.rom=4;
        System.out.println(iphone.cpu);
        System.out.println(iphone.rom);

        System.out.println("--------------------------------------");
        Phone huawei=new Phone();
        System.out.println(huawei);
        huawei.cpu="海思麒麟";
        huawei.rom=8;
        System.out.println(huawei.cpu);
        System.out.println(huawei.rom);
    }
}

对象 调用 方法内存图

观察下面的代码

public class Phone2 {
    //成员变量
    String cpu;//cpu
    int rom;//内存

    public void call(String name){
        System.out.println("打电话给 "+name);
    }

    public static void main(String[] args) {
        Phone2 iphone=new Phone2();
        System.out.println(iphone);
        iphone.cpu="A11";
        iphone.rom=4;
        iphone.call("乔布斯");
        System.out.println(iphone.cpu);
        System.out.println(iphone.rom);

        System.out.println("--------------------------------------");
        Phone2 huawei=new Phone2();
        System.out.println(huawei);
        huawei.cpu="海思麒麟";
        huawei.rom=8;
        huawei.call("任正非");
        System.out.println(huawei.cpu);
        System.out.println(huawei.rom);
    }
}

对象调用方法时,根据对象中方法标记(地址值),去 方法区 寻找方法信息。

如此,即便有多个对象,方法信息只保存一份,节约内存空间。

对象 传递到方法中内存图

观察下面代码

public class Phone3 {
    //成员变量
    String cpu;//cpu
    int rom;//内存

    public void call(String name){
        System.out.println("打电话给 "+name);
    }

}
public class TestPhone {

    //修改手机
    public static void repair(Phone3 p){
        System.out.println(p);
        p.cpu="A13";
        p.rom=8;
    }
    public static void main(String[] args) {
        Phone3 iphone=new Phone3();
        iphone.cpu="A11";
        iphone.rom=4;
        System.out.println(iphone);
        System.out.println(iphone.cpu);
        System.out.println(iphone.rom);

        System.out.println("-------------------");
        repair(iphone);
        System.out.println(iphone.cpu);
        System.out.println(iphone.rom);

    }
}


引用类型作为参数,传递的是地址值。

打印内存地址

public class Phone {
    //成员变量
    String cpu;//cpu
    int rom;//内存


    public static void main(String[] args) {
        Phone iphone=new Phone();
        System.out.println(iphone);

        System.out.println("--------------------------------------");
        Phone huawei=new Phone();
        System.out.println(huawei);
    }
}

原文出处:/show_1EF4rUoG7nuM.html