Java抽象类
1、java抽象类
抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法必须用 abstract 关键字进行修饰。如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用 abstract 关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。
抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。对于一个父类,如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为 abstract 方法,此时这个类也就成为 abstract 类了。
包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法。
2、抽象类应用场景
比较两个图形的面积和周长:
定义一个抽象类Shape,Shape类定义抽象方法area()和perimeter()
Shape类:
public abstract double area();
public abstract double perimeter();
定义Rectangle类和Circle类继承于Shape类
Rectangle类和Circle类各自实现area()和perimeter()
Rectangle类:
private double length;
private double width;
public double getLength() {
return length;
}
public void setLength(double length) {
this.length = length;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
@Override
public double area() {
return getLength() * getWidth();
}
@Override
public double perimeter() {
return 2 * (getLength() + getWidth());
}
Circle类:
private double diameter;
public double getDiameter() {
return diameter;
}
public void setDiameter(double diameter) {
this.diameter = diameter;
}
@Override
public double area() {
return Math.PI * Math.pow(getDiameter() / 2, 2);
}
@Override
public double perimeter() {
return Math.PI * getDiameter();
}
测试类:
public static void main(String [] args){
Rectangle rec = new Rectangle();
rec.setLength(10);
rec.setWidth(5);
double rec_area = rec.area();
double rec_perimeter = rec.perimeter();
System.out.println(“矩形的面积:”+rec_area+",周长"+rec_perimeter);
Circle cir = new Circle();
cir.setDiameter(10);
double cir_area = cir.area();
double cir_perimeter = cir.perimeter();
System.out.println("圆形的面积:"+cir_area+",周长"+cir_perimeter);
}
运行结果
抽象类可以看作是对多种具有相似物品的一种归纳,比如说三角形、矩形、圆形都是图形,可以计算面积、周长等。我们就可以从中抽象出图形类,以及面积、周长两个抽象方法。由于不知道图形具体是什么,所以图形抽象类不能被实例化。当我们知道图形具体对应的是三角形、矩形、圆形或其他图形时,就可以进行实例化,再在这些子类中分别重写计算周长、面积的方法。
3、抽象类的理解
抽象类和普通类的主要有两个区别:抽象类不能用来创建对象;如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为 abstract 类。
总的来说抽象类就是为了减少代码的冗余。抽象类相当于一个模板,在这个模板中子类可以根据自身不同的特性,以不同的方式重写抽象方法。