下面请看一段代码,父类(基类)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([参数])只会被调用一次
多态执行问题
“成员变量,静态方法看左边(父类);非静态方法:编译看左边,运行看右边(子类)。”
多态的必要条件
- 要有继承
- 要有重写
- 父类引用指向子类对象