一直以来,我都以为java的多态主要表现在由于方法所自带的参数,类型不同,数目多少不同而带来的同名称方法的重用。
原来还有对抽象类方法的继承和重写,也是多态的一种表现。
下面的代码里面,几个类class都是继承了Shape类,同时重写了里面的getArea方法,也是一种多态的表现。
abstract class Shape {
public abstract double getArea();
}
class Circle extends Shape{
private double r;
public Circle(double r){
this.r = r;
}
public double getArea(){
return 3.14 * r * r;
}
}
class Rectangle extends Shape{
private double a, b;
public Rectangle(double a, double b){
this.a = a;
this.b = b;
}
public double getArea(){
return a * b;
}
}
class Triangle extends Shape{
private double a, b, c;
public Triangle(double a, double b, double c){
this.a = a;
this.b = b;
this.c = c;
}
public double getArea(){
double temp = 0.5 * (a + b + c);
return Math.sqrt(temp * (temp -a) * (temp -b) *(temp -c));
}
}
class Ladder extends Shape{
private double a, b, h;
public Ladder(double a, double b, double h){
this.a = a;
this.b = b;
this.h = h;
}
public double getArea(){
return 0.5 * (a + b) * h;
}
}
public class Test2{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入圆的半径:");
double r = sc.nextDouble();
Shape area1 = new Circle(r);
System.out.println("圆的面积是:" + area1.getArea());
System.out.println("请输入矩形的两条边长,回车键分隔:");
double a1 = sc.nextDouble();
double a2 = sc.nextDouble();
Shape area2 = new Rectangle(a1, a2);
System.out.println("矩形的面积是" + area2.getArea());
System.out.println("请输入梯形的上下边长和高,回车键分隔:");
double b1 = sc.nextDouble();
double b2 = sc.nextDouble();
double b3 = sc.nextDouble();
Shape area3 = new Ladder(b1, b2, b3);
System.out.println("梯形的面积是:" + area3.getArea());
System.out.println("请输入三角形的三条边,回车键分隔:");
double c1 = sc.nextDouble();
double c2 = sc.nextDouble();
double c3 = sc.nextDouble();
Shape area4 = new Triangle(c1, c2, c3);
System.out.println("三角形的面积是:" + area4.getArea());
double area = area1.getArea() + area2.getArea() +
area3.getArea() + area4.getArea();
System.out.println("几个图形面积的和是:" + area);
}
}