介面的使用(Java)

苼歌己沫發表於2020-12-21


介面是一個特殊的類,主要由全域性變數和公共的抽象方法組成,介面可以說是百分之百的抽象類,也就是說,介面中的方法全都是抽象方法(Java8以前),介面通常用來定義一組通用的元件,或者功能模組。

一,介面的基本使用

不同於普通的類,類的關鍵字是class,介面的是interface

public interface 介面名{
}

和定義類的區別在於,將class關鍵字換成了interface

1 介面中的成員屬性和方法

介面中也有成員屬性和方法
所有的成員屬性都是 public static final (公共的靜態常量)型別
所有的方法都是:public abstract (公共的抽象方法)

public interface Test1 {
    int a = 0;
    void hello();
}

可以省略不寫前面的修飾詞,介面會預設。
我們去可以測試一下

public class Test {
    public static void main(String[] args) {
        Test1 test1 = new Test1() {
            @Override
            public void hello() {
                System.out.println("hello");
            }
        };
        test1.hello();
        System.out.println(Test1.a);
    }
}

輸出結果:
在這裡插入圖片描述
可以看到a可以直接被類名引用出來,表示為公開的靜態變數
如果我們嘗試修改a的值
在這裡插入圖片描述
此時會報錯,說明a是被final修飾的值,無法被修改。

2 介面的基本使用

我們需要使用implements關鍵詞去實現介面。

public class getTest1 implements Test1 {
    @Override
    public void hello() {
        System.out.println("我是getTest1中的hello方法");
    }
}

由於介面中的方法是抽象方法,所以在介面實現類中,必須實現介面中規定的方法。

測試結果如下:
在這裡插入圖片描述
一個類可以實現多個介面,但必須實現所有介面中的方法
在這裡插入圖片描述

二,函式式介面

就是介面中只有一個抽象方法的介面,稱為函式式介面,需要在介面的上方加上@FunctionalInterface 註解
在這裡插入圖片描述
只要介面只定義了一個抽象方法,那它就是一個函式式介面,還有在上述Java Api中都有個@FunctionalInterface註解,這表示著該介面會設計成一個函式式介面,不符合規範的話,就會編譯報錯。

三,介面間的相互繼承

讓Test2介面繼承Test1介面

public interface Test2 extends Test1{
    void hello2();
}

在介面實現類中只實現Test2介面

public class GetTest1 implements Test2 {
    //Test1介面中的方法
    @Override
    public void hello() {
        System.out.println("我是Test1中的hello方法");
    }
    //Test2介面中的方法
    @Override
    public void hello2() {
        System.out.println("我是Test2中的hello2方法");
    }
}

例項(上述的具體實現,可以不用看)

原始的手機,可以發簡訊,通電話。隨著發展,手機增加了音訊、視訊播放、拍照、上網功能。按照作業3的思路和下面的類圖進行程式設計:首先,編寫類及介面,參照以下類的結構圖;其次,編寫測試類,讓普通手機播放音訊、發資訊和通電話,讓智慧手機上網、播放視訊、照相、發彩信和視訊通電話。在這裡插入圖片描述
TheakePictures介面:

public interface TheakePictures {
    public void takePictare();
}

PlayWirIng介面:

public interface PlayWirIng {
    public void play(String incontent);
}

NetWork介面:

public interface NetWork {
    public void networkConn();
}

Handset抽象類:

public abstract class Handset {
    private String brand;
    private String type;

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
    public void sendInfo(){
        System.out.println("這是一款型號為"+getBrand()+"的"+getType()+"手機:");
    }
    public abstract void call();
    public abstract void info();
}

AptitudeHand實現類:

public class AptitudeHandst extends Handset implements TheakePictures, NetWork,PlayWirIng {
    @Override
    public void call() {
        System.out.println("開始視訊通話......");
    }

    @Override
    public void info() {
        System.out.println("傳送帶圖片與文字的訊息");
    }

    @Override
    public void networkConn() {
        System.out.println("已開啟行動網路");
    }

    @Override
    public void takePictare() {
        System.out.println("咔嚓......拍照成功");
    }

    @Override
    public void play(String incontent) {
        System.out.println("開始播放視訊《"+incontent+"》");
    }
}

CommonHandset實現類:

public class CommonHandset extends Handset implements PlayWirIng {
    @Override
    public void call() {
        System.out.println("傳送語音通話.........");
    }

    @Override
    public void info() {
        System.out.println("傳送文字訊息..........");
    }

    @Override
    public void play(String incontent) {
        System.out.println("開發播放音樂《"+incontent+"》.....");
    }
}

測試類:


public class TestIphon {
    public static void main(String[] args) {
        Handset handset = new CommonHandset();
        CommonHandset comm = (CommonHandset)handset;
        comm.setBrand("G502c");
        comm.setType("索尼愛立信");
        comm.sendInfo();
        comm.play("熱血");
        comm.info();
        comm.call();
        handset = new AptitudeHandst();
        AptitudeHandst apt = (AptitudeHandst)handset;
        apt.setBrand("HTC");
        apt.setType("I9100");
        apt.sendInfo();
        apt.networkConn();
        apt.play("小時代");
        apt.takePictare();
        apt.info();
        apt.call();

    }
}

輸出結果:
在這裡插入圖片描述

相關文章