Java抽象類和接口
抽象類
在面向對象的領域一切都是對象,同時所有的對象都是通過類來描述的,但是並不是所有的類都是來描述對象的。 如果一個類沒有足夠的信息來描述一個具體的對象,而需要其他具體的類來支撐它,那麽這樣的類我們稱它為抽象類。
抽象類被abstract關鍵字修飾的類,由於他是抽象的,也就是存在於意識層面上的類,所以他不能被實例化,實例化的工作應該交由它的子類來完成。
1 abstract class ClassName 2 { 3 }
抽象類和普通類相比,它除了不能創建對象以外,普通類有的他都有(包括構造方法),除此之外,抽象類還能定義抽象方法。
抽象方法寫法:修飾符 abstract 返回值類型 函數名(參數列表);
修飾符只能是protected或者public,抽象方法不能寫方法體,具體的實現方法要交給子類去寫。
1 abstract class ClassName 2 { 3 int num;//默認被protected修飾的成員變量 4 public String str;//公共的成員變量 5 public static int nums = 10;//靜態成員變量 6 public final static int numss = 10;//常量 7 public ClassName(){ 8 System.out.println("這是一個構造函數。");9 } 10 abstract void method();//默認被protected修飾的抽象方法 11 public abstract void function();//公共權限的抽象方法 12 }
抽象類正常情況下需要寫抽象方法(不寫也不會報錯),但不寫的話,那又和普通類又有什麽區別,並且他自己還不能被實例化。所以,它需要被繼承(沒有被繼承也不會報錯),但如果不被繼承,那麽抽象類存在的意義呢。
子類(如果不是抽象類)必須重寫抽象類中的全部抽象方法。所以,abstract不能與private、static、final或native並列修飾同一個方法。
classClassNameSon extends ClassName//繼承上面的抽象函數 { void method(){}//如果子類不是抽象類,就必須重寫父類的抽象函數 public void function(){}//重寫的函數的訪問權限不能低於父類 }
抽象類總結:抽象類是被用來創建繼承層級裏子類的模板。
接口(interface)
接口是一些方法特征的集合,這些方法特征來自於具體方法,這些方法符合它們一般來自於一些在系統中不斷出現的方法。一個接口只有方法的特征,而沒有方法的實現,因此這些方法在不同的地方被實現時,可以具有完全不同的行為。
接口的定義:和類定義不同,定義接口不再使用class關鍵字,而是使用interface關鍵字。
1 interface InterfaceName 2 { 3 }
接口不是類,他沒有構造函數,也不能被實例化。接口裏只有兩種成員:常量和抽象方法。
常量寫法規範:public final static [數據類型] 常量名 = value;
由於總是使用public static/final修飾符,即使定義時不添加public static/final修飾符,系統也會自動加上,所以可以省略它們。
接口裏的抽象方法和抽象類裏抽象方法的寫法一樣。
但是由於接口裏只有抽象方法,且它們總是使用public abstract修飾符,即使定義時不添加public abstract修飾符,系統也會自動加上,所以可以省略它們。
1 interface InterfaceName 2 { 3 int num1 = 1; 4 public int num2 = 1; 5 public static int num3 = 1; 6 public final int num4 = 1; 7 public final static int num5 = 1;//在接口中,上面num1-num4都是num5這個常量寫法的簡寫 8 9 void method1(); 10 public void method2(); 11 abstract void method3(); 12 public abstract void method4();//在接口中,method1-method3都是method4這個方法寫法的簡寫 13 }
接口總結:接口是實現它的類所需要遵守的規範。
類、抽象類和接口
1.與抽象類相比,接口的方法都是公共權限的抽象方法,所以它是純用來被繼承、被實現的,否則它將毫無意義。
2.類之間只能單繼承(抽象類也是類),接口之間可以多繼承。
3.類可以在繼承一個類的同時實現多個接口(包括一個)。
interface Interface1 extends Interface2,Interface3//繼承了兩個接口,可以繼承多個 {} interface Interface2{} interface Interface3{}//空接口 class ClassName//空類 { } class ClassNameSon extends ClassName implements Interface2,Interface3//只能繼承一個類,可以實現多個接口, { }
4.抽象類實現接口,可以不重寫接口裏面的抽象方法,但這個抽象類的子類(普通類)必須重寫接口的抽象方法。
5.可以用子類調用父類(不管多少代)的常量,包括被實現的接口的常量。抽象類和接口可以直接用自己的類名或接口名調用自己的常量。
1 public class Blog { 2 public static void main(String[] args) { 3 System.out.println(TheInterface.str);//接口調用自己的常量 4 System.out.println(TheAbstract.str);//抽象類名調用接口的常量 5 System.out.println(ClassName.str);//調用父類接口的常量 6 } 7 } 8 interface TheInterface{ 9 String str = "What happened!";//常量簡寫 10 void method();//抽象方法簡寫 11 } 12 abstract class TheAbstract implements TheInterface{//抽象類可以不重寫父類或被實現接口的抽象方法 13 public void myMethod(){ 14 } 15 } 16 class ClassName extends TheAbstract{ 17 public void method(){}//父類(包括‘祖宗類’,被implements的接口或祖宗接口)的沒有被重寫的抽象方法都必須重寫 18 }
Java抽象類和接口