java - 在 Java 中使用子类的 main 打印数据

标签 java

早上好!我有一个真正的问题。这是关于从主程序中的数组打印子类的数据。请耐心等待,我对此还很陌生。

程序应打印形状的周长、面积和平均长度,这些形状在父类(super class)“Shape”的子类中定义

但它打印的只是“形状”。

我知道这只是语法上的一个调整,但我已经尝试了几个小时来找到问题所在。我想知道你们中有人能给我一些指点吗?谢谢,我们将非常感谢您的帮助。

→ 为了更容易理解,我粘贴了我的程序的 4 段,

  1. 主要(用于收集用户输入并打印结果)
  2. 形状父类(super class)(主要用于定义周长和面积)
  3. 平行四边形接口(interface)(基本上是边长的平均值)
  4. Square 子类(处理所有信息的地方)

主要:

package shape;

import java.util.ArrayList;
import java.util.Scanner;

@author Fulltime

public class MainExecute {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        ArrayList<Shape> list = new ArrayList<>();
        Triangle t;
        Square s;
        Trapezoid r;

        while(true){
            Scanner Choice = new Scanner(System.in);
            System.out.println("Enter a shape: ");
            String choice = Choice.nextLine();
            if(choice.equalsIgnoreCase("STOP")){
                break;
            }
            else if(choice.equalsIgnoreCase("triangle")){
                System.out.print("Enter base of triangle: ");
                double base = Choice.nextDouble();
                System.out.print("Enter height of triangle: ");
                double height = Choice.nextDouble();
                t = new Triangle(base, height);
                list.add(t);
            }
            else if(choice.equalsIgnoreCase("square")){
                System.out.print("Enter side of square: ");
                double side = Choice.nextDouble();
                s = new Square(side);
                list.add(s);
            }
            else if(choice.equalsIgnoreCase("trapezoid")){
                System.out.print("Enter length1 of trapezoid: ");
                double length1 = Choice.nextDouble();
                System.out.print("Enter length2 of trapezoid: ");
                double length2 = Choice.nextDouble();
                System.out.print("Enter height of trapezoid: ");
                double height = Choice.nextDouble();
                r = new Trapezoid(length1, length2, height);
                list.add(r);
            }
        }
        Shape q;
        System.out.println("Shapes: ");
        for(int i = 0; i <list.size(); i++){
            q = list.get(i);
            System.out.println(q.getClass().getName());
            if(q.getClass().getName().equalsIgnoreCase("Triangle")){
                t=(Triangle)q;
                System.out.println("Perimeter: " + t.getPerimeter());
                System.out.println("Area: " + t.getArea());
            }
            if(q.getClass().getName().equalsIgnoreCase("Square")){
                s=(Square)q;
                System.out.println("Perimeter: " + s.getPerimeter());
                System.out.println("Area: " + s.getArea());
                System.out.println("Average length of sides: " + s.getAverage());
            }
            if(q.getClass().getName().equalsIgnoreCase("Trapezoid")){
                r=(Trapezoid)q;
                System.out.println("Perimeter: " + r.getPerimeter());
                System.out.println("Area: " + r.getArea());
                System.out.println("Average length of sides: " + r.getAverage());
            }
        }    
    }        
}

形状父类(super class)

package shape;
import java.util.*;

public abstract class Shape {

    public abstract double getPerimeter ();
    public abstract double getArea ();

    public double Perimeter;
    public double Area;

    public void displayInfo(){
        //System.out.println("Perimeter: " + this.getPerimeter());
        //System.out.println("Area: " + this.getArea());
    }        
}

平行四边形接口(interface)

package shape;

@author Fulltime

public interface Parallelogram {
    public double getAverage();
}

正方形子类

package shape;
import static java.lang.Math.*;

@author Fulltime

public class Square extends Shape implements Parallelogram {

    public Square(){}

    @Override
    public double getPerimeter (){
        Perimeter = side * 4;    
        return Perimeter;
    }

    @Override
    public double getArea (){
        Area = side * side;   
        return Area;
    }

    @Override
    public double getAverage(){
        double Sides;
        Sides = (this.side + this.side + this.side + this.side) / 4;
        return Sides;
    }

    public double side;

   /**
    * @return the side
    */
    public double getSide() {
        return side;
    }

   /**
    * @param side the side to set
    */
    public void setSide(double side) {
        this.side = side;
    }

    public Square (double side){
        this.side = side;        
    }

    public void printSquare(){
        System.out.println("The Perimeter of this shape is " + getPerimeter());
        System.out.println("The Area of this shape is " + getArea());
        System.out.println("The Average Length of this shape's sides is " + getAverage());
    }   
}

最佳答案

使用getSimpleName()返回不带包限定的类名。

 if(q.getClass().getSimpleName().equalsIgnoreCase("Triangle")){

 }else if(..) // Also use else-if

或者您可以使用instanceof运算符

   if(q instanceof Triangle){
      //logic here
   }else if(..)

现在需要注意的是,这不是一个好的使用 if-else 的面向对象设计,您应该重新考虑重新设计您的模型。

例如,使 displayInformation 抽象,然后所有具体子类都必须重写它。

abstract class Shape{

 public abstract void displayInformation(); 
}

三角形

public class Triangle extends Shape implements whatyouwant {


 @Override 
 public void displayInformation(){
   System.out.println("Perimeter: " + this.getPerimeter());
   System.out.println("Area: " + this.getArea());
 }

}

正方形:

public class Square extends Shape ..{

 @Override
 public void displayInformation(){
     System.out.println("Perimeter: " + this.getPerimeter());
            System.out.println("Area: " + this.getArea());
            System.out.println("Average length of sides: " + this.getAverage());
 }

}

因此,在您的主类中,您不必编写任何if-else,只需查看多态性魔法即可。

  for(Shape shape : list){//use enhanced loop
     shape.displayInformation();
  }

关于java - 在 Java 中使用子类的 main 打印数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21916319/

相关文章:

java - TableView 绑定(bind)和 Object HAS-A 关系

java - JBOSS 5_1_0 GA 是否支持在 WAR 中打包 EJB?

java - Spring 启动: Unit Test with Cassandra

java - Long 类型的方法参数缺少 URI 模板变量 'usuarioEntidade'

java - 使用 ProcessBuilder 执行 Linux 命令并从 reader.readLine() 获取 NULL,尽管行数为 102

java - 十六进制到二进制字符串Java

java - 安卓语音合成 : Speaking Long text

java - 将文件从目录复制到手机内部存储的另一个目录时出错?

java - 禁用 JTree 中的标准鼠标行为

java - 我的对象 boolean 值在程序不执行任何操作的情况下发生了变化