学以致用——Java源码——使用多态输出平面及立体几何图形的面积和体积(Project: Shape Hierarchy)

本文通过一个具体的编程案例,展示了如何运用面向对象编程的思想,包括继承和多态,来实现对不同几何形状的面积和体积计算。通过创建10个类,文章详细介绍了每个类的功能,如Circle、Square、Triangle等平面图形,以及Sphere、Cube、Tetrahedron等立体图形,并提供了测试结果,验证了代码的正确性和多态处理的有效性。
摘要由CSDN通过智能技术生成

程序功能:

使用继承和多态的面向编程思想,动态的判断几何形状,打印平面图形面积及立体几何图形的面积和体积。

这个习题让我从无到有创建了共10个类才完成,虽然简单,但是作为继承和多态的入门练习还是不错的!

测试结果:

逐个处理:

 

circle's area:201.06

square's area:64.00

triangle's area:24.00

sphere's area:804.25

sphere's volume:2144.66

cube's area:384.00

cube's volume:512.00

tetrahedron's area:110.85

tetrahedron's volume:60.34

 

 

多态处理:

 

图形 0是一个圆

面积:201.06

 

图形 1是一个正方形

面积:64.00

 

图形 2是一个三角形

面积:24.00

 

图形 3是一个球

面积:804.25

体积:2144.66

 

图形 4是一个立方体

面积:384.00

体积:512.00

 

图形 5是一个圆

面积:110.85

体积:60.34

 

 代码:

1. 测试类

//Java How to Program, Exercise 10.13: Project: Shape Hierarchy
//by pandenghuang@163.com
/**
 * 10.13 (Project: Shape Hierarchy) Implement the Shape hierarchy shown in Fig.
 * 9.3. Each Two-DimensionalShape should contain method getArea to calculate the
 * area of the two-dimensional shape. Each ThreeDimensionalShape should have
 * methods getArea and getVolume to calculate the surface area and volume,
 * respectively, of the three-dimensional shape. Create a program that uses an
 * array of Shape references to objects of each concrete class in the hierarchy.
 * The program should print a text description of the object to which each array
 * element refers. Also, in the loop that processes all the shapes in the array,
 * determine whether each shape is a TwoDimensionalShape or a
 * ThreeDimensionalShape. If it’s a TwoDimensionalShape, display its area. If
 * it’s a ThreeDimensionalShape, display its area and volume.
 * 
 * @author Pandenghuang@163.com
 * @Date Jan 7, 2019, 9:13:12 AM
 *
 */
public class ShapeHierarchyTest {
	
	
	public static void main(String[] args) {
		
		Circle circle = new Circle(8);
		Square square = new Square(8);
		Triangle triangle = new Triangle (6,8,10);
		
		Sphere sphere = new Sphere(8);
		Cube cube = new Cube(8);
		Tetrahedron tetrahedron = new Tetrahedron(8);
		
		
		
		System.out.printf("逐个处理:%n%n");
		System.out.printf("circle's area:%.2f%n", circle.getArea());
		System.out.printf("square's area:%.2f%n", square.getArea());
		System.out.printf("triangle's area:%.2f%n", triangle.getArea());
		
		System.out.printf("sphere's area:%.2f%n", sphere.getArea());
		System.out.printf("sphere's volume:%.2f%n", sphere.getVolume());
		System.out.printf("cube's area:%.2f%n", cube.getArea());
		System.out.printf("cube's volume:%.2f%n", cube.getVolume());
		System.out.printf("tetrahedron's area:%.2f%n", tetrahedron.getArea());
		System.out.printf("tetrahedron's volume:%.2f%n", tetrahedron.getVolume());
		
		Shape[] shapes = new Shape[6];
		shapes[0] = circle;
		shapes[1] = square;
		shapes[2] = triangle;
		shapes[3] = sphere;
		shapes[4] = cube;
		shapes[5] = tetrahedron;
		
		System.out.printf("%n%n多态处理:%n%n");
		 // get type name of each object in employees array
	      for (int j = 0; j < shapes.length; j++) {
	    	  
	    	 String[] classInfo =shapes[j].getClass().getName().split("\\.");
	    	 String className = classInfo[classInfo.length-1];
	    	 String classNameCN = "圆";
			 switch (className) {
			 case "Circle":
				 classNameCN = "圆";
				 break;
			 case "Square":
				 classNameCN = "正方形";
				 break;
			 case "Triangle":
				 classNameCN = "三角形";
				 break;
			 case "Sphere":
				 classNameCN = "球";
				 break;
			 case "Cube":
				 classNameCN = "立方体";
				 break;
			 case "Terahedron":
				 classNameCN = "正四面体";
				 break;
			 }
	         System.out.printf("图形 %d是一个%s%n", j, classNameCN); //打印对象的类型(类名)
	         
	         if (shapes[j] instanceof TwoDimensionalShape) 
	        	 System.out.printf("面积:%.2f%n%n", shapes[j].getArea());	//如果是二维图形,打印面积
	         else if (shapes[j] instanceof ThreeDimensionalShape) {
	        	 ThreeDimensionalShape threeDimensionalShape = (ThreeDimensionalShape)shapes[j];  //如果是三维图形,打印面积和体积
	        	 System.out.printf("面积:%.2f%n", threeDimensionalShape.getArea());
	        	 System.out.printf("体积:%.2f%n%n", threeDimensionalShape.getVolume());
	         }
	      }
		
	}

}

2. 实体类

1)Shape类(基类,图形)

/**
 * 
 * @author Pandenghuang@163.com
 * @Date Jan 7, 2019, 1:44:02 AM
 *
 */
public abstract class Shape {
	public abstract double getArea();
}

2)TwoDimensionalShape类 (平面图形)

public abstract class TwoDimensionalShape extends Shape {

}

3)ThreeDimensionalShape类 (立体图形)

public abstract class ThreeDimensionalShape extends Shape{
	
	public abstract double getVolume(); 

}

4)Circle类 (圆)

public class Circle extends TwoDimensionalShape {
	
	private double radius;
	
	Circle(double radius){
		this.radius = radius;
	}
	
	@Override
	public double getArea() {
		return Math.PI*Math.pow(radius,2);
	}

}

5)Square类 (正方形)

public class Square extends TwoDimensionalShape{

	private double sideLength;
	
	Square(double sideLength){
		this.sideLength = sideLength;
	}
	
	@Override
	public double getArea() {
		return Math.pow(sideLength,2);
	}
}

6)Triangle类 (三角形)

public class Triangle extends TwoDimensionalShape {
	private double a;
	private double b;
	private double c;
	
	public Triangle (double a, double b, double c) {
		this.a = a;
		this.b = b;
		this.c = c;
		
	}
	
	@Override
	public double getArea() {
		double p = (a + b + c)/2.0;
		return Math.sqrt(p*(p-a)*(p-b)*(p-c));
	}
	

}

7) Sphere类 (球)

public class Sphere extends ThreeDimensionalShape {
	
	private double radius;
	
	Sphere(double radius){
		this.radius = radius;
	}
	
	@Override
	public double getArea() {
		return 4*Math.PI*Math.pow(radius,2);
	}

	@Override
	public double getVolume() {
		return 4.0/3.0*Math.PI*Math.pow(radius,3);
	}
}

8)Cube类 (立方体)

public class Cube extends ThreeDimensionalShape {
	
	private double length;
	
	Cube(double length){
		this.length = length;
	}
	
	@Override
	public double getArea() {
		return 6*Math.pow(length,2);
	}

	@Override
	public double getVolume() {
		return Math.pow(length,3);
	}
}

9)Tetrahedron类(正四面体)

public class Tetrahedron extends ThreeDimensionalShape {
	
	private double length;
	
	Tetrahedron(double length){
		this.length = length;
	}
	
	@Override
	public double getArea() {
		return Math.sqrt(3)*Math.pow(length,2);
	}

	@Override
	public double getVolume() {
		return Math.sqrt(2)/12*Math.pow(length,3);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值