不算重零开始的java学习
第四篇
NO.1
从某个函数调用重载版的另一个函数
换句话说,当我们不想吧相同的代码放在每一个构造函数中,我们只需要一个构造函数能够实现代码,其他构造函数调用这个构造函数,这就需要使用到this。
this()只能在构造函数中引用,而且必须是第一行代码,同时每个函数都可以调用super()和this(),但不能同时调用
public Mini extends Car(){
Color color;
public Mini(){
this(Color.red);//调用真正的构造函数
}
public Mini(Color c){
super("Mini");//真正的构造函数
color = c;//初始化
}
public Mini(int size){
this(Color.red);
super(size);//error;
}
}
NO.2
对象的声明周期
之前有提到过对象的声明周期取决去对它的引用,如果引用没了,对象也自然狗带了
那么变量呢?
public class TestLifeOne{
public void read(){
int s = 42;
sleep();
}
public void sleep(){
s = 7;//error,s无法再sleep中使用
}
}
显然,存在于read()的范围中,sleep()无法使用,当read()执行完毕被弹出后,s自然也就被清除了。
而 实例变量情况就有所不同
public class life{
int size;
public void setSize(int s){
size = s;
}
}
当setSize()方法执行完毕后,s被清除。size仍然存在并可继续被使用。
当一个办法调用另一个方法时,第一个方法中的局部变量又在哪?
public void doStuff(){
boolean b = true;
go(4);
}
public void go(int x){
int z = x + 24;
crazy();
}
public void crazy(){
char c = 'a';
}
1、doSuff()运行在栈堆中,变量存活在scope里面
2、调用go(),x、z、b,但b不在范围中
3、调用crazy(),只用c在这个范围中
4、crazy()执行完毕,c被清除,范围中只有x、z
换句话说,只要goStuff还存在于栈堆中,b就会继续保持它的值,直到goStuff被推入栈顶才会被使用。
当最后一个引用变量消失,对象就会变得可回收。有三种方法可以释放对象的引用
void go(){
Life z = new Life();//z会在方法结束时消失
}
Life z = new Life():
z = new Life();//第一个对象会在z被赋值在别处时挂掉
Life z = new Life();
z = null//第一个对象会在z被赋值为null时被清除