【问题标题】:How to use polymorphism to make list with different types in java?java - 如何使用多态性在java中创建具有不同类型的列表?
【发布时间】:2019-09-15 14:18:50
【问题描述】:

我有 3 个课程 圆形、矩形和方形

我想获取上述每个类所需的数据并由用户创建。

表示用户可以制作 任何想要的,例如 3 个 Circles 、2 个 Rectangles 和 7 个 Squares 。 形状的数量取决于用户。

然后我想将它们保存在 unit list 中并调用我的类方法,它们是 calculateAreacalculatePerimeter 并显示周长和面积其中有他们的名字。

我该怎么做?

这是我的课

圈子

public class Cricle {

    private int radius;

    public Cricle(int radius) {
        this.radius = radius;
    }

    public  double calculateArea()
    {
        return (radius*radius)*Math.PI;
    }
    public double  calculatePerimeter()
    {
        return  (radius*2)*Math.PI;
    }
}

矩形

public class Rectangle {

    private int width;
    private int height;

    public Rectangle(int width, int height) {
        this.width = width;
        this.height = height;
    }
    public int calculateArea() {
        return width*height;
    }

    public int calculatePrimeter() {
        return (width+height)*2;
    }
}

方形

public class Square {
    private int edge;


    public int calculateArea() {
        return edge*edge;
    }

    public int calculatePrimeter() {
        return edge*4;
    }
}

【问题讨论】:

  • 让所有类实现某个接口,例如Shape,然后有一个ListShapes
  • 这是java书籍和tutorials中最基本的接口/继承示例。

标签: java list class oop polymorphism


【解决方案1】:

如果您想获得有关多态性在 java 中的工作原理的官方参考资料,请参阅 Oracle Java 教程的section on Polymorphism,它解释了给定类的变量可以保存其任何子类的值,以及调用超类的方法如果存在,变量将使用子类中的实现。

根据您的问题定制本教程中的信息:
List 可以被认为是变量的集合,并且前面的答案中描述的Shapes 列表可以包含Shape 的任何子类的实例,即SquareRectangleCircle。对列表元素调用calculateAreacalculatePrimeter 方法将调用该形状的相应方法。

【讨论】:

    【解决方案2】:

    您可以定义一个接口,您的所有类都将实现该接口。 将所有常用方法添加到接口中。

    public interface Shapes {
       public double calculateArea();
       public double calculatePrimeter();
    }
    

    现在你所有的形状类都将实现上述接口并提供接口方法的实现。在您的情况下,更改所有方法的返回类型。你可以把它加倍。

    public class Circle implements Shapes{
        private int radius;
    
        public Circle (int radius) {
            this.radius = radius;
        }
    
        @Override
        public double calculateArea() {
            return (radius * radius) * Math.PI;
        }
    
        @Override
        public double calculatePrimeter() {
            return (radius * 2) * Math.PI;
        }
    }
    
    public class Rectangle implements Shapes{}
    public class Square implements Shapes{}
    

    那么你需要有一个列表

    static List<Shapes> unitList = new ArrayList<Shapes>();
    

    从用户那里获取输入并添加到上面的列表中。然后只需循环 unitList 并调用相应的方法

    用于计算面积

    for (Shapes shape : unitList)
        System.out.println("Area: " + shape.calculateArea());
    

    用于计算周长

    for (Shapes shape : unitList)
        System.out.println("Perimeter: " + shape.calculatePrimeter());
    

    【讨论】:

      【解决方案3】:

      创建一个接口让我们调用TwoDimensionalShape 并在其中放入常用方法。

      public interface TwoDimensionalShape {
         double calculateArea();
         int calculatePrimeter();
      }
      

      所有的类都实现了这个interface

      public class Circle implements TwoDimensionalShape {
          //your code 
      }
      
      public class Rectangle implements TwoDimensionalShape {
          //your code 
      }
      
      public class Square implements TwoDimensionalShape {
          //your code 
      }
      

      并创建一个List&lt;TwoDimensionalShape&gt; 并将所有这些形状放入此列表中。喜欢

      List<TwoDimensionalShape> shapes= new ArrayList<TwoDimensionalShape>();
      shapes.add(new Circle(5));
      shapes.add(new Rectangle(4,3));
      shapes.add(new Square(4));
      for (TwoDimensionalShape shape : shapes) {
          System.out.println("Area = " + shape.calculateArea());
          System.out.println("Perimeter = " + shape.calculatePrimeter());
      }
      

      【讨论】:

        【解决方案4】:

        创建一个接口,例如。形状。

        public interface Shape {
            int calculateArea();
            int calculatePrimeter();
        }
        

        在所有三个类中实现这个接口。 单元列表将是 List&lt;Shape&gt;,然后您可以调用 calculateArea()calculatePrimeter() 方法,同时遍历列表

        【讨论】:

          【解决方案5】:

          您可以使用继承的概念来做到这一点。例如,创建一个 Shape 类,然后让其他类继承:

          public abstract class Shape {
            public int calculateArea();
          }
          public class Circle extends Shape {}
          public class Square extends Shape {}
          public class Rectangle extends Shape {}
          

          然后,您可以使用形状列表。

          【讨论】:

          • 首选接口胜于抽象类。
          • @Kartik,为什么更喜欢界面??
          • @Dred 谷歌我上面写的句子。它将指向您 Joshua Bloch 的《Effective Java》
          猜你喜欢
          • 2014-04-13
          • 1970-01-01
          • 2020-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多