7天學完Java基礎之5/7


接口

接口就是一種公共的規范標准 是一種引用數據類型

定義格式

public interface 接口名稱{}

java7 中接口可以包含常量,抽象方法;Java8 還可以額外包含默認方法,靜態方法;Java 9 還可以額外包含私有方法

public interface MyInterfaceAbstract{
    //這是一個抽象方法
    public abstract void methodAbs();
    //接口中的抽象方法,修飾符必須是兩個固定的關鍵字:public abstract
    //這兩個關鍵字可以選擇性的省略
    abstract void methodAbs2();
    public void methodAbs3();
    void methodAbs4();
    
}

接口的抽象方法使用

接口使用步驟:

  1. 接口不能夠直接使用,必須有一個“實現類”來實現該接口

    格式:

    public class 實現類名稱 implements 接口名稱{}

  2. 接口的實現類必須覆蓋重寫接口中所有的抽象方法

  3. 創建實現類對象(new),進行使用

//按照定義格式定義一個接口
//public interface 接口名稱{}
public interface InterfaceDemo {
    //接口里面可以有抽象方法,普通方法
    //定義一個抽象方法
    public abstract void methodAbs1();
    //默認方法
    public abstract void methodAbs2();

}
public class InterfaceDemoImpl implements InterfaceDemo{
    //回顧一些重寫的概念
    //方法名和形參列表一樣
    //權限修飾符必須大於或者等於父類的權限修飾符
    //子類的返回值類型必須小於或者等於父類的返回值類型
    @Override
    public void methodAbs1() {
        System.out.println("天下武功,唯快不破");
    }

    @Override

    public void methodAbs2() {
        System.out.println("認真的人,自帶光芒");
    }

}
public class newInterfaceDemo {
    public static void main(String[] args){
        InterfaceDemoImpl inter = new InterfaceDemoImpl();
        inter.methodAbs1();
        inter.methodAbs2();
    }
}
注意事項

如果實現類並沒有覆蓋重寫接口中的所有的抽象方法,那么這個實現類就必須是抽象類

接口的默認方法定義
public interface InterfaceDemo {
    /*
    java 8開始,接口允許定義默認方法
    格式:
    public default 返回值類型 方法名稱(參數列表){
    方法體
    }
    備注:接口當中的默認方法,可以解決接口升級的問題
    默認方法可以有方法體
     */
    public abstract void methodAbs1();

    public default void methodAbs2(){
        System.out.println("我是默認方法,可以解決升級問題");
    }
public class InterfaceDemoImpl implements InterfaceDemo{
    @Override
    public void methodAbs1() {
        System.out.println("天下武功,唯快不破");
    }
    //我在這里並沒有重寫public default void methodAbs2()
    //實現接口自動繼承方法
}

public class newInterfaceDemo {
    public static void main(String[] args){
        InterfaceDemoImpl inter = new InterfaceDemoImpl();
        //接口的默認方法也是可以覆蓋重寫的
        //這里就不寫了
        inter.methodAbs1();
        inter.methodAbs2();
    }
}
接口的靜態方法的定義
/*
格式
public static 返回值類型 方法名稱(參數列表){}

 */
public interface InterfaceStatic {
    public static void method1(int a,int b){
        System.out.println("今天要敲"+a*b+"行代碼");
    }
}
public class InterfaceStaticImpl {
    //接口中的靜態方法的使用
    public static void main(String[] args) {
        //直接通過接口名稱.靜態方法的名稱調用即可
        InterfaceStatic.method1(15,67);
    }
}
接口的私有方法定義
/*
問題描述:
我們需要抽取一個共有方法,用來解決兩個默認方法之間重復代碼的問題
但是這個共有方法,不應該被是實現類使用,應該私有化的

解決方案
從Java 9 開始,接口當中允許定義私有方法
1.普通私有方法,解決多個默認方法之間重復代碼問題
格式
private 返回值類型 方法名稱(參數列表){}
2.靜態私有方法,解決多個靜態方法之間重復代碼問題
    格式:
    private static 返回值類型 方法名稱(參數列表){}
 */
    public interface InterfaceStatic {
        public default void method1(){
            System.out.println("認真的人,自帶光芒");
            method3();
        }
        public default void method2(){
            System.out.println("作日的最佳表現,是今日的最低要求");
            method3();
        }
        private void method3(){
            System.out.println("乘風破浪會有時,直掛雲帆濟滄海");
        }
}
public class InterfaceStaticImpl implements InterfaceStatic{
    public static void main(String[] args) {
        InterfaceStaticImpl inter = new InterfaceStaticImpl();
        inter.method1();
        inter.method2();
        //接口中的靜態方法的使用
        //想要使用接口的方法,必須要實現接口
        //實現完接口后,需要new對象使用
    }

}
接口的常量定義和使用

1.接口當中的常量,可以省略public static final ,注意,不寫也照樣是這樣

  1. 接口當中的常量,必須進行復制,不賦值不能使用

  2. 接口當中的常量名稱,使用完全大寫的字母,用下划線進行分割

使用格式

接口名稱.常量名稱

多態

多態的前提:extends繼承或者Implements實現,

一個對象擁有多種形態,這就是:對象的多態性

代碼當中體現多態性:父類引用指向子類對象

多態格式

父類名稱 對象名 = new 子類名稱();

或者

接口名稱 對象名= new 實現類名稱();

多態中成員變量的使用特點

//訪問成員變量的兩種方式
//1.直接通過對象名稱訪問成員變量:看等號左邊是誰,優先用誰,沒有向上找
//2.間接通過成員方法訪問
public class Fu {
    //子類也有相同的成員變量num
    int num = 10;

    public void shownum(){
        System.out.println(num);
    }
}
public class Zi extends Fu{
    //與父類相同的成員變量num
    int num = 20;
    //子類特有的成員變量
    int num1 =30;
    //重寫方法
    @Override
    //重寫了父類的方法,
    public void shownum(){
        System.out.println(num);
    }
}

public class Demo01MultiField {
    public static void main(String[] args) {
        //使用多態的寫法,父類引用指向子類對象
        Fu obj  = new Zi();
        //等號左邊是Fu,優先使用左邊的的成員變量,沒有則向上找
        System.out.println(obj.num);//10
        //不可能向下找
        //System.out.println(obj.num1);編譯報錯

        //shownum屬於Fu,則使用Fu的成員變量//10
        //當子類覆蓋重寫父類,就屬於Zi類//20
        obj.shownum();
    }
}

多態中成員方法的使用特點

public class Fu {
    //成員方法的訪問規則
    //看new的是誰,就優先用誰,沒有則向上找
    public void method(){
        System.out.println("我是父類");
    }
    public void methodFu(){
        System.out.println("我是父類特有方法");
    }
}
public class Zi extends Fu{
    public void method(){
        System.out.println("我是子類");
    }
    public void methodZi(){
        System.out.println("我是子類特有方法");
    }
}

java

public class Demo01MultiField {
    public static void main(String[] args) {
       Fu obj  = new Zi();//多態
       obj.method();// 父子都有,new的是zi,優先用zi  //輸出結果我是子類
       obj.methodFu();//子類沒有,向上找,           //輸出結果我是父類特有方法
    }
}

多態中成員變量訪問規則和成員方法訪問規則總結

成員變量:看左邊,左邊是哪一個類就優先使用哪一個類。沒有像上找

成員方法:看右邊,new的是哪一個對象就優先使用哪一個對象的方法。沒有向上找

對象的向上轉型

  1. 對象的向上轉型,其實就是多態的寫法

    格式 父類名稱 對象名 = new 子類名稱();

    含義:右側創建一個子類對象,把他當作父類來看待使用

    Animal animal = new Cat();創建了一只貓,當作動物看待

注意事項:向上轉型一定是安全的從小范圍(貓)轉成大范圍(動物)

對象的向下轉型

對象的向下轉型,其實是一個還原的動作

格式:子類名稱 對象名 = (子類名稱)父類對象;

含義,將父類對象,還原成本來的子類對象

Animal animal = new Cat();//本來是貓,向上轉型成為動物
Cat cat = (cat) animal;//本來是貓,已經被當成動物了,還原回來成為本來的貓向下轉型;

instanceof關鍵字進行類型判斷

格式:

對象 instanceof類名稱

這將會得到一個Boolean值結果,也就是判斷前面的對象能不能當作后面類型的實例

筆記本USB接口案例

//先確定一下筆記本電腦有什么功能
//關機,開機,可以使用各種USB設備
//功能確定好之后寫方法
public class Computer {
    public void powerOn() {
        System.out.println("筆記本電腦開機了");
    }

    public void powerOff() {
        System.out.println("筆記本電腦關機了");
    }

    public void usbDevice(USB usb) {
        usb.open();
        if (usb instanceof Mouse) {
            Mouse mouse = (Mouse) usb;
            mouse.click();
        } else if (usb instanceof KeyBoard) {
            KeyBoard keyboard = (KeyBoard) usb;
            keyboard.type();
        }
        //usb.close();
    }
}

//usb設備需要設置成接口,並且有抽象方法,
//因為usb設備都有着共性的方法,和非共性的方法,我們需要把共性的方法給抽取出來
//usb設備都有開關的功能
public interface USB {
    //打開設備的功能
    public abstract void open();
    //關閉設備的功能

    public abstract void close();

}
//現在設置一個usb設備
//去實現USB接口
//實現了這個USB接口才可以在Computer類中傳遞進去,有了USB設備,鼠標才是一個完整的電腦
//現在就去實現這個接口吧
public class Mouse implements USB {
    //必須重寫抽象方法
    @Override
    public void open() {
        System.out.println("鼠標插入");
    }
    @Override
    public void close() {
        System.out.println("鼠標拔出");
    }
    //鼠標特有的方法
    public void click() {
        System.out.println("鼠標點擊");
    }
}
//也是一個USB設備
public class KeyBoard implements USB {
    //重寫方法
    @Override
    public void open() {
        System.out.println("鍵盤插入。。。");
    }
    @Override
    public void close() {
        System.out.println("鍵盤拔出");
    }
    //鍵盤特有方法
    public void type() {
        System.out.println("鍵盤打字");
    }
}
//現在可以創建一個計算機了
public class ComputerImple {
    public static void main(String[] args) {
        //創建一個筆記本對象
        Computer computer = new Computer();
        //啟動筆記本
        computer.powerOn();
        //創建USB接口
        USB usb = new Mouse();
        //傳遞接口
        computer.usbDevice(usb);
        USB usb1 = new KeyBoard();
        computer.usbDevice(usb1);
        //關閉筆記本
        computer.powerOff();

    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM