天天看點

java java面向對象-super應用場景和各種隐藏現象

20180313 java java面向對象-super應用場景和各種隐藏現象

什麼時候我們使用super關鍵字呢?

1、子類隐藏了父類的字段,該情況我們一般不讨論,因為子類隐藏了父類的字段,破壞了封裝。

eg:

class SuperClass{

public String name = "SuperClassName";

}

class SubClass{

  public int name = 18;//隐藏了父類的name

 public void doWork(){

    //System.out.println(name);//輸出 18

    System.out.println(super.name);//輸出"SuperClassName"

                                 //此時輸出的是父類的name

  }

}

2、在子類方法中,調用父類被覆寫的方法,參見 "java面向對象-子類初始化過程"文章(引出super的例子)。

3、在子類構造器中,調用父類構造器,此時必須使用super語句:super(實參)。

"隐藏"的概念:所謂隐藏就是遮蔽的意思,

1、滿足繼承的通路權限下,隐藏父類靜态方法:若子類定義的靜态方法的簽名和超類中的靜态方法簽名相同,那麼此時就是隐藏父類靜态方法。

eg:

class SuperClass{

public String name = "SuperClassName";

public static void cc(){} 

}

class SubClass{

  public int name = 18;

  public void doWork(){

     ...

  }

  public static void cc(){} //此函數隐藏了父類中的cc()方法。

}

注意:僅僅是靜态方法,且子類存在和父類一模一樣的靜态方法。

2、滿足繼承的通路權限下,隐藏父類字段,若子類中定義的字段和超類中的字段名相同(不管類型),此時就是隐藏父類自段,此時隻能通過super關鍵字通路被隐藏的字段;

3、隐藏本類字段,若不能類中的某局部變量和字段名相同,此時就是隐藏本類字段,此時隻能通過this通路被隐藏的字段。

eg:

class SuperClass{

public String name = "SuperClassName";

}

class SubClass{

  public int name = 18;

  public void doWork(){

    boolean name = false;

    System.out.println(name);//此時輸出 false,該處隐藏

                             //了SuperClass中的name和SubClass

                             //裡的int name。

  }  

}

繼續閱讀