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

  • 父類的屬性可以被子類的同名屬性覆蓋——屬性的覆蓋

然而父類的屬性並沒有被子類重新定義的屬性說覆蓋,也就跟上面所說的方法一樣。

 

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