一、概念
有时候,一个父类设计得非常抽象,以至于它都没有任何具体的实例。这样的类称为抽象类。
抽象方法,是指没有方法体的方法,同时抽象方法还必须使用关键字abstract做修饰。
而拥有抽象方法的类就是抽象类,抽象类要使用abstract关键字声明。
二、定义
定义代码如下:
abstract class 抽象类名 {
public void 普通方法名1 {
...
}
public abstract void 抽象方法名;
}
三、注意点
1.包含抽象方法的类就会自动变成抽象类;
2.抽象方法被用来确保派生类会实现这个方法;
3.不论抽象类是否含抽象方法,其都不允许实例化;
4.若父类是抽象类,且子类不想成为抽象类,则子类必须将父类中的所有抽象方法重写为带方法体的普通方法;
5.使用原则:
(1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public;
(2)抽象类不能直接实例化,需要依靠子类采用向上转型的方式处理;
(3)抽象类必须有子类,使用extends继承,一个子类只能继承一个抽象类;
(4)子类如果不是抽象类则必须覆写抽象类之中的全部抽象方法;
四、实例
(一)代码
定义的GeometricObject普通类代码如下:
public class GeometricObject {
private String color = "white";
private boolean filled;
private java.util.Date dateCreated;
public GeometricObject() {
dateCreated = new java.util.Date();
}
public GeometricObject(String color, boolean filled) {
dateCreated = new java.util.Date();
this.color = color;
this.filled = filled;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public boolean isFilled() {
return filled;
}
public void setFilled(boolean filled) {
this.filled = filled;
}
public java.util.Date getDateCreated(){
return dateCreated;
}
public String toString() {
return "created on " + dateCreated + "\ncolor: "
+ color + " and filled: " + filled;
}
}
定义的GeometricObject抽象类代码如下:
public class GeometricObject {
private String color = "white";
private boolean filled;
private java.util.Date dateCreated;
public GeometricObject() {
dateCreated = new java.util.Date();
}
public GeometricObject(String color, boolean filled) {
dateCreated = new java.util.Date();
this.color = color;
this.filled = filled;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public boolean isFilled() {
return filled;
}
public void setFilled(boolean filled) {
this.filled = filled;
}
public java.util.Date getDateCreated(){
return dateCreated;
}
public String toString() {
return "created on " + dateCreated + "\ncolor: "
+ color + " and filled: " + filled;
}
public abstract double getArea();
public abstract double getPerimeter();
}
(二)区别
区别在于抽象类多了如下代码:
public abstract double getArea();
public abstract double getPerimeter();
这使得GeometricObject的子类中计算几何对象面积和周长的方法在GeometricObject类中都可以实现。