第一种方法:
先声明 再创建
Cat xiaobai ;//声明
xiaobai = new Cat();//分配空间
第二种方法:
声明创建一步到位
Cat xiaobai = new Cat();
当对象创建完毕斌且赋值后,在其他地方想要调用对象的属性需使用 对象名.属性名
列如:
xiaobai.name \xiaobai.age
(对象名+.+属性名)
现有以下代码:
Cat cat1 = new Cat();
cat1.name = “小明”;
cat1.age = 14;
Cat cat2 = cat1;
System.out.println(cat2.age);
最终输出的是14;
那么在内存中发生以下事情
由于上方是引用传递,跟数组一致,所以cat2指向的地址跟cat1是一样的对象
1- Cat cat1 = new Cat();
(1)在方法区加载了Cat类及属性信息和方法信息
(2)在栈创建了对象名cat1 在堆中创建了对象的空间里面有属性的默认值 并且把这个空间的地址给到cat1

2-cat1.name = “小明”;
cat1.age = 14;
Cat cat2 = cat1;
System.out.println(cat2.age);
(1)给cat1的属性进行赋值
(2)把cat1指向的地址复制一份给cat2
(3)输出cat2指向地址的成员变量

所以最终cat2输出的也是14
如果下面再增加这么一行
cat2.age =2;
System.out.println(cat1.age);
那么再输出就是 2 因为指向的空间是相同的 所以用cat2.age更改成员变量 用另一个对象名访问也是更改后的。
java内存结构分析
栈-存放基本数据类型(局部变量)
堆-存放对象,数组等
方法区-存放常量池,类加载信息
java创建对象的流程
Cat cat1 = new Cat();
cat1.name = "小明";
cat1.age = 14;
1-加载类信息(属性信息 方法信息)
2-在堆中分配空间,并进行默认初始化
3-将堆中空间的地址赋给cat1 ,也就是在栈中的对象名
4-进行自定义赋值
分析以下代码会输出什么
Cat cat1 = new Cat();
cat1.name = “小明”;
cat1.age = 14;
Cat cat2 = cat1;
System.out.println(cat2.age);//输出14
cat2.age = 23;//更改了空间的age变量
System.out.println(cat1.age);//输出23
cat2=null;//清空cat2的地址,此时cat2不指向任何地方
System.out.println(cat2.age);//曝出异常
当cat2=null;在内存中cat2就断开了指向内存空间的对象,因此他就没有任何属性可以输出了
在内存中表示为:
