Java的一個重要特性就是抽象,抽象是指將具體的事物抽象成更一般化、更抽象化的概念或模型。在Java中,抽象可以通過抽象類和接口來實現,它們讓你能夠定義一些方法但不提供具體實現,從而讓子類去實現具體細節。
一、抽象類:
1.1、概念:
Java中的抽象類是一種特殊的類,它不能被實例化,只能被用作其他類的基類。抽象類通常用于定義一些通用的屬性和方法,但是它本身并不完整,而是作為其他類的模板或者基礎。抽象類中可以包含抽象方法,這些方法只有聲明而沒有實現,子類必須實現這些抽象方法才能具體化抽象類。在Java中,使用關鍵字abstract
來聲明一個抽象類。抽象類可以有普通的方法實現,也可以包含抽象方法。如果一個類包含了一個或多個抽象方法,那么這個類必須被聲明為抽象類。
1.2、代碼實例:
abstract class Shape {double area(); // 抽象方法,子類必須實現void draw() {System.out.println("Drawing a shape");}
}class Circle extends Shape {double radius;@Overridedouble area() {return Math.PI * radius * radius;}
}class Rectangle extends Shape {double length;double width;@Overridedouble area() {return length * width;}
}
Shape
是一個抽象類,它定義了一個抽象方法area()
,而Circle
和Rectangle
是Shape
的子類,它們都實現了area()
方法。?
二、接口:
2.1、概念:
在Java中,接口(Interface)是一種抽象類型,它定義了一組方法的規范,但是不提供這些方法的具體實現。接口可以看作是一種約定,規定了類應該具備的行為,但不關心這些行為的具體實現方式。類通過實現(implement)接口來承諾實現接口中定義的所有方法。Java中的接口使用關鍵字interface
來聲明,接口中的方法默認都是抽象的,不需要使用abstract
關鍵字進行標識。接口用于定義一種行為或能力,但并不是所有類都必須實現這種行為或能力。因此,通過接口,我們可以在需要的時候為類添加額外的行為,而不是強制所有類都具備這種行為。
2.2、代碼實例:
interface Animal {void eat(); // 抽象方法void sleep(); // 抽象方法
}class Dog implements Animal {@Overridepublic void eat() {System.out.println("Dog is eating");}@Overridepublic void sleep() {System.out.println("Dog is sleeping");}
}
Animal
是一個接口,定義了eat()
和sleep()
兩個抽象方法。Dog
類通過implements
關鍵字實現了Animal
接口,并提供了eat()
和sleep()
方法的具體實現。
三、抽象類和接口的區別:
1.1、抽象類可以有實現好的具體函數,但接口不可以,必須全部是抽象方法。
1.2、抽象類可以有成員變量,但接口只能有靜態常量(static final修飾)。
1.3、由于Java的單繼承制,一個類(普通)只能繼承一個抽象類;但可以實現多個接口,從而具備多個接口所定義的行為。這種多重繼承的方式有助于解決Java單繼承的限制,提高了代碼的靈活性和復用性。
1.4、關鍵字不同:抽象類abstract,接口interface。
1.5、抽象類可以有構造方法,但是接口沒有構造方法。
1.6、抽象類通常用于具有一些共同特征的類,而接口用于定義類之間的契約,即類應該如何行為。
1.7、抽象類就像是一種帶有一些具體實現的藍圖,而接口更像是一份規范,告訴類應該有哪些功能和行為。