一、抽象方法(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 "矩形";
}
}
📌 结束!如有错误,请不吝赐教。