一、课程设计目的
- 掌握类和对象的设计
- 掌握面向对象程序设计的基本方法
- 掌握面向抽象编程的原则
二、课程设计内容
1、概念理解
面向抽象编程,顾名思义,是对抽象类(abstract)进行一系列操作的编程。也就是说 当设计某种重要的类时,不让该类面向具体的类,而是面向抽象类,即 设计类中的重要数据 是 抽象类的对象 ,不是具体类声明的对象。
简单一点理解,就是定义了一个abstract类和一个abstract方法,再定义一个或几个abstract类的子类,在子类中重写abstract类中的abstract方法(子类中重写的方法不再是abstract方法),然后就可以只声明一个abstract类,再利用 上转型对象 对其重写的方法进行调用。这样就可以实现声明的一个变量可以应对多种不同的变化。
2、编程题
有一个Circle类(圆类),该类创建的对象circle调用getArea()方法可以计算圆的面积。Circle类的代码如下:
public class Circle {
double r;
Circle(double r){
this.r=r;
}
public double getArea() {
return(3.14*r*r);
}
}
现在要设计一个Pillar类(柱类),该类的对象调用getVolume()方法可以计算柱体的体积。Pillar类的代码如下:
public class Pillar {
Circle bottom; //bottom是用具体类Circle声明的对象
double height;
Pillar (Circle bottom,double height){
this.bottom=bottom;
this.height=height;
}
public double getVolume() {
return bottom.getArea()*height;
}
}
请补充main函数,完成圆柱体的体积计算(有一些提示性语句)。
3、编程题
上述Pillar类中,bottom是用具体类Circle声明的对象,如果不涉及用户需求的变化,上面Pillar类的设计没有什么不妥,但是在某个时候,用户希望Pillar类能创建出底是三角形或者长方形的柱体。显然上述Pillar类无法创建出这样的柱体,即上述设计的Pillar类不能应对用户的这种需求(软件设计面临的最大问题是用户需求的变化)。
利用面向抽象编程原则实现柱体体积的计算。程序参考如下:
public abstract class Geometry {
public abstract double getArea();//单纯的构造abstract方法。
}
class Circle extends Geometry{
double r;
Circle(double r){//构造函数
this.r = r;
}
public double getArea() { / /方法的重写
return r * r * 3.14;
}
}
public class Pillar {
Geometry bottom;//声明Geometry对象(抽象对象)
double hight;
Pillar(Geometry bottom,double h){//构造函数,获取值
this.bottom = bottom;
this.hight = h;
}
public double getVolume(){//返回体积值
if(bottom == null){
System.out.println("没有底,无法计算面积");
return 0;
}
return bottom.getArea()*hight;//这里的调用的getArea()函数根据对bottom的上转型对象来确定。
}
}
public class Application {
public static void main(String[] args) {
Pillar pillar;
Geometry bottom;
bottom = null;
pillar = new Pillar(bottom,5);
System.out.println("体积:" + pillar.getVolume());
bottom = ***************;//上转型对象
pillar = ****************;//传入实参对象
System.out.println("体积:" + pillar.getVolume());//调用的是Circle里面的getVolume()。
}
}
若有学有余力的同学,请增加底面积是三角形和长方形的柱体体积的计算。
三、代码清单与实验结果截图
1.编程题一代码和实验结果截图
public class Main {
public static void main(String[] args) {
// 创建一个Circle对象,半径为5
Circle circle = new Circle(5);
// 创建Pillar对象,高度为10
Pillar pillar = new Pillar(circle, 10);
// 输出圆柱体的体积
System.out.println("圆柱体的体积是: " + pillar.getVolume());
}
}
2.编程题二代码和实验结果截图
运行结果:
- 课程设计小结
(1)在本次设计中,通过对 Circle 类和 Pillar 类的实现,深入理解了类与对象的基本概念和设计方法。类是对现实世界对象的抽象,而对象是类的具体实例。在 Circle 类中,我们使用了类成员变量 r 来表示圆的半径,并通过 getArea() 方法计算圆的面积。在 Pillar 类中,我们将 Circle 作为底面,实现了柱体的体积计算。通过这一过程,掌握了如何设计类、如何定义类的属性和方法,以及如何通过对象来调用这些方法。
(2)在设计 Pillar 类时,通过引入构造函数、成员变量以及方法,实现了面向对象编程的基本思想。面向对象的核心思想是将数据和操作封装在对象中,并通过对象之间的交互来实现程序功能。在此过程中,理解了如何通过构造函数初始化对象、如何通过成员方法操作对象的属性,以及如何通过对象的方法调用实现特定功能。同时,通过继承、封装和多态等特性,进一步加深了对面向对象编程的理解。
(3)在编写支持多种底面形状的 Pillar 类时,通过引入了抽象类 Geometry,实现了面向抽象的编程。通过面向抽象编程,我们可以将设计中的类及其重要数据类型抽象为接口或抽象类,而具体的实现则交由各个子类来完成。这样一来,程序可以针对抽象类型进行操作,而不局限于某个具体类型,例如不再局限于 Circle 类,而是可以扩展支持 Triangle 类或 Rectangle 类。这种设计使得系统更具扩展性和灵活性,能够应对用户需求的变化,符合面向对象编程中“开闭原则”(对扩展开放,对修改关闭)的设计理念。