一.接口的使用
接口(interface):用于處理繼承單一的局限性;接口中的所有方法都是抽象方法;接口與了類的關(guān)系是實現(xiàn)(implements).
格式:interface接口名{
public static final 變量名=1;//必須初始化且不可改變。
* public abstract void 方法名();
* //接口內(nèi)的方法都是抽象方法,無方法體{},不能實例化,若想實例化必須創(chuàng)建子類去實現(xiàn)。
}
接口的成員特點:只能是抽象方法和常量;接口不能創(chuàng)建對象(實例化);
關(guān)系:類與類:繼承(單一繼承,多層繼承)
?類與接口:實現(xiàn),多實現(xiàn)
接口與接口:繼承,多繼承
interface App {//接口
public static final int i=1;
? ? public abstract void app();
}
interface Bpp extends App{
public abstract void bpp();
}
class TestApp implements Bpp{//接口的實現(xiàn)
public? void app(){
System.out.println("實現(xiàn)App接口"+i);
}
public? void bpp(){
System.out.println("實現(xiàn)Bpp接口"+i);
}
}
public class TestAp{
public static void main(String[] args) {//測試類
TestApp t=new TestApp();
t.app();//實現(xiàn)App接口1
t.bpp();//實現(xiàn)Bpp接口1
}
}
2.多態(tài)的使用
定義:父類的引用變量指向子類對象
格式:父類名 ?變量=new 子類名();
成員變量:父類的成員變量在子類中被重寫時,調(diào)用成員變量時調(diào)用的是子類重寫的成員變量
? ? ? ? ? ? ? ? ? 若是子類中特有成員變量,變量名.成員變量;出錯了; ? ? ?必須強制轉(zhuǎn)換為子類才能被調(diào)用變量名 ??((子類) 變量名).成員變量;
成員方法:父類的成員方法在子類中被重寫時,調(diào)用成員變量時調(diào)用的是子類重寫的成員方法
? ? ? ? ? ? ? ? ?若調(diào)用子類中特有成員方法,變量名.成員方法();出錯了; ? ? ?必須強制轉(zhuǎn)換為子類才能被調(diào)用成員方法 ? ((子類) 父類的引用).成員方法();
特點:成員變量:編譯時看左邊,運行時也看左邊。(編譯和運行時都看左邊(即看父類成員))
? ? ? ? ? ?成員方法:編譯時看左邊(父類成員),運行時看右邊(子類成員)
? ? ? ? ? ?靜態(tài)方法:編譯時看左邊,運行時也看左邊。
總結(jié):編譯時都看左邊,運行時成員方法看右邊,其他(成員方法和靜態(tài)方法)都看左邊。
缺點: ? ? 1.無法直接訪問子類特特有成員
?優(yōu)點: ? ?1.可以提高可維護性
? ? ? ? ? ? ? ? ?2.提高代碼的擴展性
class Animai {//父類
Stringname;
void eat() {
System.out.println("動物吃飯");
}
}
class Dog extends Animai{//子類
void eat() {
System.out.println("狗吃飯");//若在子類中重寫了父類方法,調(diào)用父類方法是調(diào)用的是被子類重寫的方法
}
void slepp() {()
System.out.println("狗睡覺");
}
}
public class AnimalTest {
//多態(tài):1.必須要有繼承或者實現(xiàn)類的關(guān)系
? ? ? ? ? ? 2. 方法的重寫
? ? ? ? ? ? 3.父類的引用指向子類的對象
? ? public static void main(String[] args) {
Animai a =new Dog();
a.eat();//向上轉(zhuǎn)型自動 ? ? ?動物吃飯
? ? ? ? ((Dog) a).slepp();//向下轉(zhuǎn)型強制 ? 狗吃飯
? ? }
}