Java 继承(子类构造函数重载的问题)

下面请看一段代码,父类(基类)SuperClass,子类(派生类)SubClass

class SuperClass {
    private int n;        
    SuperClass(int n) {
        System.out.println("SuperClass(" + n + ")");
    }    
}

class SubClass extends SuperClass {
    private int n;
    SubClass() {
        super(300)
        System.out.println("SubClass()");
    }  
    SubClass(int n) {
        System.out.println("SubClass(" + n + ")");
    }
}

public class TestSuperSub {
    public static void main(String args[]) {
        SubClass s = new SubClass();
    }
}

上面这里,我们在main里面实例化了SubClass,且构造函数没有传参,请问编译的时候会不会出错?

答案:
编译会出错,由于在子类中,重载的构造方法里面,没有显式调用父类的构造方法,
所以系统会默认去调用父类的无参数构造方法,由于父类没有定义无参数构造方法,所以编译会报错

由于编译器在编译过程中是静态编译的,所有的代码都会检查一遍是否有语法上的错误

而写了太多javascript的我刚开始的时候,以解释形的过程去理解,搞不清楚为什么会报错,真的是有毒



关于在构造方法中,调用super([参数]),this([参数])

需要注意的是,在构造方法中

  • super([参数])只能在第一行
  • this([参数])只能在第一行

所以在构造方法第一行中,调用super,就不能再调用this; 反之 调用了this,就不能再调用super

class SuperClass {
    private int n;        
    SuperClass(int n) {
        System.out.println("SuperClass(" + n + ")");
    }    
}

class SubClass extends SuperClass {
    private int n;

    SubClass() {
        this(300);
        System.out.println("SubClass()");
    }  

    SubClass(int n) {
        super(n);
        System.out.println("SubClass(" + n + ")");
    }
}

public class TestSuperSub {
    public static void main(String args[]) {
        SubClass s = new SubClass();
    }
}

从main进来,SubClass实例化.调用的是无参数的构造方法
然而在无参数的构造方法中,第一行调用的this(300),此时就不会再隐式调用super()了
而是进入SubClass另外的构造函数,在这里才会实例化父类SuperClass的对象

得出结论: 父类的对象只会被实例化一次,也就是super([参数])只会被调用一次



多态执行问题

“成员变量,静态方法看左边(父类);非静态方法:编译看左边,运行看右边(子类)。”

多态的必要条件

  • 要有继承
  • 要有重写
  • 父类引用指向子类对象
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章