一文彻底搞定 java 对象内存模型

揭开java 对象在内存中的面纱

在这里插入图片描述

前情提示:

堆中的 java 对象只有数据部分,对象中的数据的含义要结合方法区中的class 才能明了

对象的内存结构图:

在这里插入图片描述

延伸:二维数据对象的内存结构!

使用 jhsdb hsdb 工具查看真实地址中的 java对象

在这里插入图片描述

在这里插入图片描述

注意:java 虚拟机为了节约内存,对堆内存中的对象的对象属性地址都进行了压缩

class 指针地址在前补一位8
即为真实地址:如 0x00c00a00 => 0x800c00a00

对象地址则左移 3位:0x e2b6 1148 => 0x 7 15B0 8A40

java 对象的类对象、静态变量到底存放在哪块地址

1)、类对象(Class 对象):

在这里插入图片描述

  • 存储在堆中
  • 静态变量:紧挨着类对象

2)、类的字节码:

Student.java => student.class() => JVM (方法区

  • 通过类对象可以间接访问类的字节码
  • 类的字节码读到内存之后会被封装为一个c++ 对象 (klass 类型)

类的字节码在jhsdb 中的真容:

class Student {
    public static int count = 0x777;
    private static String crissy = "crissy";
    int id;
    String name;

    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public Student() {
    }

    public String myFun() {
        return crissy;
    }
}

在这里插入图片描述

java 对象的六种创建方式

public class CrissyMain {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, CloneNotSupportedException {
        /**
         * java 对象的六种创建方式
         */

        //TODO 1. new 创建对象
        System.out.println("new 创建对象:");
        Student student = new Student(100, "hui");
        System.out.println("hashCode:"+student.hashCode());
        System.out.println(student);

        //TODO 2. 通过反射创建对象
        System.out.println("通过反射创建对象:");
        Constructor<Student> constructor = Student.class.getDeclaredConstructor(int.class, String.class);
        Student student1 = constructor.newInstance(101, "crissy");
        System.out.println("hashCode:"+student1.hashCode());
        System.out.println(student1);

        //TODO 3. 克隆对象  --前提是该类需实现 Cloneable 接口并 重新 clone() 方法 《浅克隆并且不会调用构造方法》
        System.out.println("通过克隆创建对象:");
        Student student2 = (Student) student1.clone();
        System.out.println("hashCode:"+student2.hashCode());
        System.out.println(student2);

        //TODO 4. 反序列化创建对象  -- 前提是该类需实现 Serializable 接口
        System.out.println("通过反序列化创建对象:");
        Student student3 = (Student) SerializeUtil.deserialize(SerializeUtil.serialize(student1));
        System.out.println("hashCode:" + student3.hashCode());
        System.out.println(student3);

        //TODO 5.MethodHandle API
        System.out.println("通过MethodHandle API创建对象:");
        MethodHandle methodHandle = MethodHandles.lookup().
                findConstructor(Student.class, MethodType.methodType(void.class, int.class, String.class));
        Student student4 = (Student) methodHandle.invoke(200, "----crissy");
        System.out.println("hashCode:" + student4.hashCode());
        System.out.println(student4);
        
        //TODO 6.通过Unsafe API创建对象 (略---java包找不到它的API 了)
    }
}

class Student implements Cloneable, Serializable {
    public static int count = 0x7777_8888;
    private static String crissy = "crissy";
    int id;
    String name;

    public Student(int id, String name) {
        this.id = id;
        this.name = name;
        System.out.println("---全参构造方法被调用");
    }

    public Student() {
        System.out.println("---无参构造方法被调用");
    }

    public String myFun() {
        return crissy;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    @Override
    public String toString() {
        return "{ id:" + this.id +
                ", name:" + this.name +
                "}";
    }
}


输出结果:
new 创建对象:
---全参构造方法被调用
hashCode:584634336
{ id:100, name:hui}
通过反射创建对象:
---全参构造方法被调用
hashCode:2052001577
{ id:101, name:crissy}
通过克隆创建对象:
hashCode:1160264930
{ id:101, name:crissy}
通过反序列化创建对象:
hashCode:1555845260
{ id:101, name:crissy}
通过MethodHandle API创建对象:
---全参构造方法被调用
hashCode:1761291320
{ id:200, name:----crissy}
通过Unsafe API创建对象:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它将数据和操作封装在对象中,通过对象之间的交互实现程序的设计和开发。下面是一些关键概念,帮助你更好地理解Python面向对象编程。 1. 类(Class):类是对象的蓝图或模板,描述了对象的属性和行为。它定义了对象的特征和方法。例如,我们可以定义一个名为"Car"的类来表示汽车,其中包含属性(如颜色、型号)和方法(如加速、刹车)。 2. 对象(Object):对象是类的实例,是具体的实体。通过实例化类,我们可以创建一个对象。例如,我们可以创建一个名为"my_car"的对象,它是基于"Car"类的实例。 3. 属性(Attribute):属性是对象的特征,用于描述对象的状态。每个对象都可以具有一组属性。例如,"Car"类的属性可以包括颜色、型号等。 4. 方法(Method):方法是对象的行为,用于定义对象的操作。每个对象都可以具有一组方法。例如,"Car"类的方法可以包括加速、刹车等。 5. 继承(Inheritance):继承是一种机制,允许我们创建一个新类(称为子类),从现有类(称为父类)继承属性和方法。子类可以扩展或修改父类的功能。继承可以实现代码重用和层次化设计。 6. 多态(Polymorphism):多态是一种特性,允许不同类的对象对同一方法做出不同的响应。多态提高了代码的灵活性和可扩展性。 7. 封装(Encapsulation):封装是一种将数据和操作封装在对象中的机制,隐藏了对象的内部实现细节,只暴露必要的接口给外部使用。这样可以保护数据的安全性,提供了更好的模块化和代码复用性。 通过理解这些概念,你可以更好地掌握Python面向对象编程。在实践中,你可以使用类来创建对象,操作对象的属性和调用对象的方法,通过继承和多态实现代码的灵活性和可扩展性,通过封装保护数据的安全性和提高代码的可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值