题目:
有一个抽象类ObjectVolume,如下所示:
abstract class ObjectVolume {
abstract double getVolume(); //返回物体的体积
}
(1)编写球体类,立方体类和圆柱体类,它们是抽象类ObjectVolume的子类。
(2)编写一个public类,其中包含main方法和static double get(ObjectVolume obj)方法。
(3)在main方法中,从键盘上输入1(表示球体)、2(表示立方体)、3(表示圆柱体)时,调用get方法可以分别得到球体、立方体、圆柱体的体积。
//上转型与运行时多态
import java.util.Scanner;
//抽象类 abstract
abstract class ObjectVolume {
abstract double getVolume(); //返回物体的体积
}
//非抽象子类必须具体实现抽象父类的所有抽象方法
//球体
class Qiuti extends ObjectVolume {
double Rad;
Qiuti(double r) {
this.Rad = r;
}
double getRad() {
return this.Rad;
}
void setRad(double r) {
this.Rad = r;
}
//子类重写父类的方法
double getVolume() {
return 4*Math.PI * Rad*Rad*Rad/3;
}
}
//立方体
class Lifangti extends ObjectVolume {
double SideLen;
Lifangti(double len) {
this.SideLen = len;
}
double getSideLen() {
return this.SideLen;
}
void setSideLen(double len) {
this.SideLen = len;
}
//子类重写父类的方法
double getVolume() {
return SideLen*SideLen*SideLen;
}
}
//圆柱体
class Yuanzhuti extends ObjectVolume {
double Rad, Hei;
Yuanzhuti(double r, double h) {
this.Rad = r;
this.Hei = h;
}
double getR() {
return this.Rad;
}
void setR(double r) {
this.Rad = r;
}
double getH() {
return this.Hei;
}
void setH(double h) {
this.Hei = h;
}
//子类重写父类的方法
double getVolume() {
return Math.PI*Rad*Rad*Hei;
}
}
public class Shangzhuanxing {
static double get(ObjectVolume obj) { //参数是父类对象obj
double v = obj.getVolume();
return v;
}
public static void main(String[] args) {
System.out.println("输入一个整数(1, 2, 3):");
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
double v;
switch(num) {
case 1:
Qiuti q = new Qiuti(1.0);
//实参为子类对象,形参为父类对象,传参时形参obj变成了上转型对象
//上转型对象调用重写的子类方法
v = get(q); //调用静态方法get()
System.out.println("球体体积是"+v);
break;
case 2:
Lifangti lft = new Lifangti(2.0);
v = get(lft);
System.out.println("立方体体积是"+v);
break;
case 3:
Yuanzhuti yzt = new Yuanzhuti(3.0, 4.0);
v = get(yzt);
System.out.println("圆柱体体积是"+v);
break;
}
}
}