java 域和静态方法 构造方法中调用覆写得方法

一个项目,好多人同时开发,开发完成后整个项目由我来维护,自己用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。子类不要覆写在父类构造方法中调用的方法(有点绕哈),如果非得调用的话,不建议访问子类的数据。访问子类域会造成空指针。

你可能感兴趣的:(java 域和静态方法 构造方法中调用覆写得方法)