2013-07-23 20 views
-2

我是一個用Java開發的初學者,我遇到了在類中引用一個對象(來自不同類)的問題。在另一個類中引用基本的Java對象

這是我用來從文件「Neighborhoods.java」創建對象的代碼。

public class Neighborhoods { 

    // variables 
    String name; 
    int vertices; 
    double[] latCoords; 
    double[] longCoords; 

    public Neighborhoods() { 
     Neighborhoods fisherHill = new Neighborhoods(); 
     fisherHill.name = "Fisher Hill"; 
     fisherHill.vertices = 4; 
     fisherHill.latCoords = new double[] {42.331672, 42.326342, 42.334464, 42.335733}; 
     fisherHill.longCoords = new double[] {-71.131277, -71.143036, -71.148615, -71.141062}; 
    } 
} 

然後我試圖用我創建的對象,調用從另一個不同的類中的函數時「fisherHill」(從類社區),我的主類(稱爲「inPolygon」)。

inPolygon.check(Neighborhoods.fisherHill.vertices); 

但由於某些原因,當我試圖引用fisherHill對象,因爲它說,它無法找到我得到一個錯誤。

我知道我在這裏犯了一些愚蠢的錯誤,但我不確定它是什麼。對不起,如果我在描述代碼時使用了錯誤的術語。任何幫助或建議將不勝感激。

+3

爲什麼在構造函數中進行遞歸調用?這會在某個時間點產生'StackOverflowError'。 –

+0

'社區fisherHill =新社區();'錯了。改用'this'(例如'this.name =「Fisher Hill」;')。請拿一本Java書。 – m0skit0

+0

好的謝謝你的幫助。我會更正確地重寫這一點。 –

回答

0

您在構造函數中有遞歸調用。

出錯行:

Neighborhoods fisherHill = new Neighborhoods(); 
0

這也許應該是這樣的

public class Neighborhoods { 

    // variables 
    private final String name; 
    private final int vertices; 
    private final double[] latCoords; 
    private final double[] longCoords; 

    public Neighborhoods() { 
    name = "Fisher Hill"; 
    vertices = 4; 
    latCoords = new double[] {42.331672, 42.326342, 42.334464, 42.335733}; 
    longCoords = new double[] {-71.131277, -71.143036, -71.148615, -71.141062}; 
    } 

    public int getVertices() { 
    return vertices; 
    } 

    //and some more getters 
} 

,然後在其他類調用

inPolygon.check(new Neighborhoods().getVertices()); 
1

你有幾件事情錯在那裏:

Neighborhoods fisherHill = new Neighborhoods(); 

爲什麼要在constructor內實例化同一個類的新對象?你的構造函數被調用是因爲這個類的新對象已經被創建了。這個新對象被引用爲this。這是初始化類領域的新對象的正確方法:

this.name = "Fisher Hill"; 
this.vertices = 4; 
this.latCoords = new double[] {42.331672, 42.326342, 42.334464, 42.335733}; 
this.longCoords = new double[] {-71.131277, -71.143036, -71.148615, -71.141062}; 

正如你可以在其他的答案看,this可以中省略。我個人更喜歡把它,它使代碼更易於閱讀。

而且

inPolygon.check(Neighborhoods.fisherHill.vertices); 

沒有這樣static fieldNeighborhoods.fisherHill。即使它在那裏,fisherHill.vertices也不能被訪問,因爲它有default accessibility

您應該創建一個鄰里對象,保持對它的引用,並通過一個getter提取vertices領域:

final Neighborhoods n = new Neighborhoods(); 
final int numVertices = n.getVertices(); 
inPolygon.check(numVertices); 

添加在鄰里一流的getter方法vertices領域:

public int getVertices() { 
    return this.vertices; 
} 

我建議你會得到一本Java書籍,因爲你顯然缺乏基本的Java和OOP知識。

+0

謝謝你的回覆。我重寫了代碼,以便現在乾淨利落地在類中創建對象。但是我仍然無法從不同的類訪問對象的變量。如果我按照你的建議創建了一個getter方法,那麼我必須爲每個對象顯式創建「numVertices」變量,這將是低效的。 –

+1

如果'numVertices'在所有'Neighborhood'對象中都是相同的,那麼你可以聲明一個私有靜態常量'private static final int NUM_VERTICES = 4'。你可以在這個類的任何對象內引用它作爲'Neighborhoods.NUM_VERTICES'或者簡單的'NUM_VERTICES'。如果numVertices在對象之間變化,那麼就沒有辦法在每個對象上覆制它。 – m0skit0

+0

同樣在你的情況下,你甚至不需要這個值,假設你的意思是數組的大小。你可以簡單地執行'public int getVertices(){ return this.latCoords.length; }',它不太容易出現錯誤,例如如果更改數組大小,但忘記更改常量。 – m0skit0

0

回答您的問題:

inPolygon.check(Neighborhoods.fisherHill.vertices); 

但由於某些原因,當我試圖引用fisherHill對象,因爲它說,它無法找到我得到一個錯誤。

在這裏你正在做一個靜態引用,這樣fisherHill只有在它是靜態成員時纔可以訪問。

另外,不要在構造函數中創建實例。

相關問題