interface 和 extends 的使用衝突(附帶複習)
1.當多個介面有相同方法簽名,且在同一個實現類時
編譯器會出現報錯,如下:
class Pet implements Car,Animals{ // @Override // public void talk() { // Animals.super.talk(); // } } interface Animals{ default void talk(){ System.out.println("介面Animals-talk~~~~~~"); } } interface Car{ default void talk(){ System.out.println("介面Car-talk-------"); } }
一個實現類實現了多個介面,而多個介面中出現了方法簽名相同的預設方法時:
A:保留其中一個:介面名.super.方法名
B:也可以完全重寫
這裡B方法就不贅述了,完全重寫就ok
class Pet implements Car,Animals{ // 保留其中一個:介面名.super.方法名 @Override public void talk() { Animals.super.talk(); } } interface Animals{ defaultvoid talk(){ System.out.println("介面Animals-talk~~~~~~"); } } interface Car{ default void talk(){ System.out.println("介面Car-talk-------"); } }
完整程式碼:
package com.alex; /** * @Author Mr.Alex * @Date 2021/11/18 9:46 * @Version 1.0 */ public class Test01{ public static voidmain(String[] args) { Pet pet = new Pet(); pet.talk(); } } class Pet implements Car,Animals{ // 保留其中一個:介面名.super.方法名 @Override public void talk() { Animals.super.talk(); } } interface Animals{ default void talk(){ System.out.println("介面Animals-talk~~~~~~"); } } interface Car{ default void talk(){ System.out.println("介面Car-talk-------"); } }
2.當繼承的父類和介面衝突時
一個實現類既繼承父類,又實現介面,當父類中出現與介面的預設方法的方法簽名相同的方法:
A:預設遵循親爹原則,即保留父類的
B:也可以完全重寫
package com.alex; /** * @Author Mr.Alex * @Date 2021/11/18 10:31 * @Version 1.0 */ public class Test02 { public static void main(String[] args) { Pets pets = new Pets(); pets.talk(); } } class Pets extends Animal implements Cars{ } class Animal{ public void talk(){ System.out.println("父類Animals-talk~~~~~~"); } } interface Cars{ public default void talk(){ System.out.println("介面Car-talk-------"); } }
複習:
1、公共的靜態的常量:public static final
2、公共的抽象的方法:public abstract
非抽象的實現類必須重寫
3、公共的預設方法:public default,JDK1.8之後
使用“實現類的物件."進行呼叫
實現類可以選擇重寫
4、公共的靜態方法:public static, JDK1.8之後
只能使用”介面名.“進行呼叫
實現類不能重寫
5、私有的方法:private(private不能省略)JDK1.9之後
final:最終的
1、修飾類:不能被繼承
2、修飾方法:不能被重寫
-
-
子類雖會繼承父類私有(private)的成員,但子類不能對繼承的私有成員直接進行訪問,可通過繼承的get/set方法進行訪問。
結論:
(1)當父類的成員變數私有化時,在子類中是無法直接訪問的,所以是否重名不影響,如果想要訪問父類的私有成員變數,只能通過父類的get/set方法訪問;
(2)當父類的成員變數非私有時,在子類中可以直接訪問,所以如果有重名時,就需要加“super."進行區別。
1.@Override:寫在方法上面,用來檢測是不是有效的正確覆蓋重寫。這個註解就算不寫,只要滿足要求,也是正確的方法覆蓋重寫。建議保留
2.必須保證父子類之間方法的名稱相同,引數列表也相同。 3.子類方法的返回值型別必須【小於等於】父類方法的返回值型別(小於其實就是是它的子類,例如:Student < Person)。
注意:如果返回值型別是基本資料型別和void,那麼必須是相同
4.子類方法的許可權必須【大於等於】父類方法的許可權修飾符。 小擴充套件提示:public > protected > 預設 > private
5.幾種特殊的方法不能被重寫
-
靜態方法不能被重寫
-
私有等在子類中不可見的方法不能被重寫
-
final方法不能被重寫
-
所以子類是無法繼承父類構造方法的。
-
構造方法的作用是初始化例項變數的,而子類又會從父類繼承所有成員變數
所以子類的初始化過程中,必須先執行父類的初始化動作。子類的構造方法中預設有一個
super()
,表示呼叫父類的例項初始化方法,父類成員變數初始化後,才可以給子類使用。
結論:
子類物件例項化過程中必須先完成從父類繼承的成員變數的例項初始化,這個過程是通過呼叫父類的例項初始化方法來完成的。
-
super():表示呼叫父類的無參例項初始化方法,要求父類必須有無參構造,而且可以省略不寫;
-
super(實參列表):表示呼叫父類的有參例項初始化方法,當父類沒有無參構造時,子類的構造器首行必須寫super(實參列表)來明確呼叫父類的哪個有參構造(其實是呼叫該構造器對應的例項初始方法)
-
super()和super(實參列表)都只能出現在子類構造器的首行
外部類 | 成員變數 | 程式碼塊 | 構造器 | 方法 | 區域性變數 | |
---|---|---|---|---|---|---|
public | √ | √ | × | √ | √ | × |
protected | × | √ | × | √ | √ | × |
private | × | √ | × | √ | √ | × |
static | × | √ | √ | × | √ | × |
final | √ | √ | × | × | √ | √ |
abstract | √ | × | × | × | √ | × |
native | × | × | × | × | √ |
不能和abstract一起使用的修飾符?
(2)abstract和static不能一起修飾方法
(3)abstract和native不能一起修飾方法
(4)abstract和private不能一起修飾方法
static和final一起使用:
(1)修飾方法:可以,因為都不能被重寫
(2)修飾成員變數:可以,表示靜態常量
(3)修飾區域性變數:不可以,static不能修飾區域性變數
(4)修飾程式碼塊:不可以,final不能修改程式碼塊
(5)修飾內部類:可以一起修飾成員內部類,不能一起修飾區域性內部類