在主类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:对,圆不是多边形,因此不会从多边形继承。这个作业很糟糕。只是一个例子,你可以如何使用这个方法谢谢你,我要补充一点。你刚才给我看的参考物清除了正方形作为正方形的参考,而对我来说它仍然是一个多边形。