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 类的对象,分别实现各自对象面积的计算。
ICP备案:
公安联网备案: