/*
當多個類中出現相同功能,但是功能主體不同,
這是可以進行向上抽取。這時,隻抽取功能定義,而不抽取功能主體。
抽象:看不懂。
抽象類的特點:
1,抽象方法一定在抽象類中。
2,抽象方法和抽象類都必須被abstract關鍵字修飾。
3,抽象類不可以用new建立對象。因為調用抽象方法沒意義。
4,抽象類中的抽象方法要被使用,必須由子類複寫起所有的抽象方法後,建立子類對象調用。
如果子類隻覆寫了部分抽象方法,那麼該子類還是一個抽象類。
Java抽象類的定:java抽象類展現資料抽象的思想,是實作程式多态性的一種手段。也提到抽象類與抽象方法的限制,下面我們會通過一下java抽象類小示例來給你介紹抽象類的用法。希望對你有所幫助。
假設我們要編寫一個計算矩形、三角形和圓的面積與周長的程式,若按前面所學的方式程式設計,我們必須定義四個類:圓類、三角形類、矩形類和使用前三個類的公共類,它們之間沒有繼承關系.
程式寫好後雖然能執行,但從程式的整體結構上看,三個類之間的許多共同屬性和操作在程式中沒有很好地被利用,需要重複編寫代碼,降低了程式的開發效率,且使出現錯誤的機會增加。
仔細分析上面例子中的三個類,可以看到這三個類都要計算面積與周長,雖然公式不同但目标相同。是以,我們可以為這三個類抽象出一個父類,在父類裡定義圓、三角形和矩形三個類共同的資料成員及成員方法。把計算面積與周長的成員方法名放在父類給予說明,再将具體的計算公式在子類中實作.
這樣,我們通過父類就大概知道子類所要完成的任務,而且,這些方法還可以應用于求解平行四邊形、梯形等圖形的周長與面積。這種結構就是抽象類的概念。
Java程式用抽象類(abstract class)來實作自然界的抽象概念。抽象類的作用在于将許多有關的類組織在一起,提供一個公共的類,即抽象類,而那些被它組織在一起的具體的類将作為它的子類由它派生出來。抽象類刻畫了公有行為的特征,并通過繼承機制傳送給它的派生類。
在各子類繼承了父類的抽象方法之後,再分别用不同的語句和方法體來重新定義它,形成若幹個名字相同,傳回值相同,參數清單也相同,目的一緻但是具體實作有一定差别的方法。抽象類中定義抽象方法的目的是實作一個接口,即所有的子類對外都呈現一個相同名字的方法。抽象類是它的所有子類的公共屬性的集合,是包含一個或多個抽象方法的類。使用抽象類的一大優點就是可以充分利用這些公共屬性來提高開發和維護程式的效率。對于抽象類與抽象方法的限制如下:
(1)凡是用abstract 修飾符修飾的類被稱為抽象類。凡是用abstract修飾符修飾的成員方法被稱為抽象方法。
(2)抽象類中可以有零個或多個抽象方法,也可以包含非抽象的方法。
(3)抽象類中可以沒有抽象方法,但是,有抽象方法的類必須是抽象類。
(4)對于抽象方法來說,在抽象類中隻指定其方法名及其類型,而不書寫其實作代碼。
(5)抽象類可以派生子類,在抽象類派生的子類中必須實作抽象類中定義的所有抽象方法。
(6)抽象類不能建立對象,建立對象的工作由抽象類派生的子類來實作。
(7)如果父類中已有同名的abstract方法,則子類中就不能再有同名的抽象方法。
(8)abstract不能與final并列修飾同一個類。
(9)abstract 不能與private、static、final或native并列修飾同一個方法。
Java抽象類應用示例程式Test.java 如下:
public abstract class Shapes {
public int x, y;
public int width, height;
public Shapes(int x, int y, int width, int height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
abstract double getArea();
abstract double getPerimeter();
}
public class Circle extends Shapes {
public double r;
public double getArea() {
return (r * r * Math.PI);
}
public double getPerimeter() {
return (2 * Math.PI * r);
}
public Circle(int x, int y, int width, int heigh) {
super(x, y, width, heigh);
r = (double) width / 2.0;
}
}
public class Square extends Shapes {
public double getArea() {
return (width * height);
}
public double getPerimeter() {
return (2 * width + 2 * height);
}
public Square(int x, int y, int width, int height) {
super(x, y, width, height);
}
}
public class Triangle extends Shapes {
public double c;
public double getArea() {
return (0.5 * width * height);
}
public double getPerimeter() {
return (width + height + c);
}
public Triangle(int x, int y, int base, int height) {
super(x, y, base, height);
c = Math.sqrt(width * width + height * height);
}
}
import java.applet.Applet;
import java.awt.Graphics;
public class Test extends Applet {
Square Box = new Square(5, 15, 25, 25);
Triangle tri = new Triangle(5, 50, 8, 4);
Circle Oval = new Circle(5, 90, 25, 25);
public void paint(Graphics g) {
g.drawRect(Box.x, Box.y, Box.width, Box.height);
g.drawString("Box Area:" + Box.getArea(), 50, 35);
g.drawString("Box Perimeter:" + Box.getPerimeter(), 50, 55);
g.drawString("tri Area:" + tri.getArea(), 50, 75);
g.drawString("tri Perimeter:" + tri.getPerimeter(), 50, 95);
g.drawOval(Oval.x, Oval.y, Oval.width, Oval.height);
g.drawString("oval Area:" + Oval.getArea(), 50, 115);
}
}
可以看出,類Square、類Circle及類Triangle都由抽象類Shape派生而來,它們都實作了getArea 和getPerimeter抽象方法。