package ch1;
public abstract class Geometry {
public abstract double getArea();
}
上述抽象类将所有计算面积的方法抽象为一个标识:getArea(),即抽象方法,不再考虑算法的细节。
public class Pillar {
Geometry bottom;
double height;
Pillar(Geometry bottom,double height){
this.bottom=bottom;
this.height=height;
}
public double getVolume(){
if(bottom==null){
System.out.println("没有底,无法计算体积");
return -1;
}
return bottom.getArea()*height;
}
}
以上Pillar类的设计不再依赖具体类,而是面向Geometry类,即Pillar类中的bottom是用抽象类Geometry类声明的对象,而不是具体类声明的对象。
public class Rectangle extends Geometry{
double a,b;
Rectangle(double a,double b){
this.a=a;
this.b=b;
}
public double getArea(){
return a*b;
}
}
以下Circle类,Rectangle类,Sanjiao类都是Geometry类的子类,三者都必须重写Geometry类的getArea()方法类计算各自的面积。
public class Circle extends Geometry {
double r;
Circle(double r){
this.r=r;
}
public double getArea(){
return (3.14*r*r);
}
}
public class Sanjiao extends Geometry{
double a,b,c,t;
Sanjiao(double a,double b,double c){
this.a=a;
this.b=b;
this.c=c;
}
public double getArea(){
t=0.5*(a+b+c);
return Math.sqrt(t*(t-a)*(t-b)*(t-c));
}
}
public class Application {
public static void main(String[] args) {
// TODO Auto-generated method stub
Pillar pillar;
Geometry bottom=null;
pillar=new Pillar(bottom,58);
System.out.println("体积"+pillar.getVolume());
bottom=new Rectangle(12,22);
pillar=new Pillar(bottom,58);
System.out.println("体积"+pillar.getVolume());
bottom=new Circle(10);
pillar=new Pillar(bottom,58);
System.out.println("体积"+pillar.getVolume());
bottom=new Sanjiao(6,8,10);
pillar=new Pillar(bottom,5);
System.out.println("体积"+pillar.getVolume());
}
}