在java中用abstract關(guān)鍵字聲明的類稱為抽象類。 它可以有抽象和非抽象方法(帶主體的方法)。
在學(xué)習(xí)java抽象類之前,先來了解java中的抽象。
抽象是隱藏實現(xiàn)細(xì)節(jié)并僅向用戶顯示功能的過程。
另一種方式,它只向用戶顯示重要的事情,并隱藏內(nèi)部詳細(xì)信息,例如:發(fā)送短信,只需輸入文本并發(fā)送消息。您也不需要知道有關(guān)郵件傳遞的內(nèi)部處理過程。
抽象可以讓你專注于對象做什么(實現(xiàn)的功能),而不是它如何做。
在java中有兩種實現(xiàn)抽象的方法,它們分別是:
使用 abstract關(guān)鍵字聲明的類被稱為抽象類。需要擴(kuò)展和實現(xiàn)它的方法。 它不能被實例化。
抽象類示例
abstract class A{}
抽象方法
一個被聲明為 abstract 而沒有實現(xiàn)的方法稱為抽象方法。
抽象方法示例
abstract void printStatus();//no body and abstract
具有抽象方法的抽象類的示例
在這個例子中,Bike是一個抽象類,只包含一個抽象方法:run()。 它由 Honda 類提供實現(xiàn)。
abstract class Bike {
abstract void run();
}
class Honda4 extends Bike {
void run() {// run 方法的實現(xiàn)
System.out.println("running safely..");
}
public static void main(String args[]) {
Bike obj = new Honda4();
obj.run();
}
}
上面示例中的代碼執(zhí)行結(jié)果如下 -
running safely..
在這個例子中,Shape是一個抽象類,它的實現(xiàn)分別由Rectangle和Circle類提供。 大多數(shù)情況下,我們不知道實現(xiàn)類(即對最終用戶隱藏),實現(xiàn)類的對象由工廠方法提供。
工廠方法是用于返回類的實例的方法。 稍后我們將在下一節(jié)中了解和學(xué)習(xí)工廠方法。
在這個例子中,創(chuàng)建Rectangle類的實例,Rectangle類的draw()方法將被調(diào)用。創(chuàng)建一個類文件:TestAbstraction1.java ,它的代碼如下所示 -
abstract class Shape {
abstract void draw();
}
// In real scenario, implementation is provided by others i.e. unknown by end
// user
class Rectangle extends Shape {
void draw() {
System.out.println("drawing rectangle");
}
}
class Circle1 extends Shape {
void draw() {
System.out.println("drawing circle");
}
}
// In real scenario, method is called by programmer or user
class TestAbstraction1 {
public static void main(String args[]) {
Shape s = new Circle1();// In real scenario, object is provided through
// method e.g. getShape() method
s.draw();
}
}
上面代碼執(zhí)行結(jié)果如下 -
drawing circle
在java中抽象類的另一個例子
創(chuàng)建一個Java文件:TestBank.java,代碼如下所示 -
abstract class Bank {
abstract int getRateOfInterest();
}
class SBI extends Bank {
int getRateOfInterest() {
return 7;
}
}
class PNB extends Bank {
int getRateOfInterest() {
return 8;
}
}
class TestBank {
public static void main(String args[]) {
Bank b;
b = new SBI();
System.out.println("Rate of Interest is: " + b.getRateOfInterest() + " %");
b = new PNB();
System.out.println("Rate of Interest is: " + b.getRateOfInterest() + " %");
}
}
上面代碼執(zhí)行結(jié)果如下 -
Rate of Interest is: 7 %
Rate of Interest is: 8 %
具有構(gòu)造函數(shù),數(shù)據(jù)成員,方法等的抽象類
抽象類可以有數(shù)據(jù)成員,抽象方法,方法體,構(gòu)造函數(shù)甚至main()方法。創(chuàng)建一個Java文件:TestAbstraction2.java,代碼如下所示 -
//example of abstract class that have method body
abstract class Bike {
Bike() {
System.out.println("bike is created");
}
abstract void run();
void changeGear() {
System.out.println("gear changed");
}
}
class Honda extends Bike {
void run() {
System.out.println("running safely..");
}
}
class TestAbstraction2 {
public static void main(String args[]) {
Bike obj = new Honda();
obj.run();
obj.changeGear();
}
}
上面代碼執(zhí)行結(jié)果如下 -
bike is created
running safely..
gear changed
規(guī)則:如果在類中有任何抽象方法,那個類必須聲明為抽象的。
class Bike12{
abstract void run();
}
上面的 Bike12 是無法編譯通過的。
規(guī)則:如果你擴(kuò)展任何具有抽象方法的抽象類,必須提供方法的實現(xiàn)或使這個類抽象化。
抽象類也可以用于提供接口的一些實現(xiàn)。 在這種情況下,終端用戶可能不會被強(qiáng)制覆蓋接口的所有方法。
注意:如果您是初學(xué)者到Java,請?zhí)^此示例先學(xué)習(xí)接口(interface)。
interface A {
void a();
void b();
void c();
void d();
}
abstract class B implements A {
public void c() {
System.out.println("I am C");
}
}
class M extends B {
public void a() {
System.out.println("I am a");
}
public void b() {
System.out.println("I am b");
}
public void d() {
System.out.println("I am d");
}
}
class Test5 {
public static void main(String args[]) {
A a = new M();
a.a();
a.b();
a.c();
a.d();
}
}
上面代碼執(zhí)行結(jié)果如下 -
I am a
I am b
I am c
I am d