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.57. 代码扩展建议
这个程序可以从以下几个方面进行扩展:
- 添加更多形状:如三角形、正方形、椭圆形等,只需创建新的子类并实现
calcArea()方法 - 添加更多功能:在
Shape抽象类中添加计算周长的抽象方法calcPerimeter(),在子类中实现 - 使用接口替代抽象类:如果不需要在基类中实现通用方法,可以使用接口
IShape定义calcArea()方法 - 使用集合框架:使用
ArrayList<Shape>替代数组,提供更灵活的形状对象管理
通过这个实例,我们学习了抽象类的定义与使用、子类对抽象方法的实现,以及多态在实际编程中的应用。这些面向对象的核心概念对于编写可扩展、可维护的Java程序至关重要。多态机制使得我们可以编写通用的代码来处理不同类型的对象,大大提高了代码的灵活性和复用性。