1. 程式人生 > 實用技巧 >Java日誌第19天 2020.7.24

Java日誌第19天 2020.7.24

介面中的注意事項

1.介面中不能有靜態程式碼塊和構造方法

2.一個類的直接父類是唯一的,但可以實現多個介面

3.實現類實現的多個介面中有重複的方法,只需要覆蓋重寫一次即可。

4.如果實現類沒有實現該類所有介面的所有方法,則該類是抽象類。

5.如果實現類實現的多個介面中存在重複的預設方法,那麼實現類一定要對衝突的預設方法進行覆蓋重寫

6.一個類如果直接父類中的方法和介面中的預設方法產生衝突,優先使用父類中的方法。

介面與介面之間是多繼承的

public interface MyInterfaceA {

    public abstract void methodAbs();

    public
default void methodDefault(){ System.out.println("重複預設方法"); } }
public interface MyInterfaceB {

    public abstract void methodAbs();

    public default void methodDefault(){
        System.out.println("重複預設方法");
    }
}
public interface MyInterface extends MyInterfaceA, MyInterfaceB{

    @Override
    
void methodAbs(); @Override default void methodDefault() { System.out.println("覆蓋重寫重複預設方法"); } }

父介面中預設方法重複,子介面必須進行方法覆蓋重寫。

多型性

extends和implements是多型性的前提

程式碼中多型性的體現,其實就是父類引用指向子類物件

格式:父類名稱 物件名 = new 子類名稱();

或者 介面名稱 物件名 = new 實現類名稱();

訪問方法:new的是誰就呼叫誰,沒有則向上找

訪問變數:等號左邊是誰就呼叫誰,沒有則向上找

物件的向上轉型

其實就是多型的寫法

格式: 父類名稱 物件名 = new 子類名稱()

含義 預測建立一個子類物件,當做父類使用

注意事項 向上轉型一定要是安全的

public abstract class Animal {

    public abstract void eat();

}

public class Cat extends Animal {

    public void eat(){
        System.out.println("貓吃魚");
    }

}

public class Test {
    public static void main(String[] args) {

        //向上轉型
        Animal animal = new Cat();
        animal.eat();
    }
}

結果如下

物件的向上轉型

向上轉型後的物件不能呼叫子類特有的方法,如果想要呼叫這些方法,就需要物件的向下轉型。物件的向下轉型就是一個還原的動作。

格式:子類名稱 物件名 = (子類名稱)父類物件

含義 將父類物件還原為本來的子類物件

public class Cat extends Animal {

    public void eat(){
        System.out.println("貓吃魚");
    }

    public void catchMouse(){
        System.out.println("貓抓老鼠");
    }

}
public class Test {
    public static void main(String[] args) {

        //向上轉型
        Animal animal = new Cat();
        animal.eat();
//      animal.catchMouse();//報錯!不能這樣呼叫

        //進行向下轉型
        Cat cat = (Cat) animal;
        cat.catchMouse();
    }
}

instanceof關鍵字

物件名 instanceof 類名稱

返回的是布林值,判斷物件能否當做類的例項

public class Test {
    public static void main(String[] args) {

        //向上轉型
        Animal animal = new Cat();
        animal.eat();
//      animal.catchMouse();//報錯!不能這樣呼叫

        //進行向下轉型
        //判斷能否向下轉型後再進行
        if(animal instanceof Cat){
            Cat cat = (Cat) animal;
            cat.catchMouse();
        }
        
    }
}