1、抽象類的相關限制
- 抽象類不能使用「final」關鍵字修飾,由於抽象類必需要由子類進行繼承,而後經過子類向上轉型進行實例化;
- 抽象類裏面會存在一些屬性,因此抽象類必定也會存在構造方法。抽象類經過子類進行實例化時,一樣知足:先實例化父類,再實例化子類的原則。
- 外部抽象類不容許使用static修飾,而內部抽象類可使用static修飾。使用static修飾的內部類,至關於一個外部抽象類,子類進行繼承時使用「外部類.內部類」。
-
class Biology{ /** * 內部抽象類:使用static修飾 */ abstract static class Animal{ public abstract String doing(); } } /** * 子類:繼承抽象類Animal */ class Dog extends Biology.Animal{ @Override public String doing() { return "狗咬呂洞賓"; } } public class TestAbstract{ public static void main(String[] args) { Biology.Animal dog = new Dog(); System.out.println(dog.doing()); //狗咬呂洞賓 } }
- 抽象類能夠有static方法,直接經過抽象類名稱」.」方法名稱(),進行調用。
/** * 有時候,因爲抽象類只須要一個特定的系統子類,此時能夠經過內部類來實現(避免了沒必要要的外部子類) */ abstract class Animal{ public abstract String doing(); /** * 經過內部子類,實例化抽象類 */ public static Animal getInstance(){ return new Dog(); //經過內部子類,實例化抽象類 } /** * 子類:繼承抽象類Animal * 私有內部類,在外部不可見 */ private static class Dog extends Animal{ @Override public String doing() { return "狗咬呂洞賓"; } } } public class TestAbstract{ public static void main(String[] args) { Animal dog = Animal.getInstance(); System.out.println(dog.doing()); //狗咬呂洞賓 } }
2、接口服務器
- 接口中,只能有抽象方法和全局常量。
- 接口中,訪問權限只能是public。若是類定義時,屬性未顯示用「public final static「修飾,則系統自動爲屬性添加以上修飾。若是方法爲顯示用「public」修飾,則系統自動添加「public」修飾。
- 子類只能繼承一個父類(普通類或抽象類),可是,接口可使用extends關鍵字,繼承多個接口。
-
interface IAaa{ void fa(); } interface IBbb{ void fb(); } interface ICcc extends IAaa,IBbb{ void fc(); } /** * 子類: */ class Child implements ICcc { @Override public void fa() { } @Override public void fb() { } @Override public void fc() { } }
- 接口中能夠包含內部類、內部抽象類、內部接口。
-
interface Biology{ String printType(); /** * 內部接口: */ interface Animal{ String eat(); String work(); } /** * 內部抽象類 */ abstract class Plant{ public abstract String grow(); } } /** * 子類:實現外部接口 * 只須要重寫外部接口的抽象方法,和其中的內部類或內部接口無關 */ class Robot implements Biology{ @Override public String printType() { return "自能機器人"; } } /** * 子類:實現內部接口 */ class Dog implements Biology.Animal { @Override public String eat() { return "狗啃骨頭"; } @Override public String work() { return "狗咬呂洞賓"; } } /** * 子類:實現內部抽象類 */ class Bamboo extends Biology.Plant{ @Override public String grow() { return "芝麻開花節節高"; } } public class Test { public static void main(String[] args) { Biology robot = new Robot(); System.out.println(robot.printType()); //自能機器人 Biology.Animal dog = new Dog(); System.out.println(dog.eat()); //狗啃骨頭 System.out.println(dog.work()); //狗咬呂洞賓 Biology.Plant bamboo = new Bamboo(); System.out.println(bamboo.grow()); //芝麻開花節節高 } }
3、接口在實際開發之中有三大核心做用ide
- 定義不一樣層之間的操做標準
- 表示一種操做的能力
- 表示將服務器端的遠程方法試圖暴露給客服端
4、抽象類和接口的比較spa
No | 區別 | 抽象類 | 接口 |
1 | 關鍵字 | abstract | interface |
2 | 組成 | 構造方法、靜態方法、普通方法、抽象方法、code 常量、變量對象 |
抽象方法、全局常量 |
3 | 權限 | 可使用任意權限修飾符 | 只能使用public |
4 | 關係 | 抽象類能夠實現多個接口 | 接口不能繼承抽象類,blog 接口能夠繼承多個接口繼承 |
5 | 子類使用 | class 子類 extends 抽象類 | class 子類 implement 接口一,接口二 |
6 | 限制 | 單繼承限制 | 沒有單繼承限制 |
7 | 重寫抽象方法 | 抽象類和接口都必須有子類,非抽象子類必須重寫全部的抽象方法 | 【同抽象類】 |
8 | 實例化方式 | 抽象類和接口,都是依靠子類對象向上轉型,進行實例化 | 【同抽象類】 |
5、其餘說明接口
語法要求:定義類時,先寫繼承extends,再寫接口實現implements,不然,編輯時就會報錯。開發
class Dog extends AbstractFather implements IAnimal { ….. }