我们在描述一类事物的时候,发现该种事物存在着某种行为,但是这种行为目前不是具体的,那么我们可以抽取这种行为的声明,但是不去实现该种行为,这时候这种行为我们称作为抽象的行为,我们就需要使用到抽象类。
抽象类的好处: 可以强制要求子类一定要实现指定的函数。
抽象类要注意的细节:
- 如果一个函数没有方法体,那么该函数必须要使用abstract修饰,把该函数修饰成抽象的函数。
- 如果一个类出现了抽象函数,那么该类也必须使用abstract修饰。
- 如果一个非抽象类继承了抽象类,那么必须把抽象类的所有抽象方法全部实现。
- 抽象类可以存在非抽象方法。
- 抽象类可以没有抽象方法。
- 抽象类是不能创建对象的
Animal a = new Animal();
✖
原因:抽象类是存在抽象方法的,如果能让抽象类创建对象的话,那么使用抽象类的对象调用抽象方法是没有任何意义的,因为抽象方法仅仅是一个声明而已,无实际意义。 - 抽象类是存在构造函数的,其构造函数是提供子类创建对象的时候初始化父类属性的。
case:
public class Main {
public static void main(String[] args) {
Circle c = new Circle(2.0);
Rectangle r = new Rectangle(2.0 ,3.0);
System.out.println("圆的周长为:"+ c.Long());
System.out.println("圆的面积为:"+ c.Area());
System.out.println("矩形的周长为:"+ r.Long());
System.out.println("矩形的面积为:"+ r.Area());
}
}
abstract class Graphic{
public Graphic(){}
abstract double Long();
abstract double Area();
}
class Circle extends Graphic{
private double R;
public static final double Pi = 3.14;
public Circle(double R){
this.R = R;
}
public double Long(){
return Pi * R * 2;
}
public double Area(){
return Pi * R * R;
}
}
class Rectangle extends Graphic{
private double length;
private double width;
public Rectangle (double length, double width){
this.length = length ;
this.width = width;
}
public double Long(){
return 2* (length + width);
}
public double Area(){
return length * width;
}
}