美文网首页
java 域和静态方法 构造方法中调用覆写得方法

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

作者: laifrog | 来源:发表于2017-06-15 15:30 被阅读79次

    一个项目,好多人同时开发,开发完成后整个项目由我来维护,自己用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 域和静态方法 构造方法中调用覆写得方法

          本文链接:https://www.haomeiwen.com/subject/jkxuqxtx.html