Java对象的内存图解析

目录

 

一个类单个对象的情况

一个类中多个对象的情况


一个类单个对象的情况

        一个类单个对象就是定义了一个类,并且依照这个类值给出了一个对象来对应这个类。

当在创建对象的时候,就会生成栈内存和堆内存。栈内存代表对象,堆内存代表类。堆内存中包含类中规定的属性和方法,并且生成一个包含类中的属性和方法的内存地址赋值给栈内存 即对象

Student  s = new Student(); // 这代表着一个Student类的对象的创建 左边的代码会创建栈内存指向右边代码创建的堆内存 右边的堆内存会生成一个包含Student类中所有的属性和方法的内存地址赋值给变量s

所以当在调用属性和方法的时候就是依照变量名s对应的内存地址下的属性和方法去找到堆内存下的属性和方法。这里引用黑马程序员的图来解释

 该代码块表示创建了一个student01的类

package demo_4;

public class student01 {
    //创建成员变量
    String name;
    int age;

    //创建成员方法
    public void eat(){
        System.out.println(name+"在吃饭");
    }

    public void doHomework(){
        System.out.println(name+"在写作业");
    }
}

这个代码块表示创建一个对象并且调用student01类中的属性和方法

package demo_4;

public class student01_test {
    //创建对象 因为对象需要运行 所以需要用到main方法
    public static void main(String [] args){
        student01 s = new student01();//创建对象 右边的new生成一个堆内存和内存地址并将内存地址赋值给左边
        System.out.println(s);//变量名s指向堆内存的内存地址 所以直接输出s就是输出内存地址

        //属性的调用
        s.name="张三";
        s.age=18;
        // 因为在类的定义的时候 没有给属性进行一个内容的赋值 所以直接输出的话就是该属性对应的数据类型的默认值
        //因此我们需要给属性进行赋值 依照变量名s指向的内存地址去找到相应的属性进行赋值
        System.out.println(s.name);
        System.out.println(s.age);

        //方法的调用
        s.eat();
        s.doHomework();
        //方法的调用和普通的方法的调用没什么区别 只是需要使用s指向该内存地址对应的方法
    }
}

一个类中多个对象的情况

一个类中多个对象表示创建一个类但是依照这个类有多个对象。

同样的当在创建对象的时候也会生成栈内存和堆内存,这个和一个类中单个对象的情况一样。唯一的区别就是当一个类中存在多个对象的时候,多个对象会同时使用这个类中的方法,但是属性会不同,也就是说每创建一个对象就会在堆内存中生成一个专门用来存储这个对象对应的属性的内存地址

这里引用黑马程序员的一张图进行解释。当一个类中存在多个对象的时候,多个对象会引用该类中的方法,也就是说方法是共用的。但是在属性的调用的时候,就会生成单独的属性的内存地址供对象单独使用

这个代码块表示创建一个student02的类

package demo_4;
    //创建类
public class student02 {
    //创建成员变量
        String name;
        int age;

   //创建成员方法
   public void eat(){
       System.out.println(name+"在吃饭");
   }

   public void doHomework(){
       System.out.println(name+"在写作业");
   }
}

 这个代码块代表创建了两个对象并且同时指向student02这个类

package demo_4;

public class student02_test {
    public static void main(String[] args) {
        //创建对象1
        student02 s0 = new student02();

        //对象1调用成员变量 即属性
        s0.name="张三";
        s0.age=18;
        System.out.println(s0.name+s0.age);

        //对象1调用成员方法 即行为
        s0.eat();
        s0.doHomework();

        //创建对象2
        student02 s1 = new student02();

        //对象2调用成员变量 即属性
        System.out.println(s1.name); //虽然对象2和对象1对应同一个类 并且属性指向同一个变量名下 但是每创建一个对象都会生成一个内存地址
        // 这个内存地址就是这个对象对应的属性的地址 当多个对象指向同一个类中 属性名会一样 但是当调用的时候就需要单独赋值才能调用
        // 不是说对象1对属性进行了赋值的操作之后 对象2在调用的时候就会调用对象1对属性赋值后的数值

        s1.name="小明";
        s1.age=20;
        System.out.println(s1.name+s1.age);

        //方法调用
        s1.eat();
        s1.doHomework();
        //因为方法在类中有着固定的执行流程 所以多个对象指向同一个类的时候 那么方法也并将一样
    }
}

总结:

一个类单个对象时,会生成栈内存和堆内存。堆内存会生成一个包含类中的属性和方法的内存地址赋值给栈内存。而栈内存就包含一个变量名用于指向内存地址。在调用类中的属性和方法的时候就依照变量名对应的内存地址去找到对应的属性和方法

一个类多个对象时,不管有多少个对象,方法都是使用一样的,但是在属性这方面就是会创建不同的内存地址 每个对象都有对应的包含属性的内存地址。但是属性的变量名会一样。这就会出现当对象1对属性1进行赋值之后,对象2在调用属性1的时候不会调用出对象1赋值之后的数值,而是默认值

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值