Java面向对象编程:多态与抽象类应用实例解析
题目代码分析
以下是需要补全的Java代码,展示了使用抽象类和多态计算不同形状面积总和的功能:
public class Java_2 {
public static void main(String []args) {
Shape[] s = new Shape[3];
s[0] = new Circle(5.0);
s[1] = new Rectangle(3.0, 4.0);
s[2] = new Rectangle(5.0, 6.0);
//**********Found**********
System.out.println("Total Area = " + _________.dostuff(s));
}
}
//**********Found**********
_________ class Shape {
abstract public double calcArea();
}
class Circle extends Shape {
private double radius;
public Circle(double radius) {
//**********Found**********
_________ = radius;
}
//**********Found**********
public double _________() {
return radius * radius * 3.14;
}
}
class Rectangle extends Shape {
private double length, width;
public Rectangle(double a, double b) {
length = a;
width = b;
}
public double calcArea() {
//**********Found**********
return _________ ;
}
}
class Poly {
static double dostuff(Shape[] s) {
double total = 0;
for (int i = 0; i < s.length; i++) {
//**********Found**********
total += ________.calcArea();
}
return total;
}
}
空白处解析
第一个空白处:
System.out.println("Total Area = " + _________.dostuff(s));
- 解析:调用
Poly
类的静态方法dostuff
计算总面积 - 答案:
Poly
- 解析:调用
第二个空白处:
_________ class Shape {
- 解析:
Shape
类包含抽象方法calcArea()
,因此它必须是抽象类 - 答案:
abstract
- 解析:
第三个空白处:
_________ = radius;
- 解析:在构造方法中为私有成员变量
radius
赋值 - 答案:
this.radius
- 解析:在构造方法中为私有成员变量
第四个空白处:
public double _________() {
- 解析:需要实现父类的抽象方法
calcArea()
来计算面积 - 答案:
calcArea
- 解析:需要实现父类的抽象方法
第五个空白处:
return _________ ;
- 解析:矩形面积计算公式为长×宽
- 答案:
length * width
第六个空白处:
total += ________.calcArea();
- 解析:调用数组中每个形状对象的
calcArea()
方法 - 答案:
s[i]
- 解析:调用数组中每个形状对象的
完整正确代码
Java多态与抽象类:形状面积计算的面向对象实现
在面向对象编程中,抽象类和多态是实现代码复用和扩展性的重要机制。本文通过一个计算不同形状面积总和的实例,详细讲解抽象类的定义、子类实现以及多态的实际应用。
1. 程序功能概述
这个程序实现了以下功能:
- 定义一个抽象的形状类
Shape
,包含计算面积的抽象方法 - 实现两个具体形状类:
Circle
(圆形)和Rectangle
(矩形) - 利用多态特性,在一个形状数组中存储不同类型的形状对象
- 计算并输出所有形状的面积总和
程序的核心是通过抽象类定义统一接口,通过多态实现不同形状的统一处理。
2. 抽象类的定义与作用
抽象类是一种不能被实例化的类,通常用于定义一组相关类的共同行为。在本例中:
abstract class Shape {
abstract public double calcArea();
}
Shape
类被声明为abstract
(抽象类),并包含一个抽象方法calcArea()
。抽象方法没有具体实现,必须由子类实现。
抽象类的主要作用:
- 定义统一接口:所有子类必须实现抽象方法,保证了接口的一致性
- 代码复用:可以在抽象类中实现一些通用方法,供所有子类使用
- 类型抽象:可以使用抽象类类型声明变量,引用任何子类对象,为多态奠定基础
3. 子类实现与方法重写
具体的形状类(Circle
和Rectangle
)继承自Shape
类,并实现了calcArea()
方法:
圆形类(Circle
)
class Circle extends Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
public double calcArea() {
return radius * radius * 3.14;
}
}
- 继承
Shape
类,必须实现calcArea()
方法 - 实现了圆形面积计算公式:π × 半径²
矩形类(Rectangle
)
class Rectangle extends Shape {
private double length, width;
public Rectangle(double a, double b) {
length = a;
width = b;
}
public double calcArea() {
return length * width;
}
}
- 继承
Shape
类,实现了calcArea()
方法 - 实现了矩形面积计算公式:长 × 宽
4. 多态的实现与应用
多态是指同一操作作用于不同对象,可以有不同的解释和实现。在本例中体现为:
Shape[] s = new Shape[3];
s[0] = new Circle(5.0);
s[1] = new Rectangle(3.0, 4.0);
s[2] = new Rectangle(5.0, 6.0);
- 声明了
Shape
类型的数组,但可以存储Shape
的任何子类对象 - 当调用
calcArea()
方法时,会根据实际对象类型执行相应的实现
多态的优势:
- 代码扩展性:添加新的形状(如三角形)只需创建新的子类,无需修改现有代码
- 代码简化:可以用统一的方式处理不同类型的对象
- 提高可读性:隐藏了具体实现细节,只关注接口
5. 面积总和计算
Poly
类中的静态方法dostuff()
实现了面积总和的计算:
class Poly {
static double dostuff(Shape[] s) {
double total = 0;
for (int i = 0; i < s.length; i++) {
total += s[i].calcArea();
}
return total;
}
}
这个方法展示了多态的强大之处:无论数组中存储的是哪种具体形状,都可以通过统一的calcArea()
方法获取面积,无需判断对象的具体类型。
6. 程序运行结果
对于示例中的形状:
- 圆形(半径5.0)面积:3.14 × 5² = 78.5
- 矩形(3.0×4.0)面积:3×4 = 12
- 矩形(5.0×6.0)面积:5×6 = 30
程序运行后输出:
Total Area = 120.5
7. 代码扩展建议
这个程序可以从以下几个方面进行扩展:
- 添加更多形状:如三角形、正方形、椭圆形等,只需创建新的子类并实现
calcArea()
方法 - 添加更多功能:在
Shape
抽象类中添加计算周长的抽象方法calcPerimeter()
,在子类中实现 - 使用接口替代抽象类:如果不需要在基类中实现通用方法,可以使用接口
IShape
定义calcArea()
方法 - 使用集合框架:使用
ArrayList<Shape>
替代数组,提供更灵活的形状对象管理
通过这个实例,我们学习了抽象类的定义与使用、子类对抽象方法的实现,以及多态在实际编程中的应用。这些面向对象的核心概念对于编写可扩展、可维护的Java程序至关重要。多态机制使得我们可以编写通用的代码来处理不同类型的对象,大大提高了代码的灵活性和复用性。