Java 中的抽象類,接口
抽象類
1.[含有]抽象方法
2.在類前使用abstract
3.抽象類有未具體實現的方法,所以不能使用抽象類創建對象
4.抽象方法是一種特殊的方法,只有聲明沒有具體實現
5.如果一個類繼承抽象類,那麼必須爲基類中的抽象方法提供定義,若不這麼做,導出類也是抽象類
抽象類和普通類的區別:
1.抽象方法必須爲 public 或者 proctected ,如果是
private 則不能被子類繼承,子類就無法實現它的方法,缺省時默認爲 public
2.抽象類不能用來創建對象
3.普通類繼承抽象類,必須實現其方法,否者還是抽象類
- 接口
1. 可以含有變量和方法,但是接口中的變量會被隱式第指定爲public static final變量
(使用private修飾會編譯錯誤)
2. 方法則會被隱式地指定爲**public abstract**(且只能是public abstract,不能使用private,protected,static,final等修飾)
3.**接口中所有方法不能有具體的實現**,也就是接口必須全部都是抽象方法,
【前面示例中可以知道抽象類是可以含有普通方法的】
接口和抽象類的區別
- abstract class 在java中表示的是一種繼承關係,一個類只能繼承一個父類,但是一個類是可以實現多個 interface的。
- 在abstract class中可以有自己的數據成員,也可以有非 abstract 的成員方法,在 interface中,只能有靜態的不能被修改的數據成員[static final不過一般不在 interface中定義數據成員],且接口中所有方法都是 abstract
- 繼承/實現 抽象類和接口必須實現其所有抽象方法,如果沒有實現抽象類全部抽象方法,子類也必須是抽象類,但是實現接口的子類必須實現接口的全部抽象方法
區別總結:
1.抽象類可以有非抽象方法,接口不能有
2.子類可以不實現抽象類的全部抽象方法,此時子類也要是抽象類,
但是子類實現接口時需要實現接口的全部(抽象)方法
3.接口中所有方法都是 public abstract ; 不能是 static 方法,static 方法是不能被子類 重寫的(override)。但是抽象方法允許有 static 方法
代碼示例
抽象類代碼示例:
//TestAbstract.java 抽象類
package com.zranfly.demo;
public abstract class TestAbstract {
//聲明一個抽象方法
public abstract int func1();
//普通方法
public void func2() {
System.out.println("我是TestAbstract中的普通方法 func2");
}
}
// TestExtends .java 實現抽象類和接口
package com.zranfly.demo;
// 子類可以實現多個接口,只能繼承一個父類
public class TestExtends extends TestAbstract implements TestInterfaceA, TestInterfaceB {
public void func0() {
System.out.println("我是TestExtends中的普通方法func0");
}
// 實現抽象類 TestAbstract 的抽象方法
@Override
public int func1() {
System.out.println("我在TestExtends中繼承自TestAbstract的抽象方法func1");
return 0;
}
// 實現接口A的方法
@Override
public void funcA() {
System.out.println("我在TestExtends中實現了TestInterfaceA的funcA()");
}
// 實現接口B的方法
@Override
public void funcB() {
System.out.println("我在TestExtends中實現了TestInterfaceB的funcA()");
}
}
// 接口A TestInterfaceA.java
package com.zranfly.demo;
public interface TestInterfaceA {
public abstract void funcA();
}
// 接口A TestInterfaceB.java
package com.zranfly.demo;
public interface TestInterfaceB {
public abstract void funcB();
}
// 測試類 TestDemo.java
package com.zranfly.demo;
public class TestDemo {
public static void main(String args[]){
TestExtends te = new TestExtends();
te.func0(); // 調用子類的普通方法
te.func1(); // 調用 自己實現後的抽象方法
te.func2(); // 可以調用 抽象父類的普通方法
te.funcA(); // 調用 接口A的 funcA()
te.funcB(); // 調用 接口B 的funcB()
}
}
//TestDemo.java運行結果
我是TestExtends中的普通方法func0
我在TestExtends中繼承自TestAbstract的抽象方法func1
我是TestAbstract中的普通方法 func2
我在TestExtends中實現了TestInterfaceA的funcA()
我在TestExtends中實現了TestInterfaceB的funcA()
我覺得還不錯的資料:Java抽象類與接口的區別