概念:
一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
示例:
public abstract class Shape {public int width; // 几何图形的长public int height; // 几何图形的宽public Shape(int width, int height) {this.width = width;this.height = height;}public abstract double area(); // 定义抽象方法,计算面积}
public class Square extends Shape {public Square(int width, int height) {super(width, height);}// 重写父类中的抽象方法,实现计算正方形面积的功能@Overridepublic double area() {return width * height;}}
public class Triangle extends Shape {public Triangle(int width, int height) {super(width, height);}// 重写父类中的抽象方法,实现计算三角形面积的功能@Overridepublic double area() {return 0.5 * width * height;}}
public class ShapeTest {public static void main(String[] args) {Square square = new Square(5, 4); // 创建正方形类对象System.out.println("正方形的面积为:" + square.area());Triangle triangle = new Triangle(2, 5); // 创建三角形类对象System.out.println("三角形的面积为:" + triangle.area());}}//输出结果//正方形的面积为:20.0//三角形的面积为:5.0
抽象类总结:
- 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
- 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
- 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
- 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
- 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
- 抽象方法没有方法体。
- abstract 关键字修饰抽象方法时不能使用 private 修饰,因为抽象方法必须被子类重写,而如果使用了 private 声明,则子类是无法重写的。
- 抽象类和抽象方法都要使用 abstract 关键字声明。
- 如果一个方法被声明为抽象的,那么这个类也必须声明为抽象的。而一个抽象类中,可以有 0~n 个抽象方法,以及 0~n 个具体方法。
