zoukankan      html  css  js  c++  java
  • 继承条件下的构造方法调用

    (一)为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来?

    答案:java 自动在派生类构造器中插入基类构造器运行,例如

    class A {   
        A() { System.out.println("A constructor"); }   
    }   
       
    class B {   
        B() { System.out.println("B constructor"); }   
    }   
       
    public class C extends A {   
        B b = new B();   
        public static void main(String[] args) {   
            C c = new C();   
        }   
    }  

     那么,是不是可以认为基类构造器调用是派生类构造器的第一条语句,从而在派生类构造器调用的时候才调用呢?

    然而结果是:A constructor     B constructor  

    由此可见:基类的初始化发生在派生类的初始化(包括自动初始化、构造器等等)之前。,而是无参数时

    (二)通过 super 调用基类构造方法,必须是子类构造方法中的第一个语句。调用基类中含“参数”的构造器时

    class Grandparent {
    
        public Grandparent() {
            System.out.println("GrandParent Created.");
        }
    
        public Grandparent(String string) {
            System.out.println("GrandParent Created.String:" + string);
        }
    }
    
    class Parent extends Grandparent {
    
        public Parent() {
            super("Hello.Grandparent.");
            System.out.println("Parent Created");
           // super("Hello.Grandparent.");
        }
    }
    
    class Child extends Parent {
    
        public Child() {
            System.out.println("Child Created");
        }
    }
    

     但是结果GrandParent Created.String:Hello.Grandparent.(参数)


    Parent Created
    Child Created虽然你spuer("Hello.Grandparent")位于派生类的第一句,但是总之一句话,未显式调用基类构造器的情况下,编译器就查找基类的默认构造器,找不到报错;找到,加入对它的调用。基类没有默认构造器,就必须显式调用。基类的初始化发生在派生类的初始化(包括自动初始化、构造器等等)之前。

  • 相关阅读:
    【mysql优化1】表的优化与列类型选择
    mysql 各数据类型的 大小及长度
    android如何建立数据库。(如何重写SQLiteOpenHelper)
    PHP中统计目录中文件以及目录中目录的大小
    如何下载coursera视频
    JAVAEE filter总结
    zookeeper安装
    如何从硬盘安装fedora 19 (How to install fedora 19 from hard drive, Fedora-19-i386-DVD.iso)
    WCF 项目应用连载[3]
    POJ1184-------操作分离的BFS
  • 原文地址:https://www.cnblogs.com/gdp176119/p/4942244.html
Copyright © 2011-2022 走看看