消防做設(shè)計(jì)有什么網(wǎng)站無(wú)錫網(wǎng)站建設(shè)優(yōu)化公司
前言
本篇會(huì)講到Java中接口內(nèi)容,概念和注意點(diǎn)可能比較多,需要耐心多看幾遍,我盡可能的使用經(jīng)典的例子幫助大家理解~
歡迎關(guān)注個(gè)人主頁(yè):逸狼
創(chuàng)造不易,可以點(diǎn)點(diǎn)贊嗎~
如有錯(cuò)誤,歡迎指出~
目錄
前言
接口
語(yǔ)法
注意
?代碼理解
接口運(yùn)用舉例
IUSB接口
KeyBoard類
Mouse類
Computer類
多個(gè)接口
代碼理解(語(yǔ)法層面)
接口解決多繼承問(wèn)題 代碼示例
Animal類
IFly、IRunning、ISwimming接口
Fish類
Duck類
再加上一個(gè)測(cè)試
接口間的繼承
代碼理解
接口
接口是公共的行為規(guī)范標(biāo)準(zhǔn),在Java中,接口是多個(gè)類的公共規(guī)范,是一種引用數(shù)據(jù)類型。
語(yǔ)法
- 定義格式與類基本相同,將class關(guān)鍵字換成interface關(guān)鍵字
- 接口中的成員變量(習(xí)慣上是大寫)默認(rèn)為public static final 修飾的(寫的時(shí)候可省略public static final),必須被初始化
- 接口中的方法默認(rèn)只能是public abstract 修飾的(也可省略不寫,不寫默認(rèn)也是抽象方法(不能有具體的實(shí)現(xiàn),否則會(huì)報(bào)錯(cuò)),用其他修飾符會(huì)報(bào)錯(cuò))
- 接口中使用default修飾的方法和static修飾的方法是可以有具體的實(shí)現(xiàn)的
- 接口中不能有靜態(tài)代碼塊、示例代碼塊和構(gòu)造方法。
- 接口雖然不是類,但編譯完成后也是字節(jié)碼文件(后綴名是.class)。
注意
- 創(chuàng)建接口時(shí), 接口的命名一般以大寫字母 I 開(kāi)頭
- 接口的命名一般使用 "形容詞" 詞性的單詞.
- 阿里編碼規(guī)范中約定, 接口中的方法和屬性不要加任何修飾符號(hào), 保持代碼的簡(jiǎn)潔性.
?代碼理解
package demo2inter;public interface ITestInterFace {public static final int a=100;int AGE=10;abstract public void fun1();void fun2();default void func(){System.out.println("default!");}public static void staticFunc(){System.out.println("staticFunc!");}
}
接口的簡(jiǎn)單使用
- 接口不能被實(shí)例化
- 接口需要被類實(shí)現(xiàn),需要使用關(guān)鍵字implements來(lái)實(shí)現(xiàn)
- 當(dāng)一個(gè)類實(shí)現(xiàn)類這個(gè)接口,那么這個(gè)類要重寫這個(gè)方法
- 接口也可以發(fā)生向上轉(zhuǎn)型、動(dòng)態(tài)綁定和多態(tài)。
public interface ITestInterFace {void draw();}
class Rect implements ITestInterFace{@Overridepublic void draw() {System.out.println("畫一個(gè)矩形!");}
}
class Triangle implements ITestInterFace{@Overridepublic void draw() {System.out.println("畫一個(gè)三角形!");}
}
class Test{public static void drawMap(ITestInterFace iTestInterFace){iTestInterFace.draw();}public static void main(String[] args) {drawMap(new Rect());//發(fā)生了向上轉(zhuǎn)型和動(dòng)態(tài)綁定drawMap(new Triangle());}
}
接口運(yùn)用舉例
請(qǐng)實(shí)現(xiàn)筆記本電腦使用USB鼠標(biāo)、USB鍵盤的例子
- USB接口:包含打開(kāi)設(shè)備、關(guān)閉設(shè)備功能
- 筆記本類:包含開(kāi)機(jī)功能、關(guān)機(jī)功能、使用USB設(shè)備功能
- 鼠標(biāo)類:實(shí)現(xiàn)USB接口,并具備點(diǎn)擊功能
- 鍵盤類:實(shí)現(xiàn)USB接口,并具備輸入功能
在包demo3中,創(chuàng)建3個(gè)類,一個(gè)接口
IUSB接口
package demo3;public interface IUSB {// USB接口void openDevice();//打開(kāi)服務(wù)void closeDevice();//關(guān)閉服務(wù)}
KeyBoard類
package demo3;public class KeyBoard implements IUSB {@Overridepublic void openDevice() {System.out.println("打開(kāi)鍵盤!");}@Overridepublic void closeDevice() {System.out.println("關(guān)閉鍵盤!");}public void input(){System.out.println("鍵盤輸入!");}
}
Mouse類
package demo3;public class Mouse implements IUSB{@Overridepublic void openDevice() {System.out.println("打開(kāi)鼠標(biāo)!");}@Overridepublic void closeDevice() {System.out.println("關(guān)閉鼠標(biāo)!");}public void click(){System.out.println("點(diǎn)擊鼠標(biāo)!");}
}
Computer類
package demo3;import demo2inter.ITestInterFace;public class Computer {public void powerOff (){System.out.println("關(guān)閉電腦!");}public void powerOn(){System.out.println("打開(kāi)電腦!");}public void useDevice(IUSB usb){usb.openDevice();//這里要區(qū)分 USB引用了哪個(gè)對(duì)象if(usb instanceof Mouse){Mouse mouse =(Mouse) usb;//向下轉(zhuǎn)型mouse.click();}//調(diào)用鍵盤if(usb instanceof KeyBoard){KeyBoard keyBoard=(KeyBoard) usb;keyBoard.input();}usb.closeDevice();}public static void main(String[] args) {Computer computer=new Computer();computer.powerOn();computer.useDevice(new KeyBoard());//向上轉(zhuǎn)型computer.useDevice(new Mouse());computer.powerOff();}
}
多個(gè)接口
Java中不支持多繼承,但是一個(gè)類可以實(shí)現(xiàn)多個(gè)接 口。接口表達(dá)含義是 具有**特性,可以幫助程序員忘掉類型,只關(guān)注特性。
代碼理解(語(yǔ)法層面)
類TestDemo4實(shí)現(xiàn)了IA和IB接口
package demo4;//多個(gè)接口
interface IA{void testA();
}
interface IB{void testB();
}
class TestDemo4 implements IA,IB{@Overridepublic void testA() {System.out.println("testA()");}@Overridepublic void testB() {System.out.println("testB()");}
}
public class Test4 {public static void main(String[] args) {TestDemo4 testDemo4=new TestDemo4();testDemo4.testA();testDemo4.testB();}}
接口解決多繼承問(wèn)題 代碼示例
在demomoreinher包中有Animal抽象類,Duck,Fish類 以及IFly、IRunning、ISwimming接口
Animal類
IFly、IRunning、ISwimming等動(dòng)物特性應(yīng)該采用接口方式
package demomoreinher;public abstract class Animal {protected String name;protected int age;public Animal(String name, int age) {this.name = name;this.age = age;}public abstract void eat();//像跑 游泳 飛等動(dòng)作不能寫在這里,因?yàn)椴皇撬袆?dòng)物都會(huì)這些技能 應(yīng)該寫在接口中
}
IFly、IRunning、ISwimming接口
//注意:這里的代碼是在不同IFly、IRunning、ISwimming接口文件中的
public interface IFly {void fly();
}public interface IRunning {void run();
}public interface ISwimming {void swim();
}
Fish類
魚(yú)只會(huì)游泳這項(xiàng)特性,所以接口ISwimming
package demomoreinher;public class Fish extends Animal implements ISwimming{//如果這里游泳寫出類,java是不支持多繼承的,所有說(shuō)接口解決了多繼承問(wèn)題public Fish(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(this.name+"吃魚(yú)糧!");}@Overridepublic void swim() {System.out.println(this.name+"游泳~");}
}
Duck類
而鴨子游泳,跑,飛這3個(gè)技能都會(huì),所以三個(gè)特性都接上
package demomoreinher;public class Duck extends Animal implements ISwimming,IFly,IRunning{public Duck(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(this.name+"吃鴨糧!");}@Overridepublic void fly() {System.out.println(this.name+"飛~~~");}@Overridepublic void run() {System.out.println(this.name+"跑~~~");}@Overridepublic void swim() {System.out.println(this.name+"游泳~~~");}
}
再加上一個(gè)測(cè)試
package demomoreinher;public class TestAnimal {public static void eatFunc(Animal animal){animal.eat();//實(shí)現(xiàn)eat的動(dòng)態(tài)綁定}public static void walk(IRunning running){running.run();//實(shí)現(xiàn)跑的動(dòng)態(tài)綁定}public static void main(String[] args) {walk(new Duck("唐老鴨",3));eatFunc(new Fish("靈兒",2));}
}
測(cè)試結(jié)果
接口間的繼承
相當(dāng)于將接口合并在一起了
代碼理解
IC繼承了IA和IB,使IC接口的功能包含了IA和IB的功能,當(dāng)然類TestDeme在實(shí)現(xiàn)接口IC時(shí),要將IA,IB和IC的方法一起都要重寫
package demo5;//接口繼承問(wèn)題
interface IA{void testA();
}
interface IB{void testB();
}
//IC接口不僅具備了自己的testC這個(gè)功能,還 擴(kuò)展 了IA和IB的功能
interface IC extends IA,IB{void testC();}
class TestDemo implements IC{@Overridepublic void testA() {System.out.println("testA()");}@Overridepublic void testB() {System.out.println("testB()");}@Overridepublic void testC() {System.out.println("testC()");}
}