要把一个方法写为抽象方法,需要在方法前加上abstract关键字,且方法没有方法体。如果某类中有方法是抽象方法,那么这个类是抽象类。
换句话说:方法加上abstract关键字,并由有抽象方法的类叫做抽象类。
如以下代码:
public abstract class Shape {
public String shapeName; //属性
public Shape() { //默认无参数构造方法
}
public abstract double getArea(); //抽象方法
}
假设如果我们设计一个图形类 Shape(父类),其中有一个求面积的方法 getArea(),但是对于不同的图形(子类)来说,求面积的过程并不一样,这该怎么办呢?
可能有的同学会说,既然各种图形求面积的方法不一样,那干脆父类不定义求面积方法,交由子类定义不就行了?其实,这不是一个好办法,我们已经学过继承了,我们知道,对于子类扩充的方法,父类引用的子类对象将无法使用,也就是说,假如 Shape 类引用了不子类对象,那么该子类对象将无法调用 getArea()方法,这就降低了程序的灵活性。那么怎样才能让父类不实现 getArea()方法,又能让 Shape 引用的子类对象能使用 getArea()方法呢?这就要用抽象类来解决,我们需要在父类中把该方法写为抽象方法(虚方法),即不提供该方法的具体实现,交由子类实现。
代码如下:
//图形类(父类)
public abstract class Shape {
//属性
public String shapeName; //图形名称
//默认无参数构造方法
public Shape() {
}
//有参数构造方法
public Shape(String shapeName) {
this.shapeName = shapeName;
}
//定义了一个抽象方法:求面积
public abstract double getArea();
//已实现方法:介绍
public void showShape() {
System.out.println("正在操作的图形为: " + shapeName);
}
}
//长方形(子类)
public class Rectangle extends Shape {
//属性
public double width; //长
public double length; //宽
//默认无参数构造方法
public Rectangle() {
}
//有参构造方法
public Rectangle(String shapeName, double width,double length) {
super(shapeName);
this.width = width;
this.length = length;
}
//实现父类抽象方法:求长方形面积
public double getArea() {
System.out.println("长方形面积为: "+width * length);
return width * length;
}
public static void main(String[] args) {
Rectangle dd= new Rectangle("长方形",2,4);
dd.getArea();
}
}
在代码中,Shape类被定义为抽象类,其中有getArea()抽象方法,Rectangle类继承Shape类,实现了父类的抽象方法。
那么有一种情况,如果子类并没有实现父类的方法,那么子类也就是属于抽象类,类前要加abstract关键字!
下面在mian函数里实现子类,并查看是否继承实现了父类的抽象方法,代码如下
//main函数
public static void main(String[] args) {
//对象实例化
Rectangle dd= new Rectangle("长方形",2,4);
//调用getArea()方法
dd.getArea();
}
输出结果如下:
抽象类还要注意以下几点:
- 如果一个类是一个 abstract 类的子类,它必须具体实现父类的 abstract()方法,否则子类也是抽象类。
- 如果一个类中含有 abstract 方法,那么这个类必须用 abstract 来修饰(abstract 类也可以没有 abstract 方法)。
- 一个 abstract 类只关心它的子类是否具有某种功能,并不关心功能的具体行为,功能的具体行为由子类负责实现,所以抽象类可以实现类型隐藏。
- 由于抽象类具有未实现的方法,所以不能创建对象,但可引用子类对象。
- 不能定义一个既是 final 又是 abstract 的类,因为这是自相矛盾的。final 类代表类不能被继承,而 abstract 类代表此抽象类需要子类继承来实现抽象方法。