目录
抽象类和抽象方法
抽象类:使用abstract修饰的类就是抽象类。总结起来,抽象类的特性就是有得有失:
- 得:就是可以设置抽象方法
- 失:就是不能创建实例
- 其他的普通类可以有的抽象类也可以有
【抽象类的注意点】
- 虽然抽象类不能创建实例,但他依然有构造器,它的构造器主要是供其子类构造器调用的
- 抽象类自己完全没有抽象方法
- 抽象类总是不能创建实例的 —— 即使它没有包含任何抽象方法
抽象方法:使用abstract修饰且没有方法体(即没有花括号的方法)
【抽象方法的注意点】
- 抽象方法没有方法体
- 只要在方法后出现花括号,即使花括号中没有任何代码,那也是方法体
- abstract不能与final同时出现:
- 对于abstract方法而言,该方法需要子类去重写该方法,final不允许被重写,因此不能同时出现
- 对于abstract类而言,该类是希望有子类去继承它的,final修饰的类是不允许被继承的
- abstract与static不能同时修饰方法(见注释1)
- abstract和private不能同时修饰方法,因为abstract修饰的方法希望被子类重写,而private修饰的方法子类是无法获取的
为什么要使用抽象类
主要和“模板模式”结合在一起
需求场景:程序需要实现A方法,但是A方法又需要调用B方法。但此时,B方法暂时不知道如何实现(不同的子类对B方法的实现【是不同】)。此时就是需要把B方法定义成抽象方法。
Volume.java
//定义一个抽象类
public abstract class Volume {
public Volume() {
}
// 定义一个抽象的实现求体积的方法
public abstract double getVolume();
}
Cube.java
public class Cube extends Volume {
// 定义成员变量,正方体的边长
private double edge;
// 定义一个无参数的构造器,一个有参数构造器
public Cube() {
}
public Cube(double edge) {
this.edge = edge;
}
// 因为成员变量时private修饰,所以需要setter和getter方法获取相关数据
public double getEdge() {
return edge;
}
public void setEdge(double edge) {
this.edge = edge;
}
// 重写getVolume方法
@Override
public double getVolume() {
return edge * edge * edge;
}
}
Cylinder.java
public class Cylinder extends Volume {
// 定义成员变量,圆柱体的底面半径和高
private double radius;
private double height;
// 创建两个构造器,一个无参数构造器,一个有参数构造器
public Cylinder() {
}
public Cylinder(double radius, double height) {
this.radius = radius;
this.height = height;
}
/// 因为成员变量时private修饰,所以需要setter和getter方法获取相关数据
public void setRadius(double radius) {
this.radius = radius;
}
public double getRadius() {
return radius;
}
public void setHeight(double height) {
this.height = height;
}
public double getHeight() {
return height;
}
// 重写getVolume方法
@Override
public double getVolume() {
return Math.PI * radius * radius * height;
}
}
AbstractTest.java
public class AbstractTest {
public static void main(String[] args) {
// 多态,向上转型
Volume cylinder = new Cylinder(3.14, 5.56);
Volume cube = new Cube(5.6);
System.out.println("圆柱体的体积:" + cylinder.getVolume());
System.out.println("正方体的体积:" + cube.getVolume());
}
}
【注释1】当static修饰方法的时候,说明这个方法属于类本身。调用这个方法时,可以直接通过类调用。当使用abstract修饰该方法时,该方法是没有方法体的。此时,若通过类调用该方法,就会出现错误(调用没有方法的方法体)