我遇到的这个小坑就是,在调用构造方法的时候,子类(派生类)重写了父类构造方法中的方法,会出现没有初始化值得问题。可能我描述的不是很清楚,直接上代码看得清晰一些。
父类
package cn.ALeeCJ.learningproject.JavaLearning;
import android.util.Log;
public abstract class ParentClass {
public ParentClass(){
Log.i("ALeeObj", "父类构造方法开始");
init();
Log.i("ALeeObj", "父类构造方法结束");
}
protected abstract void init();
public abstract void print();
}
子类
package cn.ALeeCJ.learningproject.JavaLearning;
import android.util.Log;
public class SonClass extends ParentClass {
private String sonStr1 = "sonStr1";
private String sonStr2 = "sonStr2";
public SonClass(){
Log.i("ALeeObj", "子类构造方法开始");
Log.i("ALeeObj", "son sonStr1: " + sonStr1);
Log.i("ALeeObj", "son sonStr2: " + sonStr2);
Log.i("ALeeObj", "子构造方法结束");
}
@Override
protected void init(){
Log.i("ALeeObj", "init sonStr1: " + sonStr1);
Log.i("ALeeObj", "init sonStr2: " + sonStr2);
}
public void print(){
Log.i("ALeeObj", "sonStr1: " + sonStr1);
Log.i("ALeeObj", "sonStr2: " + sonStr2);
}
}
测试类
package cn.ALeeCJ.learningproject.JavaLearning;
import cn.ALeeCJ.learningproject.BaseActivity;
import cn.ALeeCJ.learningproject.R;
public class JavaLearningView extends BaseActivity {
@Override
protected void setContentView(){
setContentView(R.layout.empty_layout);
}
@Override
protected void init(){
SonClass test = new SonClass();
test.print();
}
@Override
protected void addListener(){
}
}
测试结果
说明:
子类继承父类,如果重写了父类构造方法中包含的方法(如此次测试的init()方法),一定要注意,在子类中声明的变量(如此次测试的sonStr1和sonStr2),即使初始化了,仍会是默认值(此次为String类型,所以为null),如果子类声明的变量是和父类同名的变量,会以父类的为准。子类继承父类,只有重写方法有效,重写属性无效。在子类声明的变量,无论是否初始化了,在父类的构造方法阶段,都不能拿到子类声明的变量属性,只有执行到子类的构造方法,才能得到。因此一定要注意是不是做好空处理,不然就是崩溃问题。