/*
以手机类为例,来理解一个内存的分配空间
*/
class Phone{
String brand;
int price;
String color;
public void call(String name){..}
public void playGame(){...}
}
class PhoneDemo{
public static void main(){
Phone p= new Phone();
p.brand="一加7";
p.price=2999;
p.color="红色";
p.call("虎哥");
p.playGame();
}
}
}
1.首先加载.两个class文件进入方法区,如图。
2.main方法入栈,然后执行语句Phone p=new Phone();
3.new对象创建之前,首先会去方法区找是否有对应的class文件,有,然后把class文件的成员变量拿到新创建的对象中。而方法不用拿,调用时,只需取出来用即可。
4.然后把成员变量赋值,
5.调用方法,通过地址调用去方法区找,调用的方法入栈
6.方法调用完毕,则从内存中消失,整个做完,最后main方法出栈,
问题:Phone p=new Phone();在程序中做了什么呢?
-
- 加载Phone.class文件进内存
- 在栈内存为p开辟空间
- 在堆内存为手机对象开辟空间
- 对手机对象的成员变量进行默认初始化
- 对手机对象的成员变量进行显示初始化
- 通过构造方法对手机对象的成员变量赋值
- 手机对象初始化完毕,把对象地址赋值给s变量
什么是默认初始化和显示初始化?
答:默认初始化是系统在堆内存创建一个新的对象时,进行的默认初始化,如null 和0
显示初始化是在类定义时,直接在各个成员变量的定义时,优先进行赋值,这叫显示初始化。