若父类重写了自身的构造器,并且还实现了自己的方法,那么,当子类继承父类后,重写自身的构造器和重写父类的其他方法时,搭配
super()
或者super.method()
时候,会出现什么现象呢?
先看构造器
public class Checket extends Base {
public Checket() {
super();// 位置1
System.out.println("Checket");
super();// 位置2
}
public static void main(String[] args) {
Checket checket = new Checket();
}
}
class Base {
public Base() {
System.out.println("Base");
}
}
第一眼看过去:
- 子类
Checket
继承了父类Base
- 父类重写了构造器(PS:若类的无参构造用不到的话,重写构造器后,可以不写无参构造)
- 子类重写了自身的构造器,而且可以看到上面代码好像对
super()
有点事情要干
疑问来了:
- 首先考虑,如果我要加
super()
的话,位置1,位置2都无所谓的吗? - 如果不写
super()
的话,和写super()
并且写在正确的位置上,有区别吗?
解答:
- 如果写
super()
的话,super()
只能放在位置1,放在位置2,则编译不通过 - 构造器里面,不写
super()
和写super()
没区别
u say a jb without picture 无图言屌,下面上图:
可以看到,IDEA
上面提示了:在构造器方法体内,必须在第一条语句调用super()
也就是说,子类重写构造器,要么不调用super()
,要么就第一句就调用super()
,写在第一行!
打印结果:
写不写super()
,打印结果都一样:
Base
Checket
继续,如果你子类Checket
只有一个无参构造器(或者不写,默认),打印结果如下:
只打印父类构造器内容,子类构造不写,就没有东西,不打印呗
Base
再看重写父类方法
我们知道,在使用eclipse
或者IDEA
等IDE
时候,子类重写父类方法是,第一条语句都会自动生成super.methodName()
package com.ggsddu.test;
/**
* @author zhouk
* @date 2018/05/18
*/
public class Checket extends Base {
public Checket() {
// super();
System.out.println("Checket")
}
@Override
public void sayHi() {
super.sayHi();// 放在这里,编译、运行都是OK的
System.out.println("say hi from Checket");
super.sayHi();// 放在这里,编译、运行都是OK的
}
public static void main(String[] args) {
Checket checket = new Checket();
checket.sayHi();
}
}
class Base {
public Base() {
System.out.println("Base");
}
public void sayHi() {
System.out.println("say hi from Base");
}
}
如上面代码所示:
super.methodName()
放在重写方法方法体的哪个位置都是可以的,和一般语句没差。
所以,你写,那就打印父类方法的,不写,那就不打印。
本次实际代码,重写sayHi
方法代码如下:
@Override
public void sayHi() {
System.out.println("say hi from Checket");
super.sayHi();
}
结合上面子类重写自身构造器,打印结果为:
Base
Checket
say hi from Checket
say hi from Base
此处,也有图。