先上代码
public class Test extend TestParent {
Runnable mRun = new Runnable(){
public void run(){
System.out.println("运行Runnable接口");
}
}
public Test(){
super();
//do somethings...
}
@Override
public void action(){
new Thread(mRun).start();
System.out.println("运行action方法");
}
}
public abstract class TestParent {
public TestParent(){
action();
}
public abstract void action();
}
按照上面这种写法。。。Test被实例化的时候,mRun接口是不会被运行的。。。因为此时的mRun还是一个“空”对象。
mRun是Test类的成员变量,action方法是父类的抽象方法,而且在父类的构造方法中被执行了,注意这个时间点,父类的构造方法都没有走完,那就更不可能构造好子类,此时作为子类成员变量的mRun也没有被加载好,所以此时运行action方法就会导致mRun无法被执行。。。但是也不会报错。。。就好像从来没有运行过一样。。。这就是写代码时的坑呀。。。