关于java创建对象内存分析

关于java创建对象内存分析

我们在前面的文章中,了解了类和对象,以及创建对象,给对象赋值等,我们本篇文章来进一步了解一下创建对象的时候,堆和栈的情况,以及对内存的分析😀

1、创建一个类

我们首先创建一个类,Pet宠物类。

  • 我们这里用public 去修饰属性,这样的权力范围大一些。
java 复制代码
public class Pet
{
    //无参构造
    
	public String name;//昵称
	
	public int age;//年龄
	
	public void shout()//方法
	{
		System.out.println(this.name+"叫了一声");
	}
}

我们还是应用之前创建好的Application类去实现宠物类的实例化。

java 复制代码
public class Application
{
	public static void main(String[] args)
	{
		Pet cat = new Pet();
		cat.name="图南";
		cat.age=3;
		System.out.println("宠物昵称:"+cat.name);
		System.out.println("宠物年龄:"+cat.age);
        cat.shout();
	}
}

2、内存分析

1、方法区
  • 我们编译后,首先在方法区里面,会加载Application这个类,这个类里面有一个方法叫做main方法。

  • Application中还有字符串,我们称之为常量池,比如刚刚我们赋值的图南🐱,就在常量池里面,但是int类型的age就不是常量了,因为它是数字,不是字符串。

  • 方法区中还有一块叫做静态方法区,静态方法static修饰,和类一起加载,这个类加载的时候,它就跟着加载。

2、栈
  • 我们执行main方法,将方法的时候,我们有提到过,main方法在栈的最下面,栈结束了,这个程序也就结束了。

  • 我们在创建对象的时候,会把Pet类加载到方法区,但是并没有值,只是加载了一个Pet模板。

java 复制代码
Pet cat = new Pet();
  • 当对象是cat的时候,在栈里面生成了引用变量cat。
3、堆
  • 真正的对象在堆里面,用Pet这个模板,在堆里面new了一个pet。
  • 将方法区中常量池的字符串赋值给new出的对象,然后把年龄也赋值进去,就得到了想要的结果😀。

  • 我们再来new一个dog🐶

java 复制代码
public class Application {
    public static void main(String[] args) {

        Pet cat = new Pet();
        Pet dog = new Pet();

        cat.name="图南";

        cat.age=3;

        System.out.println("宠物昵称:"+cat.name);
        System.out.println("宠物年龄:"+cat.age);

        cat.shout();

        dog.name="旺财";

        dog.age=3;

        System.out.println("宠物昵称:"+dog.name);
        System.out.println("宠物年龄:"+dog.age);

        dog.shout();

    }
}
  • 这时候,我们会发现,和上面是一样的方式,在堆和栈中也是相同的原理。

所以,这就是我们平时遇到的疑问,为什么我都是创建宠物类,但是创建出来的对象是不一样的,就是因为每创建一个对象,在堆里面都是一块单独的区域,所以是不相同的,可以根据模板,创建很多对象。

相关推荐
Hello eveybody7 分钟前
介绍一下背包DP(Python)
开发语言·python·动态规划·dp·背包dp
AI进化营-智能译站23 分钟前
ROS2 C++开发系列12-用多态与虚函数构建可扩展的ROS2机器人行为模块
开发语言·c++·ai·机器人
iCxhust27 分钟前
微机原理实践教程(C语言篇)---A002流水灯
c语言·开发语言·单片机·嵌入式硬件·51单片机·课程设计·微机原理
FQNmxDG4S43 分钟前
Maven依赖管理:版本冲突解决与生命周期控制
java·数据库·maven
莎士比亚的文学花园1 小时前
Linux驱动开发(3)——设备树
开发语言·javascript·ecmascript
图码1 小时前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
傻瓜搬砖人1 小时前
Spring集成Web环境
java·spring·maven
U盘失踪了1 小时前
python curl转python脚本
开发语言·chrome·python
charlie1145141911 小时前
Linux 字符设备驱动:cdev、设备号与设备模型
linux·开发语言·驱动开发·c
handler011 小时前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法