当前位置: 首页 > 面试题库 >

如何在Java中使用多态来制作具有不同类型的列表?

邵旺
2023-03-14
问题内容

我有3类 圆形,矩形和正方形

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

这意味着 用户可以根据需要进行操作,例如3个 圆形 ,2个 矩形 和7个 正方形 。形状的数量取决于用户。

然后,我想将它们保存在 单元列表中, 并调用我的类方法,它们分别是 calculateArea
calculatePerimeter ,并使用名称显示它们的周长和面积。

我该怎么做?

这些是我的课

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;
    }
}

问题答案:

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

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());


 类似资料:
  • 我必须使用相同的图表报告模板创建具有不同数据集的多个XY折线图,并且还必须使用JRBeanCollectionDatasource。 要求: 1) 应使用JRBeanCollectionDatasource完成。 2) 必须使用同一图表报告模板创建多个图表。 3)图表的数量不固定(这里我在java中给报表参数命名时遇到问题)。因为在ReportParameter sMap中,它们只能有唯一的键名。

  • 我有一些不同列的excel表格,如下所示: 表A:Col1 Col2 Col3 表B: Col2 Col4 Col5 表C: Col1 Col6 Col7 我的最终表格应该是: 最终表格:Col1 Col2 Col3 Col4 Col5 Col6 Col7 如果没有特定列的详细信息,则应保留为空。我一次只成功地合并了两个表,但我想将所有表合并在一起。 这是合并两张图纸的代码: 这是我编写的用于合并

  • 我按照本指南将Micronaut Serialization与Jackson注释一起使用。当我创建一个抽象类和一个类时,我可以使用和来正确序列化类的对象。 但是,当我使用类型的属性序列化的对象但使用运行时类型时,该属性被序列化为。 下面的代码应该解释了我的问题。请注意,我正在使用,当我将其替换为时,它会按预期工作。 有没有一种方法可以使用注释使其工作?

  • 问题内容: 我对此进行了扩展,应该可以帮助我在上下文之间传输对象: 现在它返回的对象,我应该将其强制转换为我想要的类,如下所示: 有没有办法避免这种无用的转换,如果我从类的对象调用使其返回类型? 问题答案: 更新: 有关更好的解决方案 与如何在NSManagedObjectSwift扩展中如何创建托管对象子类的实例中类似,这可以使用通用的辅助方法来完成: 请注意,我已将返回类型更改为。 并 没有

  • 我的系统有两种不同类型的消息-类型A和B。每条消息都有不同的结构-类型A包含一个int成员,类型B包含一个double成员。我的系统需要将这两种类型的消息传递给许多业务逻辑线程。减少延迟非常重要,因此我正在研究使用中断器以机械方式将消息从主线程传递到业务逻辑线程。 我的问题是,破坏者只接受环形缓冲区中的一种类型的对象。这是有意义的,因为破坏者预先分配了环形缓冲区中的对象。然而,这也使得通过Disr

  • 我正在用C语言开发一种象棋游戏,只是为了练习。在游戏开始时,用户可以键入4样东西: ROW