实验目的:掌握类的继承、抽象类的定义和使用、对象的向上转型。 实验内容:已知若干图形,求以该图形为底的锥体的体积。 实验要求:用面向抽象的思想实现。 实验步骤: 1、程序总体框架
2.在shape包中创建抽象类Shape,代码如下:
package shape;
public abstract class Shape {
public abstract double getArea(); //建立一个抽象类求Shape面积
}
3、在centrun包中创建一个类Centrun,代码如下:
package centrun;
import shape.Shape;
public class Centrun {
short S1=1;
float F1=(float) 3.4;
double height;
Shape shape;
//此处未实例化对象,知识点:对象的向上转型
public Centrun(){
super();
}
public Centrun(double height,Shape shape) {
super();
this.height=height;
this.shape=shape;
}
public double getVolume(){
return (1.0/3)*shape.getArea()*this.height;
//求椎体的体积,getArea将圆的面积算法单独作为一个类(Circle.java),便于代码的复用;
}
}
Centrun这个类为核心类,在之后的代码编写中可以不做更改,getVolume函数用来求椎体的体积,即利用抽象类getArea进行适应性计算。 4、创建一个包myshape,在其中先创建一个Circle类,代码如下:
package myshape;
import shape.Shape;
public class Circle extends Shape{
//Circle是对Shape类的继承
private double r;
public Circle(){
super();
}
public Circle(double r){
super();
//对于以上的代码实际在子类的构造方法中隐含了一个super()的语法,此句加不加效果一样
this.r=r;
}
//取得R属性
public double getR(){
return r;
}
//设置R属性
public void setR(double r){
this.r=r;
}
@Override
public double getArea() {
// TODO 自动生成的方法存根
return Math.PI*this.r*this.r;
//代码的重写,求圆的面积,公式为:S=π*r^2
}
}
Circle是对抽象类shape的继承(记得导入shape包),在Circle类中,利用对getArea函数代码的重写操作,具体实现了求圆的面积这一操作。【此处的具体实现应该放入该图形的具体面积求法。】
5、创建一个包Test,对以上三个包中的代码进行具体实现,代码如下:
导入myshape包,在main函数中通过向上转型,实例化shape包中的抽象类Shape,然后调用函数输出圆锥的体积。
6、在求出实验结果1,即调试好shape、myshape、centrun这三个包后,不再更改shape、centrun包,而是在myshape包下新建所需的类,如本次实验所需的三角形、矩形;
7、在myshape包下创建一个类Rectangular,代码如下:
package myshape;
import shape.Shape;
public class Rectangular extends Shape{ //继承shape
private double width;
private double height;
public Rectangular(){
super();
}
public Rectangular(double width,double height){
super();
this.width=width;
this.height=height;
}
@Override
public double getArea() {
// TODO 自动生成的方法存根
return width*height;
//矩形面积等于宽乘以高
}
}
8、在myshape包下创建一个类Triangle,需注意的是,求三角形的面积需要判断三角形的三边能否构成三角形(不能构成时返回0),代码如下:
package myshape;
import shape.Shape;
public class Triangle extends Shape{
double a;
double b;
double c;
double m;
//空参构造函数
public Triangle() {
super();
}
public Triangle(double a, double b, double c) {
super();
this.a = a;
this.b = b;
this.c = c;
}
public double getA(){
return a;
}
public double getB(){
return b;
}
public double getC(){
return c;
}
@Override
public double getArea() {
// TODO 自动生成的方法存根
if(a+b>=c&&a+c>=b&&b+c<=a)
return 0;
else
{
double m=(a+b+c)/2;
double s=m*(m-a)*(m-b)*(m-c);
return Math.sqrt(s);
}
}
}
实验结果: 1、Test测试包最终代码:
package test;
import myshape.Circle;
import myshape.Rectangular;
import myshape.Triangle;
import centrun.Centrun;
public class Test {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Circle circle=new Circle(4.0);
Centrun centrun=new Centrun(10,circle);
//向上转型,实例化shape
System.out.println(centrun.getVolume());
//输出圆锥的体积
Rectangular rect=new Rectangular(6,8);
centrun=new Centrun(10,rect);
System.out.println(centrun.getVolume());
//输出四棱锥的体积(底面为矩形)
Triangle triangle=new Triangle(15,4,5);
centrun=new Centrun(10,triangle);
System.out.println(centrun.getVolume());
//输出三棱锥的体积
}
}
2、圆锥体积 测试数据:半径=4.0,高=10 测试结果:求得圆锥的体积约为168;
3、四棱锥的体积(底面为矩形) 测试数据:宽=6,长=8,高=10; 测试结果:求得棱锥的体积为160.
4、三棱锥的体积 (1) 测试数据:三边分别为:3 4 5,高为10。 测试结果:求得三棱锥的体积为20. (2) 测试数据:三边分别为:15 4 5,高为10。 测试结果:求得三棱锥的体积为0.