我的超级名为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;
}
}
扩展Polgyon的My Square课程:
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])放入每个构造函数的参数中......哪种构造函数的继承部分即超级(区域)...... 。无用。是否有必要创造每一个新的形状?另外,如果我要将Scanner类实现到主类中呢?假设用户可以键入区域值并命令返回子类形状的信息,然后使用多个区域值来执行此操作?我将如何去做,因为我不知道如何在主类中创建对象。我们刚开始使用Main方法;我们这个类的IDE是BlueJ,它不需要它。我希望我的问题不会与它的措辞太混淆,如果我将这个帖子格式错误,我会道歉,因为这是我的第一篇文章。谢谢。
PS:我忘了提到要忽略那个正方形是一个矩形。我的教授犯了一个错误,不小心指示我们从正方形延伸矩形。 PS:除了在主类中,你们建议将每个不同的形状添加到一个集合中然后迭代每个并打印出属性,你们还有其他选择吗?我如何使用Scanner类进行操作?因为在上面的情况下,我已经创建了所有对象。我正试图尽可能多地练习主要课程,因为BlueJ导致我严重缺乏练习。答案 0 :(得分: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中的超级(区域)调用。或者,您可以取消所有构造函数,而在Polygon中使用setArea(双区域)方法。
答案 1 :(得分:1)
在构造函数中调用super(area)是必要的,因为Polygon没有没有args的构造函数。 是的,有必要创建每个新形状,因为您使用对象,并且需要先创建它们才能使用它们。 如果你想用这个例子练习继承,你可能想在你的主要做这样的事情:
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());
答案 2 :(得分:0)
您可能需要的是使用所有继承类共享的方法。
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());
}