关于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();

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

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

相关推荐
秋意钟6 分钟前
Spring新版本
java·后端·spring
椰椰椰耶8 分钟前
【文档搜索引擎】缓冲区优化和索引模块小结
java·spring·搜索引擎
mubeibeinv9 分钟前
项目搭建+图片(添加+图片)
java·服务器·前端
青莳吖10 分钟前
Java通过Map实现与SQL中的group by相同的逻辑
java·开发语言·sql
Buleall18 分钟前
期末考学C
java·开发语言
重生之绝世牛码20 分钟前
Java设计模式 —— 【结构型模式】外观模式详解
java·大数据·开发语言·设计模式·设计原则·外观模式
小蜗牛慢慢爬行26 分钟前
有关异步场景的 10 大 Spring Boot 面试问题
java·开发语言·网络·spring boot·后端·spring·面试
Algorithm157636 分钟前
云原生相关的 Go 语言工程师技术路线(含博客网址导航)
开发语言·云原生·golang
shinelord明1 小时前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
新手小袁_J1 小时前
JDK11下载安装和配置超详细过程
java·spring cloud·jdk·maven·mybatis·jdk11