2010-04-01 17 views
0

所有工作,設置DrJava通過弗裏德曼/ Felleisen 「A小的Java」

我經歷了弗裏德曼& Felleisen書 「一個小的Java,有幾個模式」。我試圖在DrJava中輸入例子,但是我收到了一些錯誤。我是初學者,所以我可能會犯新人的錯誤。

以下是我已經設置:

public class ALittleJava { 
    //ABSTRACT CLASS POINT 
    abstract class Point { 
    abstract int distanceToO(); 
    } 
    class CartesianPt extends Point { 
    int x; 
    int y; 
    int distanceToO(){ 
     return((int)Math.sqrt(x*x+y*y)); 
    } 
    CartesianPt(int _x, int _y) { 
    x=_x; 
    y=_y; 
    } 
    } 
    class ManhattanPt extends Point { 
    int x; 
    int y; 
    int distanceToO(){ 
     return(x+y); 
    } 
    ManhattanPt(int _x, int _y){ 
     x=_x; 
     y=_y; 
    } 
    } 
}

和主的身邊:

public class Main{ 
    public static void main (String [] args){ 
    Point y = new ManhattanPt(2,8); 
    System.out.println(y.distanceToO()); 
    } 
}

編譯器無法找到符號Point並在程序中ManhattanPt

如果我通過ALittleJava.每之前,我得到另一個錯誤爲主,即

包含ALittleJava.ManhattanPt一個封閉的情況下,需要

我試圖找到ressources在'網上,但這本書必須有一個非常機密的後續,我找不到多少。

謝謝大家。

JDelage

+0

[包含一個類實例的可能重複的<我的參考>是需要](http://stackoverflow.com/questions/4297857/an-enclosing-instance-that-c​​ontains-my-reference-is-required) – 2013-09-26 12:40:45

回答

1

讓你的內部類static,否則你將需要從ALittleJava實例訪問您的內部類,如ALittleJava java = new ALittleJava(),這似乎並不匹配您的使用案例。

static內部類無法看到它們的封閉類的成員,並且如果類是非靜態的,相反地,它們可以看到它們的封閉類的成員,並且實際上需要封閉的實例。

+0

儘管「抽象」是本書的核心。 – JDelage 2010-04-01 16:05:43

0

這段代碼是從本書逐字複製的嗎?如果是這樣,這個結構有點不合常規 - 通常每個文件定義一個類(Point.java,CartesionPt.java等),並且在特殊情況下只能以這種方式設置(使用內部類)。

+0

這本書沒有描述如何設置代碼,將什麼放入不同的文件等。除本書第一行外,其他所有內容都是逐字的。 – JDelage 2010-04-01 16:10:30

+0

Stefan Kendall的回答是正確的 - main()應該在你的類ALittleJava中聲明,而不是在它自己的類中聲明。 – 2010-04-01 18:37:17

+0

IMO,關於Java的最佳入門書籍是Bruce Eckel的「Thinking in Java」。弗裏德曼/菲利森以其關於脣齒的書而聞名。 – 2010-04-01 18:39:08

1

現在我想到了,ALittleJava是一個瘋狂的類名,除非它是主要的類。

如果你把public static void main(String[] args)置於ALittleJava之內,你應該可以使用這些類。

1

使你的文件是這樣的:

//ABSTRACT CLASS POINT 
abstract class Point { 
    abstract int distanceToO(); 
} 
class CartesianPt extends Point { 
    int x; 
    int y; 
    int distanceToO(){ 
    return((int)Math.sqrt(x*x+y*y)); 
    } 
    CartesianPt(int _x, int _y) { 
    x=_x; 
    y=_y; 
    } 
} 
class ManhattanPt extends Point { 
    int x; 
    int y; 
    int distanceToO(){ 
    return(x+y); 
    } 
    ManhattanPt(int _x, int _y){ 
    x=_x; 
    y=_y; 
    } 
} 
class Main { 
    public static void main (String [] args) { 
    Point y = new ManhattanPt(2,8); 
    System.out.println(y.distanceToO()); 
    } 
} 

然後,在「交互」選項卡中輸入以下命令:

java Main