建筑設(shè)計網(wǎng)站大全網(wǎng)站windows優(yōu)化大師是官方的嗎
抽象類
抽象類的概念
在面向?qū)ο蟮母拍钪?#xff0c;所有的對象都是通過類來描繪的,但是反過來,并不是所有的類都是來描繪對象的,如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類。比如:
說明
1.矩形,三角形,圓形都是圖形,因此和Shape類的慣性應(yīng)該是繼承關(guān)系
2.雖然圖形圖Shape中也存在draw方法,但由于Shape類并不是具體的圖形,因此其內(nèi)部的draw方法實際是沒有辦法實現(xiàn)的
3,由于Shape類沒有辦法描述一個具體的圖形,導(dǎo)致其draw方法無法具體實現(xiàn),因此可以將Shape類設(shè)計為“抽象類”?
在打印圖形的例子中,我們發(fā)現(xiàn),父類Shape中的draw方法好像并沒有什么實際工作,主要繪制圖形都是由Shape的各種子類的draw方法來完成的。像這種沒有實際工作的方法,我們可以把它們設(shè)計成一個抽象方法(abstract method),包含抽象方法的類我們成為抽象類(abstract class)
抽象類語法
在Java中,一個類如果被abstract修飾成為抽象類,抽象類中被abstract修飾的方法成為抽象方法,抽象方法不需要給出具體的實現(xiàn)體。
//抽象類:被abstract修飾的類
public abstract class Shape {//抽象方法:被abstract修飾的方法,沒有方法體abstract public void draw();abstract void calcArea();//抽象類也是類,也可以增加普通方法和屬性public double getArea() {return area;}protected double area;//面積
}
注意:抽象類也是類,內(nèi)部可以包含普通方法和屬性,甚至構(gòu)造方法。
抽象類特性
1.抽象類不能直接作為實例化對象
Shape shape = new Shape();//編譯出錯
Error:Shape是抽象的,無法實例化
2.抽象方法不能是private的
abstract class Shape {abstract private void draw();
}//編譯出錯
Error:非法的修飾組合:abstract和private
3.抽象方法不能被final和static修飾,因為抽象方法要被子類重寫
public abstract class Shape {abstract final void methodA();abstract public static void methodB();
}//編譯報錯:
Error:非法的修飾符組合:abstract和final
Error:非法的修飾符組合:abstract和static
4.抽象類必須被繼承,并且繼承后子類要重寫父類中的抽象方法,必須要使用abstract修飾
//矩形類
class Rect extends Shape {private double length;private double width;Rect(double length, double width) {this.length = length;this.width = width;}@Overridepublic void draw() {System.out.println("矩形:length=" + length + " width=" + width);}@Overridepublic void calcArea() {area = width * length;}
}//圓類
class Circle extends Shape {private double r;final private static double PI = 3.14;public Circle(double r) {this.r = r;}@Overridepublic void draw() {System.out.println("圓:r = " + r);}@Overridevoid calcArea() {area = PI * r * r;}
}//三角形類:
abstract class Triangle extends Shape {private double a;private double b;private double c;@Overridepublic void draw() {System.out.println("三角形:a = " + a + "b = " + b + "c = " + c);}//三角形:直角三角形,等腰三角形等,還可以繼續(xù)細化//@Override//double calcArea();//編譯失敗:要么實現(xiàn)該抽象方法,要么將三角形設(shè)計為抽象類
}
5.抽象類中不一定包含抽象方法,但有抽象方法的類一定是抽象類
6.抽象類中可以有構(gòu)造方法,供子類創(chuàng)建對象時,初始化父類成員變量
抽象類的作用
抽象類本身不能被實例化,要想使用,只能創(chuàng)建該抽象方法的子類,然后讓子類重寫父類中的抽象方法。
有些老鐵可能會問:普通的類也可以被繼承啊,那么為什么不使用普通的類呢,它也可以被重寫啊,為啥非要設(shè)計出抽象類和抽象方法呢?
確實,但是使用抽象類相當于多了一重編譯器的校驗。
使用抽象類的場景就如上面的代碼,實際工作不應(yīng)該由父類完成,而應(yīng)該由子類完成。那么此時如果不小心誤用成父類了,使用普通類編譯器是不會報錯的。但是父類是抽象類就會在實例化的時候提示錯誤,讓我們盡早發(fā)現(xiàn)問題。
很多語法存在的意義都是為了“預(yù)防出錯”,例如我們曾經(jīng)用過的final也是類似。創(chuàng)建的變量用戶不去修改,不就相當于常量嗎?但是加上final能夠在不小心誤修改的時候,讓編譯器及時提醒我們。
充分利用編譯器的校驗,在實際開發(fā)中是非常有意義的。