文章目录
- 抽象类
- 抽象类概念
- 抽象类语法
- 抽象类特性
- 抽象类的作用
- 抽象类总结
抽象类
抽象类概念
如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
比如:
说明:
- 矩形、圆形、三角形都是图形,因此和GRaphael类的关系应该是继承关系。
- 虽然图形Graph中也存在draw的方法,但是由于Graph不是具体的图形,因此其内部的draw方法实际是没有办法2实现的。
- 由于Graph没有办法描述一个具体的图形,导致其draw方法无法具体实现,因此可以将Graph设置为“抽象类”。
Graph的draw方法并没有什么具体的作用,像这种没有实际工作的方法, 我们可以把它设计成一个 抽象方法,包含抽象方法的类我们称为 抽象类。(abstract class)
抽象类语法
在Java中,一个类如果被 abstract 修饰,这个类就称为抽象类。抽象类中被 abstract 修饰的方法称为 抽象方法,抽象方法不用给出具体的实现体。
// 抽象类:被abstract修饰的类public abstract class Graph {// 抽象方法:被abstract修饰的方法,没有方法体abstract public void draw();abstract void calcArea();// 抽象类也是类,也可以增加普通方法和属性public double getArea(){return area;}protected double area; // 面积}
注意:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法。
抽象类特性
- 抽象类不能直接实例化对象。
可以看到代码报错。
- 抽象方法不能是 private 的。
代码报错
注意:抽象方法没有加访问限定符时,默认是public。
- 抽象方法不能被final和static修饰,因为抽象方法要被子类重写。
代码报错
- 抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用 abstract 修饰。
代码会报错
abstract class Graph1 {abstract public void draw();//画图形abstract void calcArea();public double getArea(){return area;}protected double area;}//矩形类class Rectangle extends Graph1 {private double length;private double width;Rectangle(double length, double width) {this.length = length;this.width = width;}public void calcArea(){area = length * width;}}//圆形类class Cycle extends Graph1 {private double r;final private static double PI = 3.14;public Cycle(double r){this.r = r;}public void draw(){System.out.println("圆:r = "+r);}public void calcArea(){area = PI * r * r;}}//三角形类class Triangle extends Graph1 {private double a;private double b;private double c;@Overridepublic void draw() {System.out.println("三角形:a = " + a + " b = " + b + " c = " + c);}}public class TestDemo {}
- 抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类。
- 抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量。
抽象类的作用
当实际工作不应该由父类完成,而应由子类完成.。那么此时如果不小心误用成父类了,使用普通类编译器是不会报错的。但是父类是抽象类就会在实例化的时候提示错误,让我们尽早发现问题。
就像上面的图形例子,画图形的实现不是父类来完成的,而是由子类来完成的。
抽象类总结
【总结】
- 抽象类使用abstract修饰类。
- 抽象类当中可以包含普通类所能包含的成员。
- 抽象类和普通成员不一样的是,抽象类当中可以包含抽象方法。
- 抽象方法是使用abstract修饰的,这个方法没有具体的实现。
- 不能实例化抽象类。(new)
- 抽象类存在的最大意义就是被继承。
- 如果一个普通类继承了抽象类,此时必须重写抽象类当中的方法。
- 如果一个抽象类A继承了一个抽象类B,此时A当中不需要重写B当中抽象方法。但是如果A再被普通类继承,就需要重写。