JAVA程序运行时会发生什么,堆和栈:
方法和局部变量存储入栈
对象存储在可垃圾回收的堆(不同于局部变量,实例变量存储在对象中)
实例变量:Duck.size(类中的数据)
局部变量 i=x+3
对象的创建:
Pig myPig=new Pig();
上面这个语句从细节上分析有3步:
①声明一个Pig类型的引用 myPig
②通过new来为新的对象分配空间 随即调用Pig的构造函数---Pig()默认构造函数
③用"="将myPig引用与刚刚分配空间的新对象相互关联
构造函数:
public Pig(){}
//系统默认的构造函数
①构造函数理论上来讲都在创建对象的时候被调用
②构造函数与类名同名
③构造函数没有返回值
④构造函数可以被重载和覆盖(一旦自己写了构造函数,系统默认的构造函数就不会被调用,可以有多个不同参数的构造函数)
⑤对象是像洋葱一样有层次的,先调用父类的构造函数,再调用本身的构造函数。在子类中调用父类的构造函数要用super(..),
如果我们没调用super()编译器会替我们调用,不过如果父类的构造函数没有无参类型的,就要我们自己调用,见第⑥
⑥如果父类的构造函数被覆盖,而没有写无参的构造函数,父类的默认构造函数就不能被调用:
⑦构造函数可以是private私有的,可以在类的内部定义一个Pig getInstance(){ return new Pig(12);} 通过getInstance()来返回类规定的一个Pig对象。不细说
⑧可以用this(.)调用本类中其他的构造函数,但是不能与super()一起用
对象的存活时间(生命周期):
①局部变量只会存活在声明该变量的方法中
例
public void go(){
int i=2;
}
②实例变量(对象内部的变量)的寿命与对象相同
如果没有引用指向该对象的话(1.引用变量作为局部变量生命周期到了,2.引用换对象了,3.引用被直接赋值NULL),该对象就要等着被垃圾回收机回收(GC:garbage collector)
//对于被赋值为NULL的引用,用.调用方法会抛出异常NullPointerException
例
Pig a=new Pig(”p1“);//新建一个Pig对象name为p1,假设Pig类有个Pig(String n){ name=n;}构造函数,用引用a拴住
Pig b=new Pig(”p2“);//新建另一个Pig对象name为p2,用引用b拴住
a=b;//b应用把他指向的对象的地址拷贝给a,那么a就和b一起指向了p2
//不好了!( ⊙ o ⊙ )那p1不是没有引用拴住了嘛。。等死吧,垃圾收集器会来收它的