一个项目,好多人同时开发,开发完成后整个项目由我来维护,自己用Android studio的分析工具分析整个项目的代码,发现一个问题,在构造方法中不建议调用override的方法,涉及到构造方法调用顺序问题,顺便找了一下百度哥,发现网上有例子有解释,但是发现,坑爹啊,自己不实践一把真不知道有多少坑。
比如 Java 父类构造函数中调用子类重写的方法
我觉的整体分析没问题,但是总感觉少点啥。
public class Class1 {
{
System.out.println("父类Class1代码块");
}
static{
System.out.println("父类Class1静态代码块");
}
String a="父类变量a";
public Class1(){
System.out.println("父类class1 构造方法");
print();
}
public void print(){
System.out.println("print() 父类class1-->"+a);
}
}
public class SubClass1 extends Class1 {
{
System.out.println("子类SubClass1代码块");
}
static{
System.out.println("子类SubClass1静态代码块");
}
String a="子类变量a";
public SubClass1(){
System.out.println("子类subclass1 构造方法");
System.out.println("子类subclass构造方法 -->"+a+" 父类super.a"+super.a);
}
public void print(){
System.out.println("print() 子类subclass -->"+a+" 父类super.a"+super.a);
super.print();
}
}
public class Test {
/**
* @param args
*/
public static void main(String[] args){
new SubClass1();
}
}
输出:
父类Class1静态代码块
子类SubClass1静态代码块
父类Class1代码块
父类class1 构造方法
print() 子类subclass -->null 父类super.a父类变量a
print() 父类class1-->父类变量a
子类SubClass1代码块
子类subclass1 构造方法
子类subclass构造方法 -->子类变量a 父类super.a父类变量a
分析:
根据输出结果,父类子类的执行顺序大家一目了然,出现为null 不光是因为执行顺序的问题,还有访问变量是this.a 与super.a 的区别,在Class1和SubClass1中总共有两个a 域。这种情况下就需要指明到底访问的是this 还是super。子类不要覆写在父类构造方法中调用的方法(有点绕哈),如果非得调用的话,不建议访问子类的数据。访问子类域会造成空指针。
网友评论