Java 中的抽象類,接口

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抽象類與接口的區別

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章