Java abstract抽象方法和抽象类的用法(附带实例)
Java 中可以定义一些不含方法体的方法。它的方法体的实现交给该类的子类自己去完成,这样的方法就是抽象方法。包含抽象方法的类必须是抽象类。
Java 中提供了 abstract 关键字,表示抽象的意思。用 abstract 修饰的方法,称为抽象方法。抽象方法只有方法的声明,没有方法体。
任何包含抽象方法的类都必须声明为抽象类,但是抽象类不一定必须包含抽象方法。
定义抽象类和抽象方法的语法格式如下:
例如:
使用抽象类和抽象方法时要满足的规则如下:
下面给出一个抽象类的实例,体会一下抽象类和抽象方法的定义,以及子类如何实现父类抽象方法的重写。
功能实现:Shape 类是对现实世界形状的抽象,Rectangle 和 Circle 是 Shape 类的两个子类,分别代表现实中两种具体的形状。在子类中根据不同形状的特点计算不同子类对象的面积。
子类 Rectangle 代表长方形,长方形的长宽来自对父类的继承,方法 area() 重写父类抽象的方法area(),从而实现长方形对象面积的计算。
下面代码显示方法 area() 的重写过程:
子类 Circle 代表圆形,圆形的坐标位置来自对父类中数据成员 length 和 width 的继承,方法 area() 重写父类抽象的方法 area(),从而实现圆形对象面积的计算。下面代码显示方法 area() 的重写过程:
Java 中提供了 abstract 关键字,表示抽象的意思。用 abstract 修饰的方法,称为抽象方法。抽象方法只有方法的声明,没有方法体。
任何包含抽象方法的类都必须声明为抽象类,但是抽象类不一定必须包含抽象方法。
定义抽象类和抽象方法的语法格式如下:
【修饰符】abstract class 类名 { 【修饰符】abstract 方法返回值类型 方法名(【参数列表】); // 其他类的成员 }
例如:
abstract class Employee { public abstract earnings(); }
使用抽象类和抽象方法时要满足的规则如下:
- 抽象类必须用 abstract 关键字来修饰,抽象方法也必须用 abstract 来修饰;
- 抽象类不能被实例化,也就是不能用 new 关键字产生对象;
- 抽象方法只需声明,而不必实现;
- 含有抽象方法的类必须被声明为抽象类。抽象类的子类必须覆盖所有的抽象方法后才能被实例化,否则这个子类还是个抽象类。
下面给出一个抽象类的实例,体会一下抽象类和抽象方法的定义,以及子类如何实现父类抽象方法的重写。
功能实现:Shape 类是对现实世界形状的抽象,Rectangle 和 Circle 是 Shape 类的两个子类,分别代表现实中两种具体的形状。在子类中根据不同形状的特点计算不同子类对象的面积。
abstract class Shape { // 定义抽象类 protected double length = 0.0d; protected double width = 0.0d; Shape(double len, double w) { length = len; width = w; } abstract double area(); // 抽象方法,只有声明,没有实现 } class Rectangle extends Shape { /** * @param num 传递至构造方法的参数 * @param num1 传递至构造方法的参数 */ public Rectangle(double num, double num1) { super(num, num1); // 调用父类的构造函数,将子类长方形的长和宽传递给父类构造方法 } /** * 计算长方形的面积。 * @return double */ double area() { // 长方形的 area 方法,重写父类 Shape 的方法 System.out.println("长方形的面积为:"); return length * width; } } class Circle extends Shape { // 圆形子类 /** * @param num 传递至构造方法的参数 * @param num1 传递至构造方法的参数 * @param radius 传递至构造方法的参数 */ private double radius; public Circle(double num, double num1, double r) { super(num, num1); // 调用父类的构造上函数,将子类圆的圆心位置和半径传递 radius = r; } /** * 计算圆形的面积。 * @return double */ double area() { // 圆形的 area 方法,重写父类 Shape 的方法 System.out.println("圆形位置在(" + length + "," + width + ")的圆形面积为:"); return 3.14 * radius * radius; } } public class Main { public static void main(String args[]) { // 定义一个长方形对象,并计算长方形的面积 Rectangle rec = new Rectangle(15, 20); System.out.println(rec.area()); // 定义一个圆形对象,并计算圆形的面积 Circle circle = new Circle(15, 15, 5); System.out.println(circle.area()); // 父类对象的引用指向不同的子类对象的实现方式 Shape shape = new Rectangle(15, 20); System.out.println(shape.area()); shape = new Circle(15, 15, 5); System.out.println(shape.area()); } }程序运行结果为:
长方形的面积为:
300.0
圆形位置在(15.0,15.0)的圆形面积为:
78.5
长方形的面积为:
300.0
圆形位置在(15.0,15.0)的圆形面积为:
78.5
abstract double area();这是个抽象方法,只有声明,没有实现,代表该形状面积的计算,需在不同的子类——即各种具体形状中实现。
子类 Rectangle 代表长方形,长方形的长宽来自对父类的继承,方法 area() 重写父类抽象的方法area(),从而实现长方形对象面积的计算。
下面代码显示方法 area() 的重写过程:
double area() { // 长方形的 area 方法,重写父类 Shape 的方法 System.out.print("长方形的面积为:"); return length * width; }
子类 Circle 代表圆形,圆形的坐标位置来自对父类中数据成员 length 和 width 的继承,方法 area() 重写父类抽象的方法 area(),从而实现圆形对象面积的计算。下面代码显示方法 area() 的重写过程:
double area() { // 圆形的 area 方法,重写父类 Shape 的方法 System.out.print("圆形位置在(" + length + "," + width + ")的圆形面积为:"); return 3.14 * radius * radius; }TestShape 的 main() 方法中声明 Rectangle 和 Circle 类的对象,分别实现各自对象面积的计算。