自学内容网 自学内容网

关于java创建对象内存分析

关于java创建对象内存分析

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

1、创建一个类

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

  • 我们这里用public 去修饰属性,这样的权力范围大一些。
public class Pet
{
    //无参构造
    
public String name;//昵称

public int age;//年龄

public void shout()//方法
{
System.out.println(this.name+"叫了一声");
}
}

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

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模板。

Pet cat = new Pet();

在这里插入图片描述

  • 当对象是cat的时候,在栈里面生成了引用变量cat。

在这里插入图片描述

3、堆
  • 真正的对象在堆里面,用Pet这个模板,在堆里面new了一个pet。

在这里插入图片描述

  • 将方法区中常量池的字符串赋值给new出的对象,然后把年龄也赋值进去,就得到了想要的结果😀。

  • 我们再来new一个dog🐶

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

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

在这里插入图片描述

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


原文地址:https://blog.csdn.net/SpringYang11/article/details/135620986

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!