2017-06-01 107 views
0

我目前正在学习java。我的一项任务要求我们编写一些继承代码,它将在Eclipse的控制台中显示一个矩形。试图运行它时,我不断收到错误信息,但无法弄清楚我做错了什么。任何提示或指导将不胜感激。无法实例化类型矩形

TestShape.java

public class TestShape { 

    public static void main(String[] args) { 

     double width = 5, length = 7; 
     Shape rectangle = new Rectangle(width, length); 
     System.out.println("Rectangle width: " + width + " and length: " + length 
       + "\nResulting area: " + rectangle.area() 
       + "\nResulting perimeter: " + rectangle.perimeter() + "\n"); 
    } 

} 

Shape.java

public abstract class Shape { 

     public abstract double area(); 
     public abstract double perimeter(); 
     public double getArea() { 
      // TODO Auto-generated method stub 
      return 0; 
     } 
     public double getPerimeter() { 
      // TODO Auto-generated method stub 
      return 0; 
     } 

} 

Rectangle.java

public abstract class Rectangle extends Shape { 

    private final double width, height, area, perimeter; 

    public Rectangle(double width, double height) { 

    this.width = width; 

    this.height= height; 

    this.area = width * height; 

    this.perimeter = 2 * (width + height); 
    } 

    @Override 

    public double getArea() { 

    return this.area; 

    } 

    @Override 

    public double getPerimeter() { 

    return this.perimeter; 

    } 

} 
+0

你不能像你那样实例化一个抽象类 –

+0

你不能实例化抽象类 - 它们只能被继承。从'Rectangle'类的定义中移除'abstract'。 –

+1

为什么你的Rectangle类是抽象的? –

回答

1

当你有defin ed在Shape类中有2个抽象方法,这些需要由Rectangle类或Rectangle类实现,需要抽象化。如果你使矩形抽象,你将无法实例化。为了让你的代码最小的变化的工作,请chhange您矩形类实现到:

public class Rectangle extends Shape { 

    private final double width, height, area, perimeter; 

    public Rectangle(final double width, final double height) { 
     this.width = width; 
     this.height = height; 
     this.area = width * height; 
     this.perimeter = 2 * (width + height); 
    } 

    @Override 
    public double getArea() { 
     return this.area; 
    } 

    @Override 
    public double getPerimeter() { 
     return this.perimeter; 
    } 

    @Override 
    public double area() { 
     return getArea(); 
    } 

    @Override 
    public double perimeter() { 
     return getPerimeter(); 
    } 
} 
+1

@ shash678谢谢,我已经更新了我的答案。 –

+0

非常感谢。这解决了我的问题! –

2

的事情是,你不能实例abstract class

Shape rectangle = new Rectangle(width, length); 

而且你不能在Rectangle删除abstract关键字因为两种方法都没有在Shape类中实现。

public abstract double area(); 
public abstract double perimeter(); 

实例化,你需要创建concreate类或可在Rectangle类,其方法是从Shape类继承实现所有的方法。

由于area()perimeter()Rectangle类的功能,你可以实现这两种方法,并从Rectangle类中删除abstract(现在这个类是一个具体的类)。然后,你可以在main中实例化Rectangle类。

相关问题