欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中的接口及其應(yīng)用場(chǎng)景解讀

 更新時(shí)間:2023年05月08日 17:12:26   作者:回水  
這篇文章主要介紹了Java中的接口及其應(yīng)用場(chǎng)景解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、接口的特點(diǎn)

1.如果一個(gè)抽象類中的所有方法都是抽象的,則可以將這個(gè)類定義為Java中的另一種形式——接口。接口是一種特殊的抽象類,接口中只有全局常量和抽象方法,是一種更純粹的抽象概念。

2.在JDK8中,對(duì)接口進(jìn)行了重新定義,接口中除了有抽象方法外,還可以有默認(rèn)方法和靜態(tài)方法;默認(rèn)方法可以被繼承和覆寫,靜態(tài)方法不能被繼承和覆寫。

3.一般來說,接口的使用表示兩種場(chǎng)景:

  • ①接口表示具備某種能力/行為,子類實(shí)現(xiàn)接口是并不是is a關(guān)系,而是具備這種能力或行為
  • ②接口表示一種規(guī)范或者標(biāo)準(zhǔn)。

4.在接口中,定義抽象方法時(shí) public abstract關(guān)鍵字可以省略,定義全局常量時(shí) static final可以省略。

5.接口的子類可以實(shí)現(xiàn)多個(gè)父接口,接口也不能直接實(shí)例化對(duì)象,需要通過子類(普通類)向上轉(zhuǎn)型。

6.接口和接口之間也可以是繼承關(guān)系,但是接口絕對(duì)不能繼承一個(gè)類。

二、定義接口

1.interface關(guān)鍵字

與定義類不同的是,在定義接口的時(shí)候,不再使用class關(guān)鍵字,而是使用interface關(guān)鍵字來聲明。

語法格式:修飾符 interface 接口名 { }

創(chuàng)建一個(gè)USB接口,里面有兩個(gè)抽象方法

代碼如下:

public interface USB{
//表示插入
	public abstract void plugIn();
//表示工作
	public abstract void work();
}

2.implements關(guān)鍵字

子類使用implements關(guān)鍵字來實(shí)現(xiàn)接口,必須覆寫接口中所有的抽象方法

代碼如下:

public class KeyBoard implements USB {
	@Override
    public void plugIn() {
        System.out.println("安裝鍵盤驅(qū)動(dòng)");
    }
    @Override
    public void work() {
        System.out.println("鍵盤正常工作");
    }
}

三、應(yīng)用場(chǎng)景

1.接口表示規(guī)范

USB接口表示一種規(guī)范,鼠標(biāo)鍵盤耳機(jī)等等這些外設(shè)都屬于USB接口的子類,我們?cè)谌粘I钪惺褂秒娔X的時(shí)候,我們并不關(guān)心到底哪個(gè)具體設(shè)備插入了我們的電腦,只要這個(gè)設(shè)備滿足了USB接口,就都能被電腦識(shí)別并使用。

就是說,一個(gè)接口,可以接受無數(shù)種設(shè)備,只要這個(gè)設(shè)備滿足USB接口,都可以插入電腦并被電腦識(shí)別。

兼容所有的USB子類對(duì)象。

public interface USB{
//表示插入
	public abstract void plugIn();
//表示工作
	public abstract void work();
}
public class Mouse implements USB{
    @Override
    public void plugIn() {
        System.out.println("安裝鼠標(biāo)驅(qū)動(dòng)");
    }
    @Override
    public void work() {
        System.out.println("鼠標(biāo)正常工作");
    }
}
public class KeyBoard implements USB {
	@Override
    public void plugIn() {
        System.out.println("安裝鍵盤驅(qū)動(dòng)");
    }
    @Override
    public void work() {
        System.out.println("鍵盤正常工作");
    }
}
public class Camera implements USB{
    @Override
    public void plugIn() {
        System.out.println("安裝相機(jī)驅(qū)動(dòng)中");
    }
    @Override
    public void work() {
        System.out.println("相機(jī)開始正常工作");
    }
}
//電腦這個(gè)類不是USB接口的子類,他是USB規(guī)范的使用者
public class Computer {
    public static void main(String[] args) {
        Computer computer = new Computer();
        Mouse mouse = new Mouse();
        Keyboard keyboard = new Keyboard();
        Camera camera = new Camera();
        computer.fun(mouse);
        computer.fun(keyboard);
        computer.fun(camera);
    }
    /**
    *為什么此時(shí)fun方法的參數(shù)是USB usb呢?如果我們寫成fun(Mouse mouse),那么這個(gè)fun只能識(shí)別鼠標(biāo),其他的根本識(shí)別不了,我們得寫好多個(gè)方法去實(shí)現(xiàn)。
    *我們這里用他們共同的接口當(dāng)做參數(shù),這樣不管傳進(jìn)來的是什么設(shè)備,只要你實(shí)現(xiàn)了USB這個(gè)接口,那你就可以被識(shí)別
    *假設(shè)我們現(xiàn)在多了一個(gè)子類Earphone(耳機(jī))類,實(shí)現(xiàn)了USB接口,那我們的fun方法里一行多的代碼都不用寫,直接實(shí)例化對(duì)象,將引用名傳進(jìn)去就行。
    */
    public void fun(USB usb) {
        usb.plugIn();
        usb.work();
    }
}

2.接口表示能力/行為

接口允許多實(shí)現(xiàn),一個(gè)類可以具備多個(gè)能力,同時(shí)實(shí)現(xiàn)多個(gè)父接口,若實(shí)現(xiàn)多個(gè)父接口,子類(普通類),必須覆寫所有的抽象方法。

代碼如下:

//游泳接口,表示具備游泳這個(gè)行為
public interface ISwim {
? ? //可以省略public abstrac
//public abstract void swim();
? ? void swim();
}
//具備跑這個(gè)行為
public interface IRun {
//可以省略public abstrac
? ? void run();
//public abstract void run();
}
//表示能飛
public interface IFly {
//public abstract void fly();
//可以省略public abstrac
? ? void fly();
}
//只具備跑的行為
public class Rabbit implements IRun{
? ? @Override
? ? public void run() {
? ? ? ? System.out.println("兔子在跑~");
? ? }
}
//具備跑和游泳的能力
public class Dog implements IRun,ISwim{
? ? @Override
? ? public void run() {
? ? ? ? System.out.println("狗子在跑~");
? ? }
? ? @Override
? ? public void swim() {
? ? ? ? System.out.println("狗子在游泳~");
? ? }
}
//三種能力都具備
public class Duck implements IRun,ISwim,IFly{
? ? @Override
? ? public void fly() {
? ? ? ? System.out.println("鴨子在飛~");
? ? }
? ? @Override
? ? public void run() {
? ? ? ? System.out.println("鴨子在跑~");
? ? }
? ? @Override
? ? public void swim() {
? ? ? ? System.out.println("鴨子在游泳~");
? ? }
}
//定義一個(gè)測(cè)試類進(jìn)行測(cè)試
public class Test {
? ? public static void main(String[] args) {
? ? ? ? IRun run = new Rabbit();
? ? ? ? IRun run1 = new Dog();
? ? ? ? ISwim swim = new Dog();
? ? ? ? IFly fly = new Duck();
? ? ? ? run.run();
? ? ? ? run1.run();
? ? ? ? swim.swim();
? ? ? ? fly.fly();
? ? }
}

運(yùn)行結(jié)果如下:

四、接口和類之間的關(guān)系

接口和子類之間是一種混合關(guān)系,不具備is a關(guān)系。上面的Dog和Rabbit都具備跑的能力,但是這兩個(gè)類彼此之間沒啥關(guān)系。

1.當(dāng)一個(gè)類實(shí)現(xiàn)接口時(shí),如果這個(gè)類是抽象類,只需要實(shí)現(xiàn)接口種的部分抽象方法,如果是一個(gè)普通類,則需要覆寫接口中所有的抽象方法。

2.一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,接口之間用英文逗號(hào)隔開。

3.接口之間可以通過extends關(guān)鍵字實(shí)現(xiàn)繼承,并且一個(gè)接口可以同時(shí)繼承多個(gè)接口,接口之間用英文逗號(hào)隔開。

4.一個(gè)類在繼承一個(gè)類的同時(shí),還可以實(shí)現(xiàn)多個(gè)接口,此時(shí),extends關(guān)鍵字必須位于implements關(guān)鍵字之前。

語法如下:

修飾符 class 類名 extends 父類名 implements 接口1,接口2{} 

public class Test {
}
interface IA{
//接口中抽象方法可以省略public abstract
    void testA();
}
interface IB{
    void testB();
}
//接口之間存在繼承關(guān)系,可以多繼承。
//接口堅(jiān)決不能繼承一個(gè)類
interface IC extends IA,IB{
//IC接口同時(shí)繼承多個(gè)父接口,繼承了所有的抽象方法
//子類實(shí)現(xiàn)IC接口時(shí),必須覆寫所有的抽象方法
}
class CImpl implements IC{
    @Override
    public void testA() {
    }
    @Override
    public void testB() {
    }
}
abstract class Person{
}
//一個(gè)類繼承一個(gè)類,同時(shí)實(shí)現(xiàn)多個(gè)接口
//修飾符 class 類名 extends 父類名 implements 接口1,接口2{}
class China extends Person implements IA,IB{
    @Override
    public void testA() {
    }
    @Override
    public void testB() {
    }
}

五、接口的命名規(guī)范

為了區(qū)分接口和類,命名使用 I 開頭,IRun,ISwim等等,子類實(shí)現(xiàn)一個(gè)接口時(shí),命名以相應(yīng)的接口開頭,以impl結(jié)尾。

例如:如果是IRun的子類,Runimpl(不是強(qiáng)制要求,但盡量做到)。

如果子類實(shí)現(xiàn)多個(gè)父接口,不需要使用此規(guī)范來命名

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論