建立一个从GeometricObject类继承的三角形类(Triangle)。类必须包含以下属性和方法:
•   三角形的三个边side1, side2, 和side3。边长缺省值为1.0。
•   一个无参构造器(缺省构造器)用来定义缺省边长的三角形。
•   一个有参构造器,可以传入三个边长作为参数。
•   所有属性的get和set方法。
•   定义getArea()方法,返回三角形的面积。
•   定义getPerimeter()方法,返回三角的周长。
•   定义toString()方法,返回一个字符串,显示三角形的描述信息:
      return "Triangle: side1 = " + side1 + " side2 = " + side2 +  " side3 = " + side3;    写一段测试程序,建立一个三角形对象,边长为1,1.5,1,设置颜色为yellow,填充属性为true(这两个属性都是从GeometricObject类继承下来的),然后显示面积,边长,颜色以及是否填充等信息。Triangle的程序如下:
// Triangle.java: The Triangle class that extends GeometricObject
import java.lang.Math;
public class Triangle extends GeometricObject{
  /** Construct a circle with default properties */
  private double side1,side2,side3;
  public Triangle(){
    this(1.0,1.0,1.0);
  }
  /** Construct a circle with a specified sides */
  public Triangle(double side1,double side2,double side3){
    this(side1,side2,side3,"white",false);
  }
  /** Construct a circle with specified sides, filled, and color */
  public Triangle(double side1,double side2,double side3,String color,boolean filled) {
    super(color,filled);
    this.side1=side1;
    this.side2=side2;
    this.side3=side3;
  }
  /** Set a new side1 */
  public void setSide1(double side1){
    this.side1=side1;
  }
  /** Set a new side2 */
  public void setSide2(double side2){
    this.side2=side2;
  }
  /** Set a new side3 */
  public void setSide3(double side3){
    this.side3=side3;
  }
  /** Return side1 */
  public double getSide1(){
    return side1;
  }
  /** Return side2 */
  public double getSide2(){
    return side2;
  }
  /** Return side3 */
  public double getSide3(){
    return side3;
  }
  /** Implement the findArea method defined in GeometricObject */
  public double findArea(){
    double p=(getSide1()+getSide2()+getSide3())/2;
    return Math.sqrt(p*(p-getSide1())*(p-getSide2())*(p-getSide3()));
  }
  /** Implement the findPerimeter method defined in GeometricObject*/
  public double findPerimeter() {
    return (side1+side2+side3);
  }
  /** Override the toString() method defined in the Object class */
  public String toString() {
    return "Triangle: side1 = " + side1 + " side2 = " + side2 +  " side3 = " + side3;
  }
}然后我补写了一个测试程序如下:
public class TestGeometricObject {
  /** Main method */
  public static void main(String[] args) {
    // Declare and initialize two geometric objects
    GeometricObject geoObject1 = new Circle(5);
    GeometricObject geoObject2 = new Rectangle(5, 3);
    GeometricObject geoObject3 = new Triangle(1, 1.5,1,"yellow",true);
    System.out.println("The two objects have the same area? " +
      equalArea(geoObject1, geoObject2));
    // Display circle
    displayGeometricObject(geoObject1);
    // Display rectangle
    displayGeometricObject(geoObject2);
    // Display Triangle
    displayGeometricObject(geoObject3);   
  }
 /** A method for comparing the areas of two geometric objects */
  public static boolean equalArea(GeometricObject object1,
    GeometricObject object2) {
    return object1.findArea() == object2.findArea();
  }
  /** A method for displaying a geometric object */
  public static void displayGeometricObject(GeometricObject object) {
    if(object instanceof Triangle){      
    System.out.println();
    System.out.println(object.toString());
    System.out.println("The filled is " + object.isFilled());
    System.out.println("The side1 is " + object.getSide1());    //错误:找不到符号, 符号:getSide1()  位置:类 GeometricObject
    System.out.println("The side2 is " + object.getSide2());    //错误:找不到符号, 符号:getSide2()  位置:类 GeometricObject
    System.out.println("The side3 is " + object.getSide3());//错误:找不到符号, 符号:getSide3()  位置:类 GeometricObject
    System.out.println("The color is " + object.getColor());
    System.out.println("The area is " + object.findArea());
    System.out.println("The perimeter is " + object.findPerimeter());
    }
    else{      
    System.out.println();
    System.out.println(object.toString());
    System.out.println("The area is " + object.findArea());
    System.out.println("The perimeter is " + object.findPerimeter());
    }
  }
}补充一下,抽象类的父类:
public abstract class GeometricObject {
  private String color = "white";
  private boolean filled;
  /** Construct a default geometric object */
  protected GeometricObject() {
  }
  /** Construct a geometric object with specified properties */
  protected GeometricObject(String color, boolean filled) {
   this.color = color;
    this.filled = filled;
  }
   /** Return color */
  public String getColor() {
   return color;
  }
  /** Set a new color */
  public void setColor(String color) {
   this.color = color;
 }
 /** Return filled. Since filled is boolean,
     so, the get method name is isFilled */
  public boolean isFilled() {
   return filled;
  }
  /** Set a new filled */
  public void setFilled(boolean filled) {
    this.filled = filled;
  }
  /** Abstract method findArea */
  public abstract double findArea();
  /** Abstract method findPerimeter */
  public abstract double findPerimeter();
}

解决方案 »

  1.   

    Triangle继承GeometricObject类,如里你想GeometricObject调用子类Triangle类的方法,那么就需要向上转型,GeometricObject object = new Triangle(); 
      

  2.   

    /** A method for displaying a geometric object */ 
      public static void displayGeometricObject(GeometricObject object) { 
        if(object instanceof Triangle){       
        System.out.println(); 
        System.out.println(object.toString()); 
        System.out.println("The filled is " + object.isFilled()); 
        System.out.println("The side1 is " + object.getSide1());    //错误:找不到符号, 符号:getSide1()  位置:类 GeometricObject 
        System.out.println("The side2 is " + object.getSide2());    //错误:找不到符号, 符号:getSide2()  位置:类 GeometricObject 
        System.out.println("The side3 is " + object.getSide3());//错误:找不到符号, 符号:getSide3()  位置:类 GeometricObject 
        System.out.println("The color is " + object.getColor()); 
        System.out.println("The area is " + object.findArea()); 
        System.out.println("The perimeter is " + object.findPerimeter()); 
        } 
        else{       
        System.out.println(); 
        System.out.println(object.toString()); 
        System.out.println("The area is " + object.findArea()); 
        System.out.println("The perimeter is " + object.findPerimeter()); 
        } 
      } 

    就是上面这个程序,发生错误的地方在此:
        System.out.println("The side1 is " + object.getSide1());    //错误:找不到符号, 符号:getSide1()  位置:类 GeometricObject 
        System.out.println("The side2 is " + object.getSide2());    //错误:找不到符号, 符号:getSide2()  位置:类 GeometricObject 
        System.out.println("The side3 is " + object.getSide3());//错误:找不到符号, 符号:getSide3()  位置:类 GeometricObject 我的疑问是,如果要在抽象父类要调用子类的getSide()方法,应该怎么办???
      

  3.   

    回2楼的:我难道这样向上传型不对吗???
    GeometricObject geoObject3 = new Triangle(1, 1.5,1,"yellow",true); 
    如果要按你说的那么传型的话,即
    GeometricObject object = new Triangle(); 
    那怎么设置边长为1,1.5,1,设置颜色为yellow,填充属性为true?????
    我很迷惑!!!!
      

  4.   

    重新看了一下书,父类好象是不能调用子类里的方法的!!!!
    那我们要显示
    写一段测试程序,建立一个三角形对象,边长为1,1.5,1,设置颜色为yellow,填充属性为true(这两个属性都是从GeometricObject类继承下来的),然后显示面积,边长,颜色以及是否填充等信息。 
    显示边长,要怎么办???? 获得边长的方法getSide()只有子类里有定义啊!!!
      

  5.   

    代码太长,看的眼晕
    看了回复大概知道是什么问题了
    父类是不能调用子类的方法的,你既然已经做了if(object instanceof Triangle)这个判断,为什么不强制转型呢?
    如果你是这样实例话的GeometricObject geoObject3 = new Triangle(1, 1.5,1,"yellow",true);
    那强制转型后调用子类追加的方法是没有问题的
      

  6.   

    靠,我明白了,其实是要做一个类的类型转换!!!!
    public class TestTriangle{
      public static void main(String[] args){
        GeometricObject object4=new Triangle();
        Triangle object5=(Triangle)object4;
        object5.setSide1(1);
        object5.setSide2(1.5);
        object5.setSide1(1);
        object5.setColor("yellow");
        object5.setFilled(true);
        displayGeometricObject(object5);
      }
      public static void displayGeometricObject(GeometricObject object){
        if(object instanceof Triangle){      
        System.out.println();   
        System.out.println(object.toString());
        System.out.println("The filled is " + object.isFilled());
        System.out.println("The side1 is " + ((Triangle)object).getSide1());
        System.out.println("The side2 is " + ((Triangle)object).getSide2());
        System.out.println("The side3 is " + ((Triangle)object).getSide3());
        System.out.println("The color is " + object.getColor());
        System.out.println("The area is " + object.findArea());
        System.out.println("The perimeter is " + object.findPerimeter());
        }
      }
    }