2014-12-07 87 views
-1

我正試圖做下面的程序。爲了將其縮短一點,我刪除了MyRectangle2D的最後一部分。 當我嘗試編譯時,我得到2個錯誤,我只是無法通過我的方式!無法編譯,類未聲明Java

TestExample.java:17: class GeometricObject2 is public, should be declared in a file named GeometricObject2.java 
public abstract class GeometricObject2 { 

TestExample.java:11: cannot find symbol 
symbol : constructor MyRectangle2D(double,double,double,double) 
location: class MyRectangle2D 
     GeometricObject2 rectangle1 = new MyRectangle2D(1.0, 2.0, 3.0, 4.0); 

2 errors 

幫助非常感謝!

import java.util.*; 

public class TestExample 
{ 
    public static void main(String[] args) 
    { 
     GeometricObject2 rectangle1 = new MyRectangle2D(1.0, 2.0, 3.0, 4.0); 
     System.out.println(rectangle1.getArea()); 
    } 
} 


public abstract class GeometricObject2 { 
    private String color = "white"; 
    private boolean filled; 


    protected GeometricObject2() { 
    } 


    protected GeometricObject2(String color, boolean filled) { 
    this.color = color; 
    this.filled = filled; 
    } 

    public String getColor() { 
    return color; 
    } 

    public void setColor(String color) { 
    this.color = color; 
    } 

    public boolean isFilled() { 
    return filled; 
    } 

    public void setFilled(boolean filled) { 
    this.filled = filled; 
    } 

    public abstract double getArea(); 

    public abstract double getPerimeter(); 
} 



class MyRectangle2D extends GeometricObject2 { 

}

+0

你甚至沒有讀錯誤信息... – 2014-12-07 07:24:56

回答

2

如果你想在TestExample.java文件來實現的一切,那麼我會嘗試這樣的事:

import java.util.*; 

public class TestExample 
{ 
    public static void main(String[] args) 
    { 
     GeometricObject2 rectangle1 = new MyRectangle2D(2, 2, 3, 4, "Red", true); 
     System.out.println(rectangle1.getArea()); 
    } 
} 


abstract class GeometricObject2 { 
    private String color = "white"; 
    private boolean filled; 


    protected GeometricObject2() { 
    } 


    protected GeometricObject2(String color, boolean filled) { 
     this.color = color; 
     this.filled = filled; 
    } 

    public String getColor() { 
     return color; 
    } 

    public void setColor(String color) { 
     this.color = color; 
    } 

    public boolean isFilled() { 
     return filled; 
    } 

    public void setFilled(boolean filled) { 
     this.filled = filled; 
    } 

    public abstract double getArea(); 

    public abstract double getPerimeter(); 
} 



class MyRectangle2D extends GeometricObject2 
{ 
    private double x; 
    private double y; 
    private double width; 
    private double height; 

    public MyRectangle2D(double x, double y, double width, double height, 
         String color, boolean filled) { 
     super(color, filled); 
     this.x = x; 
     this.y = y; 
     this.width = width; 
     this.height = height; 
    } 

    public double getArea() { 
     return width * height; 
    } 

    public double getPerimeter() { 
     return 2 * (width + height); 
    } 
} 

而你沒有發佈MyRectangle2D類的完整代碼,所以我真的不知道你打算如何實現它...

+0

非常感謝您的回覆!但編譯器仍然給我錯誤,即使我改變了變量。 :(任何想法爲什麼? – Avacay 2014-12-07 07:38:44

+0

上面的代碼爲我編譯。什麼是錯誤信息和你改變了什麼? – bmk 2014-12-07 07:42:32

+0

我剛剛改變了變量!與你完全一樣。 TestExample.java:11:找不到符號 符號:構造MyRectangle2D(java.lang.String中,布爾) 位置:類MyRectangle2D GeometricObject2 rectangle1 =新MyRectangle2D( 「紅」,真正的); 1錯誤 – Avacay 2014-12-07 07:45:44

1

Java要求,一個叫Foo的公共類名爲Foo.java源文件中定義的 - 這意味着你不能在同一個java文件中聲明瞭兩個公共類(自該文件只有一個名稱)

您需要將GeometricObject2的定義移動到它自己的文件中,該文件將被稱爲GeometricObject2.java。這應該讓你通過你的下一個錯誤。 :)

編輯:正如其他海報已經指出,你也可以使抽象類非公開,但這似乎不是對我有用。

+0

非常感謝你!這使差異..我仍然看到它!爲什麼它更有意義?我認爲編譯器默認情況下做了類? – Avacay 2014-12-07 07:36:55

+0

簡而言之,它與類加載器找到類的方式有關。如果你引用一個類,它將檢查你的類路徑,看它是否已經存在。如果沒有,它將查找名稱正確的文件,並嘗試編譯該文件。 – 2014-12-07 07:39:38

+0

「我認爲默認情況下編譯器創建了類?」編譯器只編譯它需要的東西 - 如果你製作公共類Foo,Bar和Baz,每個都在他們自己的文件中,而Foo指向Bar但是既不指向Baz,那麼當你編譯Foo時,你會發現Bar是編譯成Bar.class,但Baz不是。 – 2014-12-07 07:41:28

1

如果您想在一個文件中保留多個類,則需要刪除public關鍵字。所以應該是前面沒有公衆的abstract class GeometricObject2

你的第二個錯誤中提到的失蹤構造,但對於這一點,你就需要爲MyRectangle2D類提供代碼

UPDATE

所以現在,在註釋類,你的構造問題是由於缺少的構造函數只接受四個雙打。有什麼根據您添加的代碼將解決你的編譯woulb被更改爲

GeometricObject2 rectangle1 = new MyRectangle2D(1.0, 2.0, 3.0, 4.0, "Red", true);

+0

這是MyRectangle2D的代碼條:) class MyRectangle2D擴展GeometricObject2 private double x = 0; private double y = 0; private double width = 0; 私人雙倍高度= 0; MyRectangle2D(){} MyRectangle2D(雙X,雙Y,雙寬度,雙高度,串色,布爾填充){ 超級(顏色,填充的); this.x = x; this.y = y; this.width = width; this.height = height; – Avacay 2014-12-07 07:50:25