抽象类
在java中,抽象类是一种不能实例化的类,通常用于表示一个抽象概念或者提供一个抽象模板,供其他类继承。抽象类包括抽象方法(没有实现的方法)和具体方法(有实现的方法)。
抽象类的特点:
- 不能被实例化。
- 包含抽象方法。抽象方法没有具体的实现,它只声明方法的签名,具体的实现由子类提供。
- 包含具体方法。抽象类也可以包含具体方法,这些方法有实现的代码。
- 子类继承。其他类可以通过继承来扩展抽象类,子类必须实现抽象类中的所有抽象方法,除非子类也是抽象类。
抽象方法,在方法头中用abstract修饰。包含抽象方法的类就成为一个抽象类,在类头用abstract修饰。
抽象方法:
1、所有的子类都具有的共同的行为特征,该行为特征在父类不可描述
2、只有方法的定义没有方法的实现,交由子类去实现。
举个例子:假如Geometric类定义成Circle和Rectangle的父类。Geometric类模拟了几何对象的共同特征。Circle类和Rectangle类分别包含计算面积和周长的方法getArea()和getPerimeter().。因为可以计算所有几何对象的面积和周长。但是这样的方法不能在Geometric类中实现,因为它们的实现取决于几何对象的具体类型。
package edu.uestc.avatar.geometric;
import java.time.LocalDate;
/**
* 抽象类可以有构造方法,但是不能创建抽象类的实例,交给子类的构造方法进行调用
*
*/
public abstract class Geometric {
private LocalDate createDate;
private String color;
private boolean filled;
public Geometric() {
this.createDate = LocalDate.now();//当前系统日期
}
public Geometric(String color, boolean filled) {
this.createDate = LocalDate.now();//当前系统日期
this.color = color;
this.filled = filled;
}
public LocalDate getCreateDate() {
return createDate;
}
public void setCreateDate(LocalDate createDate) {
this.createDate = createDate;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public boolean isFilled() {
return filled;
}
public void setFilled(boolean filled) {
this.filled = filled;
}
/**
* 抽象方法:所有的子类都具有的共同的行为特征,该行为特征在父类不可描述----抽象方法
* 只有方法的定义没有方法的实现,交由子类去实现
* 包含抽象方法的类必须是一个抽象类
* @return
*/
public abstract double getArea();
public abstract double getPerimeter();
}
由于其计算周长和面积的具体方法在父类中不可描述,要交给子类去实现:如下例子:circle.java
子类继承抽象类,必选实现抽象类中所有的抽象方法,否则子类也应该是一个抽象类,交由具体的子类去实现。
/**
* 子类继承抽象类,必选实现抽象类中所有的抽象方法,否则子类也应该是一个抽象类,交由具体的子类去实现
*
*/
public class Circle extends Geometric{
public static final double PI = 3.14;
private double radius;
public Circle() {
}
public Circle(double radius) {
this.radius = radius;
}
public Circle(double radius,String color,boolean filled) {
super(color,filled);
this.radius = radius;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
/**
* 计算圆几何图形的面积
*/
public double getArea() {
return PI * radius * radius;
}
public double getPerimeter() {
return 2 * PI * radius;
}
@Override //edu.uestc.avatar.geometric.Circle@24356b
public String toString() {
String ret = "circle:(area:" + getArea() + ",perimeter:" + getPerimeter();
if(isFilled())
ret += "filled, color:" + getColor();
return ret + ")";
}
}
第二个子类 rectangle.java
public class Rectangle extends Geometric{
private double width;
private double height;
public Rectangle() {
}
public Rectangle(double width,double height) {
this.width = width;
this.height = height;
}
public Rectangle(double width,double height,String color,boolean filled) {
super(color,filled);
this.width = width;
this.height = height;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
@Override
public double getPerimeter() {
return 2 * (width + height);
}
@Override
public double getArea() {
return width * height;
}
}
以上就是抽象类相关知识点。但是我们为何要使用抽象方法呢?
抽象方法的优点
- 强制子类实现:抽象方法强制子类必须提供具体的实现。这有助于确保所有继承自抽象类的子类都遵循相同的接口规范,从而保证多态性。
- 定义通用接口:抽象方法定义了一个通用的行为接口,而具体的实现则留给子类去完成。这样,抽象类就可以作为一个通用的模板,而具体的行为则由子类根据实际情况来实现。
- 代码复用:抽象类可以包含一些通用的代码,这些代码可以在子类中复用。子类可以继承这些代码,并根据自己的需求进行扩展或修改。
- 提高可维护性:抽象方法使得代码更加模块化和可维护。通过定义抽象方法,开发者可以清晰地定义类的职责和功能,使得代码结构更加清晰。
- 多态性:抽象方法是实现多态的关键。在Java中,多态允许我们使用父类的引用来引用子类的对象,从而可以在运行时动态地调用子类的方法。
抽象方法和抽象类的命令规则
- 抽象方法必须使用abstract 进行修饰,抽象类也必须使用abstract 进行修饰,抽象方法不能具有具体的方法体。
- 抽象类不能被实例化,即不能使用关键字new 创建对象实例。
- 抽象类可以包含属性、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类、枚举类六种成分。抽象类的构造器不能用于创建实例,主要用于被其子类调用。
- 含有抽象方法的类只能被定义成抽象类。