Java基础--- 抽象方法和类 Abstract Methods and Class
抽象方法 — Abstract Method
- 抽象方法只有方法声明没有具体实现,具体是现实是由子类提供
- • 抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法)
抽象类 — Abstract Class
- 用abstract修饰的类叫做抽象类,抽象类不能被实例化,即不能通过new生成一个抽象类的对象, 作用是为某类定义通用方法。
- 可以有抽象方法也可以有正常方法
- 构造方法必须声明为Protected(因为要供子类使用)
- 构造方法可以被private修饰,如果当前类只有一个构造方法且被private修饰,那么其它类是无法创建当前类的对象并且当前类也是不能被继承的(因为子类在实例化时需要调用父类的构造方法)
- 子类(如果不是抽象类)则必须覆写抽象类之中的全部抽象方法(如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类)
- 当一个类有抽象方法时,这个类必须为抽象类
- 一个类可以是抽象类即使它的父类不是抽象类
- 一个类可以被声明为抽象类即使没有任何抽象方法, 这样的类一般被用于子类的基类
抽象类GeometricObject
abstract class GeometricObject {
private String color = "white";
private boolean filled;
private java.util.Date dateCreated;
//无参构造函数
protected GeometricObject(){
dateCreated = new java.util.Date();
}
protected 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;
}
@Override
public String toString(){
return "created on " + dateCreated + "\ncolor: " + color +
" and filled: " + filled+" ";
}
//两个抽象方法
public abstract double getArea();
public abstract double getPerimeter();
}//GeometricObject类结束
抽象类的子类Triangle的实现
class Triangle extends GeometricObject{
private double side1;
private double side2;
private double side3;
//三个构造函数
public Triangle(double side1, double side2, double side3) {
this.side1 = side1;
this.side2 = side2;
this.side3 = side3;
}
public Triangle(String color, boolean filled, double side1, double side2, double side3) {
super(color, filled);
this.side1 = side1;
this.side2 = side2;
this.side3 = side3;
}
public Triangle() {
}
//一定要重写实现抽象父类中的抽象方法
@Override
public double getArea() {
double s = (side1 + side2 + side3)/2;
return Math.sqrt(s*(s-side1)*(s-side2)*(s-side3));
}
@Override
public double getPerimeter() {
return side1+side2+side3;
}
@Override
public String toString() {
return "Triangle{" +
super.toString()+
",side1=" + side1 +
", side2=" + side2 +
", side3=" + side3 +
",Area = " + getArea()+
",Perimeter = " + getPerimeter()+
'}';
}
关于抽象类不能被实列化(使用new operator)
GeometricObject object = new GrometricObject()
- 上面代码会报错
GeometricObject [] objects = new GeometricObject[10]
object[0] = new Circle();
- 上面代码不会报错