被abstract
关键字修饰的方法就是抽象方法
抽象方法只能定义在抽象类或接口中
被
abstract
关键字修饰的类就是抽象类
接口通过interface
关键字创建;类通过class
关键字创建
抽象方法只有方法声明,没有方法实现(参数列表后面不是大括号,而是 ;【分号】)
抽象方法不能被private
关键字修饰
定义抽象方法就是希望让子类去继承的
抽象方法不能被 static
关键字修饰
抽象方法只能是实例方法,不能是类方法
抽象方法不能被 final
关键字修饰
抽象方法天生就是要被重写的(被
final
关键字修饰的方法不能被重写)
✏️ 抽象类在非抽象类的基础上多了一个功能:可以定义抽象方法
✏️ 抽象类在非抽象类的基础上少了被实例化的能力
抽象类:被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 "矩形";
}
}
结束!如有错误,请不吝赐教。