zoukankan      html  css  js  c++  java
  • Java 对象内存分析

    一直对堆内存和栈内存搞不明白,最近看了一个视频,有了新的了解,在这里给大家分享一下

    对象内存与引用

    对象

    好多刚入门学习 Java 的人总是搞不清楚类和对象的关系,在这里简要说明一些。
    类:顾名思义,一类东西,比如女孩、男孩、人、狗狗,都是类(class),莹莹、小明、团团,则是对象(object)。
    也可以理解为对象是类的具体化(实例),类是泛指,对象是有具体指向。
    class Dog 中,Dog 是类

    public class Dog {
          public String color;
          public String name;
          public Integer age;
    }
    
    

    tuan = new Dog 中,tuan 是对象,是 Dog 类的实例,每个狗狗的名字,颜色、年龄,都不一样。

    tuan = new Dog();
    tuan->color = "white";
    tuan->name = "tuan";
    tuan->age = 3;
    

    这样我们就定义了一个完整的对象 tuan,可以看到,类只是定义了狗应该有的属性,名字,年龄,颜色,但是并没有说明是什么样的狗,对象则指向具体是哪只狗狗,狗狗名字是什么,年龄多少,颜色是什么。

    内存

    可以简单的理解一个电影院,有多少位置。比如有100个位置,则内存就是100。
    堆内存:保存对象的具体信息,比如:第三排,第三号的座位 C,则 C 的具体信息(座椅大小、材质、柔软度、颜色,能否调节),就保存在堆内存中
    栈内存:保存对象的位置,比如:第三排,第三号(位置为 33 号),则 33 号存储在栈内存中

    关系如上图,一个座位号对应一个座位。eg: public class Site{}, Site 是位置信息,c = new Site()。当我们 new 一个对象时,就会在堆内存中开辟一个空间,存储对象信息。比如,在电影院里3排3座放一个椅子,这个椅子叫做 c,他的位置是3排3号(电影票,在取票箱中),我们可以根据电影票找到对应的座椅。座椅是有属性的,c->size = 23,则对应的存储信息如下图:

    引用

    可以简单暴力的理解为引用对象的地址,即栈内存中的地址,比如:

    c = new Site();
    c->size = 23;
    // c1 引用 c 的地址
    c1 = c;
    // return c1->size; 输出: 23
    c1->size = 24;
    //return c->size; 输出: 24
    // 由于 c 和 c1 指向的都是同一个对象,因此改动之后都会变化
    

    内存垃圾

    c = new Site();
    d = new Site();
    d = c; // d 和 c 指向一个对象
    

    垃圾内存不能再被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉
    如下图:

    本文参考视频: Java 面向对象编程

  • 相关阅读:
    block、inline、inline-block
    js 的复制和引用 (传值和传址)
    俄罗斯方块和作品集
    js 连续赋值。。理解不了,先占坑
    8.7 jquery-dom manipulation
    08.04 对象构造方法
    对象的基本操作
    08.03 js _oop
    08.02 对象
    The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.
  • 原文地址:https://www.cnblogs.com/it-abel/p/14063964.html
Copyright © 2011-2022 走看看