接口和抽象類
一、相同點:
都是上層的抽象、都不能被實例化、都能包含抽象方法。
二、不同點
1 接口
接口可以多繼承
public interface Parent extends A, B {
// 成員的public都可省略
//-----------------------------很久以前-----------------------------
// 【變量】
String NAME = "csq&hly";// public static final 省略了
// 【抽象方法】,供重寫(必須重寫)
void abstractMethod();// public abstract 省略了
//-----------------------------JDK 1.8-----------------------------
// 【靜態方法】,供通過接口直接調用
static void staticMethod() {
privateStaticMethod();
}
// 【默認方法】,供子類調用、重寫(可以不重寫)
default void defaultMethod() {
privateMethod();
privateStaticMethod();
}
//-----------------------------JDK 1.9-----------------------------
// 【私有方法】,增強默認方法
private void privateMethod() {
}
// 【私有靜態方法】,增強默認方法、靜態方法
private static void privateStaticMethod() {
}
//-----------------------------測試接口多繼承-----------------------------
/*
重寫接口中抽象方法【必須】,接口多繼承如果抽象方法有重名的,
實現類必須重寫一次(子接口中可不用重寫,重寫了變成默認方法)
重寫接口中默認方法【可選】,接口多繼承如果默認方法有重名的,子接口必須重寫一次
*/
// @Override
// default void abstractMethodAB() {
// }
@Override
default void defaultMethodAB() {
}
}
class Us implements Parent, A, B {
@Override
public void abstractMethod() {
Parent.staticMethod();
defaultMethod();
}
// @Override
// public void defaultMethod() {
//
// }
@Override
public void abstractMethodAB() {
}
public static void main(String[] args) {
Parent.staticMethod();// 【靜態方法】,供通過接口直接調用
new Us().defaultMethod();// 【默認方法】,供子類調用、重寫(可以不重寫)
}
}
interface A {
void abstractMethodAB();
default void defaultMethodAB() {
}
}
interface B {
void abstractMethodAB();
default void defaultMethodAB() {
}
}
2 抽象類
單繼承,實現多個接口
(1) 抽象類不能創建對象,如果創建,編譯無法通過而報錯。只能創建其非抽象子類的對象。
理解:假設創建了抽象類的對象,調用抽象的方法,而抽象方法沒有具體的方法體,沒有意義。
(2) 抽象類中,可以有構造方法,是供子類創建對象時,初始化父類成員使用的。
理解:子類的構造方法中,有默認的super(),需要訪問父類構造方法。
public abstract class AbstractClass {
int score;
public AbstractClass(int score) {
this.score = score;
}
}
class Son1 extends AbstractClass{
public Son1() {
super(1);
}
}
class c{
public static void main(String[] args) {
Son1 son1 = new Son1();
System.out.println(son1.score);
}
}
(3) 抽象類中,不一定包含抽象方法,但是有抽象方法的類必定是抽象類。
理解:未包含抽象方法的抽象類,目的就是不想讓調用者創建該類對象,通常用於某些特殊的類結構設計。
(4) 抽象類的子類,必須重寫抽象父類中所有的抽象方法,否則,編譯無法通過而報錯。除非該子類也是抽象類。
理解:假設不重寫所有抽象方法,則類中可能包含抽象方法。那麼創建對象後,調用抽象的方法,沒有意義。