- 子类在实例化的时候都会调用父类的构造方法
class Outer{ //父类
public Outer(){
System.out.println("父类的构造方法");
}
}
class Inner extends Outer{
public Inner(){
//super(); //子类会自动调用父类的构造方法
System.out.println("子类的构造方法");
}
}
class ListSetMap {
public static void main(String[] args) {
new Inner();
}
}
父类的构造方法
子类的构造方法
- 子类覆写的方法的访问权限不能比父类的严格
class Outer{
public Outer(){
System.out.println("父类的构造方法");
}
public void fun(){
}
}
class Inner extends Outer{
public Inner(){
super();
System.out.println("子类的构造方法");
}
default void fun(){ //此处缩小了权限
}
}
class ListSetMap {
public static void main(String[] args) {
new Inner();
}
}
结果报错
---------- 编译javac ----------
ListSetMap.java:13: 错误: 此处不允许使用修饰符default
default void fun(){
^
1 个错误
所以子类覆写的方法不能小于父类的权限
- 父类为 private的方法由子类用 default的方法不叫覆写
class Outer{
private void fun(){ //private权限
System.out.println("父类");
}
public void list(){ //调用方法来访问fun()
this.fun();
}
}
class Inner extends Outer{
public void fun(){ //子类扩大权限
System.out.println("子类");
}
}
class ListSetMap {
public static void main(String[] args) {
new Inner().list();
}
}
输出的结果
父类
也就是说此时子类并没有覆写父类的fun方法
这类似于属性的覆盖
class Outer{
public String name="我";
}
class Inner extends Outer{
public String name="你";
public void fun(){
System.out.println(super.name);
System.out.println(this.name);
}
}
class ListSetMap {
public static void main(String[] args) {
new Inner().fun();
}
}
输出结果
我
//父类的name
你
- 父类的属性可以被子类的同名属性覆盖——属性的覆盖
然而父类的属性并没有被子类重新定义的属性说覆盖,也就跟上面所说的方法一样。