Java 继承的一些重点

  • 子类在实例化的时候都会调用父类的构造方法
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

  • 父类的属性可以被子类的同名属性覆盖——属性的覆盖

然而父类的属性并没有被子类重新定义的属性说覆盖,也就跟上面所说的方法一样。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章