Author JYBlog
Email jcAuthor@163.com
本博客GitHub開源(jcNaruto/JYBlog)
JYBlog每周五蓄愁,周三公眾號等多平臺同步更新,歡迎討論交流~
- 子父類中不允許實例化的類可以設(shè)計為抽象類监嗜,沒有實際意義的方法是其中的抽象方法。
- 接口可以看做100%的純抽象類,在Java中被用來解決多重繼承中的致命方塊問題纲缓。
1.抽象類
抽象類的含義就是不應(yīng)該實例化的類奄抽,例如假設(shè)Dog和Cat繼承了Animal類各自重寫了eat方法检诗,因為eat行為不一樣,如下
public class Animal{
public void eat(){
xxx
}
}
Animal dog = new Dog();
Animal cat = new Cat();
此時注意觀察恬偷,是否可以實例化Animal悍手,從抽象角度看,實例化Animal不合適,因為動物是抽象概念坦康,只有下面的Dog,Cat是具體的竣付,從代碼層面看Animal的eat方法的方法體中沒有特別大的意義,因為子類實現(xiàn)的時候滞欠,不同的子類有不同的行為古胆,注定要重寫方法。
注:
有人會疑問筛璧,Object在Java中也是抽象概念為什么可以實例化逸绎,因為許多地方需要輕量化的實例,例如保證操作原子性的鎖中夭谤。
盡量少使用Object的多態(tài)棺牧,因為不安全,Java泛型的起因朗儒。
當(dāng)希望某些類不應(yīng)該被初始化可以使用抽象類陨帆,編譯器會檢查保證抽象類沒有被實例化,抽象類中某些注定被重寫沒有意義的方法可以用抽象方法采蚀。
abstract public class AbsTest {
private String s;
public static String str;
public abstract void absTest();
public void test(){
}
}
抽象類就是用來被繼承的,其中可以有抽象的方法承二,也可以有非抽象的方法榆鼠。
子類必須用相同的方法簽名和返回值類型實現(xiàn)所有的抽象方法。
抽象類屬性不受限制亥鸠。
2.接口
當(dāng)我們需要兩個上層父類的時候妆够,也就是多繼承的時候,會引發(fā)一個致命方塊問題
Dell和Apple類繼承了Computer類负蚊,都覆蓋了原先的計算價格方法神妹,因為不同的品牌有不同的計算方法,
然后Mycomputer繼承了Dell家妆,Apple調(diào)用時不知道具體調(diào)用哪個getPirce,這就是多重繼承的致命方塊問題鸵荠,有的語言允許多重繼承會定義額外的規(guī)則來消除這種模糊性,但Java直接禁止了多重繼承伤极,使用接口來解決多重繼承的致命方塊問題蛹找。
接口可以看成是100%的純抽象類。所有的接口方法都是抽象的也就是不允許接口實現(xiàn)方法哨坪,然后在實現(xiàn)多個接口的過程中就不會產(chǎn)生不知道調(diào)用哪個父類的具體方法的致命方塊問題庸疾。
public interface ITest {
public static final String str = "tset";
abstract void test1();
void test2();
}
接口中所有方法都是抽象的,可以省略abstract当编。
接口屬性中只允許全局常量的存在届慈。