面向对象编程(基础)3:对象的内存解析

news/2024/11/30 1:51:41/

目录

3.1 JVM内存结构划分

 3.2 对象内存解析

举例:

内存解析图:

面试题:对象名中存储的是什么呢?

3.3 练习


3.1 JVM内存结构划分

HotSpot Java虚拟机的架构图如下。其中我们主要关心的是运行时数据区部分(Runtime Data Area)。

其中:

堆(Heap)此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。这一点在Java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。

栈(Stack):是指虚拟机栈。虚拟机栈用于存储局部变量等。局部变量表存放了编译期可知长度的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它不等同于对象本身,是对象在堆内存的首地址)。 方法执行完,自动释放。

方法区(Method Area):用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

 3.2 对象内存解析

举例:

class Person { //类:人String name;int age;boolean isMale;
}public class PersonTest { //测试类public static void main(String[] args) {Person p1 = new Person();p1.name = "赵同学";p1.age = 20;p1.isMale = true;Person p2 = new Person();p2.age = 10;Person p3 = p1;p3.name = "郭同学";}
}

内存解析图:

说明:堆:凡是new出来的结构(对象、数组)都放在堆空间中。
对象的属性存放在堆空间中。
创建一个类的多个对象(比如p1、p2),则每个对象都拥有当前类的一套"副本"(即属性)。当通过一个对象修改其属性时,不会影响其它对象此属性的值。
当声明一个新的变量使用现有的对象进行赋值时(比如p3 = p1),此时并没有在堆空间中创建新的对象。而是两个变量共同指向了堆空间中同一个对象。当通过一个对象修改属性时,会影响另外一个对象对此属性的调用。

面试题:对象名中存储的是什么呢?

答:对象地址

public class StudentTest{public static void main(String[] args){System.out.println(new Student());//Student@7852e922Student stu = new Student();System.out.println(stu);//Student@4e25154fint[] arr = new int[5];System.out.println(arr);//[I@70dea4e}
}

直接打印对象名和数组名都是显示“类型@对象的hashCode值",所以说类、数组都是引用数据类型,引用数据类型的变量中存储的是对象的地址,或者说指向堆中对象的首地址。

3.3 练习

根据代码,画出内存图

class Car {String color = "red";int num = 4;void show() {System.out.println("color=" + color + ",num=" + num);}
}class CarTest {public static void main(String[] args) {Car c1 = new Car();   //建立对象c1Car c2 = new Car();   //建立对象c2c1.color = "blue";   //对对象的属性进行修改c1.show();   //使用对象的方法c2.show();}
}

http://www.ppmy.cn/news/39131.html

相关文章

使用ffmpeg生成测试视频和图片

要使用FFmpeg生成测试视频和图片,需要安装FFmpeg,并使用命令行工具执行相应的命令。 一、生成测试视频 创建一个测试视频源文件 test.mp4: ffmpeg -f lavfi -i testsrcduration5:size1280x720:rate30 test.mp4 上述命令可以生成一个时长…

Lambda表达式的使用

练习2: 定义一个接口(Flyable),里面定义一个抽象方法:void fly(String s); 定义一个测试类(FlyableDemo),在测试类中提供两个方法 一个方法是:useFlyable(Flyable f) 一个方法是主方法,在主方…

一图看懂 stat 模块:解析 stat() 结果, 资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创,转载请声明。 链接: https://blog.csdn.net/Ahcao2008 [TOC](一图看懂 stat 模块:解析 stat() 结果, 资料整理笔记(大全)) 摘要 全文介绍系统内置 stat 模块、函数、类及类的方法和属性。 它通过代码抓…

多线程之Thread常见的成员方法

String getName() 获取线程的名字 细节: 如果我们没有给线程设置名字,线程的默认名字是Thread-X(序号,从0开始) void SetName(String name) 设置线程的…

数据库及开发语言排行榜官网

目录 数据排行榜官网: 开发语言排行榜官网: 了解过软件开发的同学一定听说过数据库及开发语言排行榜,也在老师哪里看到过相关的截图,但是官网自己却一直找不到,下面就让博主把收集到的两个较为权威的官网分享给大家&…

Java重写(Override)重载(Overload)

目录 重写(Override)概述 重写(Override)讲解 重载(Overload)概述 重载(Override)讲解 重写(Override)概述 Java面向对象编程中的重写(override)指的是子类可以重写其父类中的非private方法,使得子类在调用该方法时会使用自己的实现而不是父类的实现。 重写(Override)…

169. 多数元素 ——【Leetcode每日一题】

169. 多数元素 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入:nums [3,2,3] 输出&…

C++11多线程:std::future的其他成员函数:wait_for(等待一定的时间)。

系列文章目录 文章目录系列文章目录前言一、wait_for()的用法二、使用步骤2.1 代码示例12.2 代码示例2总结前言 std::future的其他成员函数: std::future的用法:参考连接 https://blog.csdn.net/weixin_55491446/article/details/129695136?spm1001.20…