文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java 对象在 JVM 中的内存布局超详细解说

2024-04-02 19:55

关注

一、new 对象的几种说法

初学 Java 面向对象的时候,实例化对象的说法有很多种,我老是被这些说法给弄晕。

public class Test {
    public static void main(String[] args) {
        // 创建一个 ProgramLanguage 对象, 对象名是 java
        ProgramLanguage java = new ProgramLanguage();
        // 实例化一个 ProgramLanguage 对象, 对象名是 c
        ProgramLanguage c = new ProgramLanguage();
        // 把 ProgramLanguage 类实例化, 实例化后的对象的对象名是 python
        ProgramLanguage python = new ProgramLanguage();
    }
}

class ProgramLanguage {
    private Integer id;
    private String name;
}

下面的三种说法的操作都是实例化对象,只是说法不一样而已

二、Java 对象在内存中的存在形式

这里先简单看一看 Java 对象在内存中的存在形式和几个内存相关的概念,后面还会详细介绍的。先看下面的几个知识点:

1. 栈帧(Frame)

2. 对象在内存中的存在形式 ①

分析下面的代码的内存布局:

public class DogDemo {
    public static void main(String[] args) {
        Dog doggy = new Dog();
        doggy.age = 6;
        doggy.weight = 3.14;
    }
}

分析下面的代码的内存布局(稍微复杂)

public class Dog {
    public int price;
}
public class Person {
    public int age;
    public Dog dog;
}
public class Test {
    public static void main(String[] args) {
        Dog doggy = new Dog();
        doggy.price = 255;

        Person yeTing = new Person();
        yeTing.age = 20;
        yeTing.dog = doggy;
    }
}

3. 对象中的方法存储在那儿?

看下面的代码,思考对象中的方法存储在那儿?

public class Dog {
    public int price;

    public void run() {
        System.out.println(price + "_" + "run()");
    }

    public void eat() {
        System.out.println(price + "_" + "eat()");
    }
}
public class Test {
    public static void main(String[] args) {
        Dog dog1 = new Dog();
        dog1.price = 255;
        dog1.run();
        dog1.eat();

        Dog dog2 = new Dog();
        dog2.price = 552;
        dog2.run();
        dog2.eat();
    }
}

Java 虚拟机执行 Java 程序时会把内存划分为若干个不同的数据区域,主要包括:

4. Java 对象在内存中的存在形式 ②

String:

分析下面代码的内存布局:

public class Dog {
    String name;
    int age;
    String color;
}
public class DogDemo {
    public static void main(String[] args) {
        Dog doggy = new Dog();
        doggy.name = "笑天";
        doggy.age = 6;
        doggy.color = "黑";
    }
}

三、类中属性详细说明

下面详细说明一下类中【属性】这个概念。其实上篇文章已经能够很好理解,这里只是再补充一下而已。


public class Dog {
    public String name;
    protected int age;
    String color;
    private double weight;
}

如果不给对象的属性赋值,属性会有初始值


public class FiledInitialValueTest {
    private int score;
    private short age;
    private byte month;
    private long salary;
    private float height;
    private double pi;
    private char firstName;
    private boolean isTrueLove;
    private Person person;

    public static void main(String[] args) {
        FiledInitialValueTest test = new FiledInitialValueTest();
        System.out.println("\n若不给对象的属性赋值, 初始值如下所示:");
        System.out.println("score【int】 = " + test.score);
        System.out.println("age【short】 = " + test.age);
        System.out.println("month【byte】 = " + test.month);
        System.out.println("salary【long】 = " + test.salary);
        System.out.println("height【float】 = " + test.height);
        System.out.println("pi【double】 = " + test.pi);
        // 字符类型的属性的初始值是空串(在控制台无法看到)
        System.out.println("firstName【char】 = " + test.firstName);
        // 字符类型的属性的初始值强制类型转换为 int 后是【0】
        System.out.println("firstName【(int)char】 = " + (int) test.firstName);
        System.out.println("isTrueLove【boolean】 = " + test.isTrueLove);
        System.out.println("person【person】 = " + test.person);
    }
}

四、细小知识点

1. 如何创建对象

必须先有类(模板)才能创建对象

通过【new】关键字创建类的对象。【new】:向堆空间申请一块内存存储对象数据

public class TestCreateObject {
    public static void main(String[] args) {
        // (1) 先声明再创建
        Dog dog; // 声明 
        dog = new Dog(); // 通过 new 关键字创建对象

        // (2) 声明并创建对象 
        Dog doggy = new Dog();
    }
}

2. 如何访问属性

可通过【.】号访问属性或调用方法

可把 . 看做【的】、【の】

五、Exercise

看代码,画图:

public class Person {
    private int age;
    private String name;

    public static void main(String[] args) {
        Person yangJiaLi = new Person();
        yangJiaLi.age = 17;
        yangJiaLi.name = "杨嘉立";

        // 下面的一行代码有2种说法:
        // 1. 把 yangJiaLi 赋值给 yjl
        // 2. yjl 指向 yangJiaLi
        Person yjl = yangJiaLi;
        System.out.println(yjl.age); // 17
    }
}

六、总结

本篇文章的重点是第二节【Java 对象在内存中的存在形式】

需重点知道:

到此这篇关于Java 对象在 JVM 中的内存布局超详细解说的文章就介绍到这了,更多相关Java JVM 内存布局内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯