一、抽象方法(Abstract Method)
📖 被abstract
关键字修饰的方法就是抽象方法
📖 抽象方法只能定义在抽象类或接口中
📜 被
abstract
关键字修饰的类就是抽象类📜 接口通过
interface
关键字创建;类通过class
关键字创建
📖 抽象方法只有方法声明,没有方法实现(参数列表后面不是大括号,而是 ;【分号】)
📖 抽象方法不能被private
关键字修饰
📜 定义抽象方法就是希望让子类去继承的
📖 抽象方法不能被 static
关键字修饰
📜 抽象方法只能是实例方法,不能是类方法
📖 抽象方法不能被 final
关键字修饰
📜 抽象方法天生就是要被重写的(被
final
关键字修饰的方法不能被重写)
二、抽象类(Abstract Class)
✏️ 抽象类在非抽象类的基础上多了一个功能:可以定义抽象方法
✏️ 抽象类在非抽象类的基础上少了被实例化的能力
📖 抽象类:被abstract
关键字修饰的类
📜 抽象类内部可以定义抽象方法
📜 抽象类不能被实例化,但可以有构造方法(抽象类的构造方法是拿来让子类调用的)
📜 子类必须实现抽象父类中的所有抽象方法(除非子类也是抽象类)
📜 抽象类可以像非抽象类一样定义成员变量、常量、嵌套类型、初始化块、非抽象方法等
📜 抽象类也可以完全不定义抽象方法
三、抽象类使用场景(特别好用)
📖【抽取子类的公共实现】抽取子类的公共实现到抽象父类中,要求子类必须要单独实现的定义成抽象方法
☆ 抽象类案例(圆和矩形的面积与周长)
① 未使用抽象类抽取公共代码前
圆类:
public class Circle { /* 半径 */ private double radius; /* 周长 */ private double girth; /* 面积 */ private double area; public Circle(double radius) { this.radius = radius; } /** * 返回圆的面积 */ public double getArea() { return area; } /** * 返回圆的周长 */ public double getGirth() { return girth; } public void showAreaGirth() { // half: 周长的一半 double half = Math.PI * radius; area = half * radius; girth = 2 * half; System.out.println("\n---------圆--------"); System.out.println("周长:" + girth); System.out.println("面积:" + area); System.out.println("-------------------"); } }
矩形类:
public class Rectangle { /* 宽 */ private double width; /* 高 */ private double height; /* 面积 */ private double area; /* 周长 */ private double girth; public Rectangle(double width, double height) { this.width = width; this.height = height; } /** * 返回矩形的面积 */ public double getArea() { return area; } /** * 返回矩形的周长 */ public double getGirth() { return girth; } public void showAreaGirth() { area = width * height; girth = 2 * (width + height); System.out.println("\n---------矩形--------"); System.out.println("周长:" + girth); System.out.println("面积:" + area); System.out.println("---------------------"); } }
测试类
public class TestDemo { public static void main(String[] args) { Circle circle = new Circle(3); circle.showAreaGirth(); Rectangle rectangle = new Rectangle(2, 8); rectangle.showAreaGirth(); /* output: ---------圆-------- 周长:18.84955592153876 面积:28.274333882308138 ------------------- ---------矩形-------- 周长:20.0 面积:16.0 --------------------- */ } }
📜
Circle
和Rectangle
两个类中都有 area、girth 两个属性和 getArea、getGirth、showAreaGirth 三个方法📜
Circle
和Rectangle
两个类中的 getArea 和 getGirth 的实现一模一样,并且 showAreaGirth 中的部分代码也是一样的📜 可通过抽象类这种技术把两个类中的代码进行抽取
② 使用抽象类抽取代码
抽象父类:
public abstract class ShapeAbstract { protected double area; protected double girth; public double getArea() { return area; } public double getGirth() { return girth; } protected abstract String calculate(); public void showAreaGirth() { String shape = calculate(); System.out.println("\n---------" + shape + "--------"); System.out.println("周长:" + girth); System.out.println("面积:" + area); System.out.println("-------------------"); } }
圆
public class Circle extends ShapeAbstract { private double radius; public Circle(double radius) { this.radius = radius; } @Override protected String calculate() { double half = Math.PI * radius; area = half * radius; girth = 2 * half; return "圆"; } }
矩形
public class Rectangle extends ShapeAbstract { private double width; private double height; public Rectangle(double width, double height) { this.width = width; this.height = height; } @Override protected String calculate() { area = width * height; girth = 2 * (width + height); return "矩形"; } }
📌 结束!如有错误,请不吝赐教。