编程语言
首页 > 编程语言> > Java中类和对象的分配机制

Java中类和对象的分配机制

作者:互联网

前言

上一篇的续集 Java对象在内存的布局
先看一段代码回答引出一问题:

class Dog
{
	int age ;
	String name ;
	String color ;
	
}
public class Object
{
	 public static void main(String[] args)
	 {
		Dog dog1 = new Dog();
		dog1.age = 3;
		dog1.name = "小黑";
		dog1.color = "黑色";
		Dog dog2 = dog1; //该语句执行时候发生了什么
	}
}

Dog dog2 = dog1; 该语句执行时候发生了什么?

首先一步一步的跟着我的思路走着先。(下面的过程会有图帮助理解)
1.先执行第一段代码:Dog dog1 = new Dog();

2.执行第二段代码: dog1.age = 3;

总结

Java中创建对象的流程分析:
1.先加载 类中的信息(只会加载一次)
2.在堆中开辟空间,执行默认初始化。
3.在栈中开辟一段空间存放对象,该对象指向堆空间。
4.给属性赋初始值。


接下来我出几道练习题问问你,是否真的懂了。

答:改变了,因为这两个对象 dog1 和 dog2 都指向同一段的内存空间,这样改变dog2的数据,就会改变dog1中的数据。

答:dog1.age = 5;dog2.age 会抛出异常,即无法输出。

有人可能会蒙圈了,怎么第一题不是说 dog1 和 dog2 都指向同一段的内存空间,那你既然给了dog2赋值为 null,那dog1肯定也是 null 啊。为啥会有 dog1.age = 5 ? 兄弟们,别急?听我慢慢给你解释解释。确实:dog1 和 dog2 都指向同一段的内存空间。但,有个问题dog1 和dog2 有啥关系呢?它们两个都是独立的空间,存放的东西都是独立的,当你执行 dog2 = null;的时候,只是dog2 指向了null,不指向堆空间的内容罢了,而人家 dog1依旧还是指向 堆空间的内容呀,你改变了dog2,人家dog1却没有变,人家不忘初心呀。自然而然就是dog2指向了null,都没有堆的内容了,肯定输出不了数据。


到此,大概你也理解了Java对象的分配机制了,感谢观看。

标签:Java,name,分配机制,age,Dog,null,dog2,中类,dog1
来源: https://blog.csdn.net/m0_46606290/article/details/117620901