【问题标题】:Using classes with inheritance in Main class Java在 Main 类 Java 中使用具有继承性的类
【发布时间】:2013-11-27 13:27:49
【问题描述】:

我的超类叫做 Polygon:

public class Polygon
{
private double area;

/**
 * Constructor for objects of class Rectangle
 */
public Polygon(double area)
{
    this.area = area;
}

/**
 * Mutator method that sets the area
 */
public void setArea(double area)
{
    this.area = area;
}

/**
 * Accessor method that returns the area
 */
public double getArea()
{
    return area;
}
}

我的 Square 类扩展了 Polgyon:

public class Square extends Polygon
{
private double perimeter;

/**
 * Constructor for objects of class Square
 */
public Square(double area)
{
    super(area);
}

/**
 * calculates the perimeter of the square using area inherited from Polygon
 */
public void calcPerimeter()
{
    perimeter = Math.sqrt(getArea()) * 4; //in a square, area is the square root
}

/**
 * Accessor method that returns the perimeter
 */
public double getPerimeter()
{
    calcPerimeter();
    return perimeter;
}
}

除了长度和宽度以及周长之外,我有一个圆形和矩形类几乎相同的东西。

在主类中,我想让用户输入一个区域,然后接收带有该区域的正方形的周长,带有该区域的圆的周长等。我不知道我是否这样做了但是正确...我创建了每个对象并输入了相同的输入。 这是我的主要课程:

public class PolygonMain
{
public static void main(String[] args)
{
    double input = Double.parseDouble(args[0]);
    Polygon polygon = new Polygon(input);
    Square square = new Square(input);
    Circle circle = new Circle(input);
    Rectangle rectangle = new Rectangle(input);
    System.out.println("Area:" + " " + polygon.getArea() + ".");
    System.out.println("Perimeter:" + " " + square.getPerimeter() + ".");
    System.out.println("Circumference:" + " " + circle.getCircumference() + ".");
    System.out.println("Length:" + " " + rectangle.getLength() + ".");
    System.out.println("Width:" + " " + rectangle.getWidth() + ".");
}
}

正如您在我的主类中看到的那样,我将用户输入 (args[0]) 放入每个构造函数的参数中.....哪种类型的构造函数的继承部分即 super(area)... 。无用。是否有必要创建每个新形状?另外,如果我要在主类中实现 Scanner 类怎么办?假设用户可以输入面积值并命令返回关于子类形状的信息,然后使用多个面积值来执行此操作?我将如何去做,因为我不知道如何在主类中创建对象。我们刚刚开始使用 Main 方法;我们的类 IDE 是 BlueJ,它不需要它。我希望我的问题不会与它的措辞混淆,如果我的帖子格式错误,我深表歉意,因为这是我的第一篇帖子。谢谢。

PS:我忘了提到忽略正方形是矩形。我的教授犯了一个错误,不小心指示我们从正方形扩展矩形。

PS:除了在主类中,你们建议将每个不同的形状添加到集合中,然后遍历每个形状并打印出属性,你们还有其他选择吗?我将如何使用 Scanner 类来做到这一点?因为在上述情况下,我已经创建了所有对象。我正在尝试在主课上进行尽可能多的练习,因为由于 BlueJ,我严重缺乏它。

【问题讨论】:

  • 如果实验室的目的是展示多态性,您可能希望为每种多边形类型创建一个getArea() 方法并在循环中调用它。我会回答给你一个想法。
  • 由于您的Square 类继承自Polygon,您应该将外围方法推到Polygon 类。其实正方形也是长方形。
  • ... 然后getPerimeter() 将仅在Polygon 中,而Polygon 的每个特定类型(即每个派生类)都将覆盖calculatePerimeter()
  • @CompuChip:只有多边形形状。
  • @Abdul:对,圆不是多边形,因此不会从多边形继承。这个任务很糟糕。

标签: java inheritance shapes superclass super


【解决方案1】:

据我所知,最好将Polygon抽象化,并让它定义一个抽象方法getPerimiter()

public abstract double getPerimiter();

这样,您的所有子类都需要自己实现该方法。这是合理的,因为它们都使用不同的计算。

所以你的 Polygon 类看起来像这样:

public abstract class Polygon {

  protected double area; //not private, we want sub-classes to see this field

  public Polygon(double area) {
    this.area = area;
  }

  public abstract double getPerimiter();
}

例如,您的正方形应该是这样的:

public class Square extends Polygon {

  public Square(double area) {
    super(area);
  }

  public double getPerimiter() {
    return Math.sqrt(area) * 4;
  }

}

所有子类都必须调用 Polygon 中定义的构造函数,因为没有默认构造函数,因此 Square 中的 super(area) 调用。或者,您可以取消所有构造函数,而在 Polygon 中使用 setArea(double area) 方法。

【讨论】:

    【解决方案2】:

    在构造函数中调用 super(area) 是必要的,因为 Polygon 没有无参数的构造函数。 是的,有必要创建每个新形状,因为您使用对象并且需要先创建它们,然后才能使用它们。 如果你想用这个例子练习继承,你可能想在你的 main 中做这样的事情:

     Polygon[] shapes=new Polygon[4];
     shapes[0]=new Polygon(input);
     shapes[1] = new Square(input);
     shapes[2] = new Circle(input);
     shapes[3] = new Rectangle(input);
    
     for(Polygon p:shapes){
         System.out.println(p.getArea());
     }
    

    并看到数组中所有不同的对象都继承了 Polygon 的 getArea() 方法。另一方面,如果您想调用子类中提供的特定方法 - 例如 getPerimeter() - 您必须将引用转换为子类,否则您将无法使用它:

    Polygon mySquare=new Square(100);
    System.out.println(((Square)mySquare).getPerimeter());
    

    【讨论】:

    • 谢谢,我会补充的。而你刚刚向我展示的参考物清除了将正方形作为正方形的引用,而它对我来说仍然是一个多边形。
    【解决方案3】:

    您可能想要的是使用所有继承类共享的方法。

    Polygon 可以有一种方法,可以为您提供区域 - public double calculateArea() 但是,你不知道类是如何计算它们的面积的,所以把它抽象化

    public abstract double calculateArea()

    在广场:

    public class Square extends Polygon
        {
        private double side;
    
        public Square(double side)
        {
            this.side= side;
        }
    
        @Override
        public double calcArea()
        {
            return side * side;
        }
    
    
        public double getSide()
        {
            return side;
        }
    }
    

    您现在可以对圆做同样的事情:

    public class Circle extends Polygon
        {
        private double radius;
    
        public Square(double radius)
        {
            this.radius= radius;
        }
    
        @Override
        public double calcArea()
        {
            return radius * radius * Math.PI;
        }
    
    
        public double getRadius()
        {
            return radius;
        }
    }
    

    在您的主要方法中,您设置圆和正方形的半径和边长:

    Circle c = new Circle(5);
    Square s = new Square(5);
    

    然后你可以制作一个多边形列表,遍历它,得到面积:

    ArrayList<Polygon> list = new ArrayList<>();
    list.add(c);
    list.add(s);
    
    for (Polygon element: list){
       System.out.println(list.calcArea());
    }
    

    【讨论】:

    • 只是一个示例如何使用此方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 2014-11-15
    • 2013-03-11
    • 2019-02-28
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多