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

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

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

相关推荐
Source.Liu4 分钟前
【用Rust写CAD】第二章 第四节 函数
开发语言·rust
monkey_meng4 分钟前
【Rust中的迭代器】
开发语言·后端·rust
余衫马7 分钟前
Rust-Trait 特征编程
开发语言·后端·rust
monkey_meng11 分钟前
【Rust中多线程同步机制】
开发语言·redis·后端·rust
七星静香12 分钟前
laravel chunkById 分块查询 使用时的问题
java·前端·laravel
Jacob程序员13 分钟前
java导出word文件(手绘)
java·开发语言·word
ZHOUPUYU13 分钟前
IntelliJ IDEA超详细下载安装教程(附安装包)
java·ide·intellij-idea
stewie617 分钟前
在IDEA中使用Git
java·git
小白学大数据19 分钟前
正则表达式在Kotlin中的应用:提取图片链接
开发语言·python·selenium·正则表达式·kotlin
VBA633721 分钟前
VBA之Word应用第三章第三节:打开文档,并将文档分配给变量
开发语言