关于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();
}
}
- 这时候,我们会发现,和上面是一样的方式,在堆和栈中也是相同的原理。
所以,这就是我们平时遇到的疑问,为什么我都是创建宠物类,但是创建出来的对象是不一样的,就是因为每创建一个对象,在堆里面都是一块单独的区域,所以是不相同的,可以根据模板,创建很多对象。