在主类Java中使用带继承的类

在主类Java中使用带继承的类,java,inheritance,shapes,superclass,super,Java,Inheritance,Shapes,Superclass,Super,我的超级类称为多边形: 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) {

我的超级类称为多边形:

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;
}
}
我有一个圆形和矩形的类,除了长度、宽度和周长,它们几乎是一样的

在main类中,我想允许用户输入一个区域,然后接收一个正方形的周长和一个圆圈的周长,等等。我不知道我是否正确地输入了这个区域…我创建了每个对象并输入了相同的输入。 这是我的主要课程:

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:除了在主类中,你们建议将每个不同的形状添加到集合中,然后迭代每个形状并打印出属性之外,你们还有其他选择吗?我将如何使用Scanner类来完成它?因为在上述情况下,我必须创建所有对象。我正试图在主课上得到尽可能多的练习,因为我因为BlueJ而严重缺乏主课

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

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

因此,您将多边形分类为如下所示:

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

}
例如,你的正方形看起来是这样的:

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

}

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

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

多边形可以有一个方法,它为您提供面积-
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;
    }
}
现在,您可以对circle执行相同的操作:

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());
}
ArrayList list=new ArrayList();
增加(c)项;
列表。添加(s);
用于(多边形元素:列表){
System.out.println(list.calcArea());
}
在构造函数中调用super(area)是必要的,因为多边形没有不带参数的构造函数。 是的,创建每个新形状是必要的,因为您使用对象,并且需要先创建它们,然后才能使用它们。 如果你想用这个例子来实践继承,你可能想在你的主程序中做一些类似的事情:

 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());
 }
并查看数组中的所有不同对象都从多边形继承了getArea()方法。另一方面,如果您想调用子类中提供的特定方法,比如getPermission(),则必须将引用转换为子类,否则将无法使用它:

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

如果实验室的目的是展示多态性,那么您可能需要为每个多边形类型创建一个
getArea()
方法,并在循环中调用该方法。我回答给你一个想法。因为你的
Square
类继承自
Polygon
,你应该把周长方法推到
Polygon
类。事实上,正方形也是长方形。。。。然后,
getPerimeter()
将只在
Polygon
中,而
Polygon
的每个特定类型(即每个派生类)将覆盖
calculatePerimeter()
@CompuChip:只有多边形的形状。@Abdul:对,圆不是多边形,因此不会从多边形继承。这个作业很糟糕。只是一个例子,你可以如何使用这个方法谢谢你,我要补充一点。你刚才给我看的参考物清除了正方形作为正方形的参考,而对我来说它仍然是一个多边形。