抽象方法只有方法签名,没有方法实现的方法。

1. 抽象方法和抽象类

抽象方法和抽象类必须使用 abstract 修饰符来定义
有抽象方法的类只能被定义成抽象类
抽象类里面可以没有抽象方法

  • 抽象类必须使用abstract 修饰符来修饰,抽象方法也必须使用abstract 修饰符来修饰,抽象方法不能有方法体
  • 抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。即使抽象类里不包含抽象方法,这个抽象类也不能创建实例。
  • 抽象类可以包含成员变量、方法(普通方法和抽象方法都可以) 、构造器、初始化块、内部类(接口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被子类调用
  • 含有抽象方法的类(包括直接定义了一个抽象方法;或继承了一个抽象父类,但没有完全实现父类包含的抽象方法;或实现了一个接口,但没有完全实现接口包含的抽象方法三种情况)只能被定义成抽象类。

注: 1. 抽象类可以包含抽象方法
2. 抽象类不能用于创建实例

当使用abstract 修饰类时,表明这个类只能被继承;
当abstract 修饰方法时,表明这个方法必须由子类提供实现(即重写)。

  1. public abstract class SpeedMeter
  2. {
  3. // 转速
  4. private double turnRate;
  5. public SpeedMeter(){};
  6. // 把计算车轮周长的方法定义成抽象方法
  7. public abstract double calGirth();
  8. public void setTurnRate(double turnRate)
  9. {
  10. this.turnRate = turnRate;
  11. }
  12. // 定义计算速度的通用算法
  13. public double getSpeed()
  14. {
  15. // 速度等于 周长*转速
  16. return calGirth() * turnRate;
  17. }
  18. }
  19. public class CarSpeedMeter extends SpeedMeter
  20. {
  21. private double radius;
  22. public CarSpeedMeter(double radius)
  23. {
  24. this.radius = radius;
  25. }
  26. public double calGirth()
  27. {
  28. return radius * 2 *Math.PI;
  29. }
  30. public static void main(String[] args)
  31. {
  32. var csm = new CarSpeedMeter(0.34);
  33. csm.setTurnRate(15);
  34. System.out.println(csm.getsSpeed());
  35. }
  36. }