建立一个从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();
}
• 三角形的三个边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();
}
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()方法,应该怎么办???
GeometricObject geoObject3 = new Triangle(1, 1.5,1,"yellow",true);
如果要按你说的那么传型的话,即
GeometricObject object = new Triangle();
那怎么设置边长为1,1.5,1,设置颜色为yellow,填充属性为true?????
我很迷惑!!!!
那我们要显示
写一段测试程序,建立一个三角形对象,边长为1,1.5,1,设置颜色为yellow,填充属性为true(这两个属性都是从GeometricObject类继承下来的),然后显示面积,边长,颜色以及是否填充等信息。
显示边长,要怎么办???? 获得边长的方法getSide()只有子类里有定义啊!!!
看了回复大概知道是什么问题了
父类是不能调用子类的方法的,你既然已经做了if(object instanceof Triangle)这个判断,为什么不强制转型呢?
如果你是这样实例话的GeometricObject geoObject3 = new Triangle(1, 1.5,1,"yellow",true);
那强制转型后调用子类追加的方法是没有问题的
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());
}
}
}