2009-05-17 41 views
1

我正在嘗試使用2D數組繪製形狀。在我班上有一個與public char canvas[][];調用全局數組

截至定義到現在爲止一個全局數組,我只聲明瞭char canvas[][] = new char[height][width];

陣列如果陣列已經聲明,並且我不應該修改代碼我已經給出了,我該如何調用該數組的一個實例,以便我可以使用它?

謝謝。

(編輯)

class DrawingSystem { 

    public char canvas[][]; 

     public static void makeNewCanvas(int tmpWidth, int tmpHeight) { 

     canvas[][] = new char[tmpHeight][tmpWidth]; 

     for (int row=0; row<tmpHeight; row++) { 
      for (int col=0; col<tmpWidth; col++) { 
       canvas[row][col] = ' '; 
      } 
     }  
    } 
+0

你可以發佈更多一點的代碼?這是功課嗎?如果是這樣,你會這樣標記嗎? – bedwyr 2009-05-17 01:47:26

+0

我已添加基本代碼。如上所述,我只是想在MakeNewCanvas方法中調用數組畫布。帆布需要保持作爲一個公共數組,我需要使用,並在DrawingSystem其他方法編輯 – 2009-05-17 02:23:10

+0

你沒有問,但公共靜態變量並不是真正的好的設計的例子。如果你保持這樣的編碼,你將在稍後遇到各種各樣的問題。 – 2009-05-17 12:31:35

回答

2

您在靜態方法和實例變量之間存在不兼容問題。

想想這樣:一個實例變量與一個類的特定實例相關聯;靜態變量與類別本身相關聯。你叫通過類的靜態方法:

ClassI.callStaticMethod(); 

而你通過類的實例調用實例方法:

public ClassI classObj = new ClassI(); 
classObj.callInstanceMethod(); 

在您發佈的代碼,有一個實例變量(「畫布」)在靜態方法中設置(main與類關聯,而不是實例)。

因此,您需要創建實例方法來修改/更新您的「畫布」,並在靜態函數內創建類的實例。這個對象(一個「實例」)可以用來更新實例變量。

下面是一個例子:

public class Foo { 
    public char canvas[][]; 

    public static void main(String[] args) { 
     Foo fooObj = new Foo(); //creates an instance of this class 
     fooObj.createCanvas(2, 2); 
     fooObj.modifyCanvas(0, 0, 'c'); 
    } 

    public void createCanvas(int x, int y) { 
     canvas = new char[x][y]; 
    } 
    public void modifyCanvas(int x, int y, char c) { 
     canvas[x][y] = c; 
    } 
} 

這顯然不是一個一對一關係到你的任務,但我敢肯定,你就可以使其適應自己在做什麼:-)

+0

謝謝bedwyr。隨着我張貼的例子,我的課是由Main方法在另一個類(世界)引用了提供這個代碼,因此所有我應該做的是建立在類中的方法被調用(ED,在DrawingObect方法) 。但我意識到它是什麼。直到現在我只能在一個類中工作,所以總是使用靜態來定義我的方法,但由於類DrawingSystem不是公共的,所以在定義我的方法時不應該包含靜態。是對的嗎?我從方法名稱中刪除了靜態,現在它符合。 – 2009-05-17 02:44:17

+0

你是對的。只有當您不希望使用類的實例維護狀態(例如,輸入輸出並提供輸出的實用程序方法 - 請參閱Math.abs)時,纔會使用「static」關鍵字。在你的特定情況下,靜態不會與你正在使用的實例變量一起工作。做得好! – bedwyr 2009-05-17 03:00:01

+0

太棒了!再次感謝! – 2009-05-17 03:21:38

0

有點兒困惑,你問什麼。

你可以隨時重新聲明全局數組,並將其用於你自己的需要......但這似乎相當可疑(意味着......爲什麼這是一個全局數組)。

看起來你的畫布不應該改變尺寸......但是再次,我對你的情況瞭解不多。

檢查數組是否爲空,如果是的話聲明它是你想要的大小,並愉快地使用它?

+0

嗨,謝謝你的回覆。畫布是全球性的原因是它可以通過班級中的所有方法進行修改。第一個方法定義它,第二個方法在其中繪製一個方形,然後第三個方法打印它。數組畫布已經在類中定義爲公共數組,我只是在方法中調用它時遇到問題,就好像我只是使用canvas = new char [tmpHeight] [tmpWidth];在該方法內部,當試圖編譯時,出現錯誤「靜態變量畫布無法從靜態上下文中引用」。 – 2009-05-17 01:39:53

1

我不知道如果我得到你的問題的權利,

但看起來不是宣佈char canvas[][]作爲公共領域像你需要一個Singleton模式,封裝畫布陣列爲只讀屬性

public class MyDrawing 
{ 

private char canvas[][] = null; 

public char[][] getCanvas() 
{ 
    if (canvas!=null) 
    { 
     canvas =new char[height][width]; 
    } 
    return canvas; 
} 

在代碼的其他部分使用getCanvas()時,如果需要畫布數組而不是以前使用的畫布公共變量。

2

您的問題是makeNewCanvas(int tmpWidth, int tmpHeight)是靜態或public char canvas[][]也不是一成不變的。

在Java靜態類成員只能與其他靜態類成員的工作。靜態成員屬於類,非靜態成員屬於實例。該類是用於創建對象的模板,這些對象稱爲類的實例。當你聲明一些靜態的東西時,它被類的所有實例共享。在方法的情況下,這意味着靜態方法在所有實例上的行爲必須完全相同。

DrawingSystem a = new DrawingSystem(); 
DrawingSystem b = new DrawingSystem(); 

ab是類DrawingSystem的情況下,這意味着他們每個人都有自己的canvas陣列。現在既然makeNewCanvas是靜態的,其行爲必須爲所有情況下,它不能使用a.canvasb.canvas,因爲他們是唯一的ab,可以有不同的內容相同。

+0

感謝納什,是的,我意識到Bedwyr發佈他的答案後出了什麼問題。正如我上面提到的,我迄今爲止只在一個類中工作過,所以這是我第一次在Java中使用對象,因此仍然調用靜態方法...現在明白了!再次感謝。 A – 2009-05-17 09:21:33

+0

沒有問題,而且在新事物上沒有任何問題! – nash 2009-05-19 00:02:26