2009-05-17 5 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

+0

私は基本コードを追加しました。前述のように、私は単にメソッドCanNewCanvasで配列のキャンバスを呼び出しようとしています。私はDrawingSystemの他のメソッドでそれを使用して編集する必要があるので、キャンバスはパブリック配列としてとどまる必要があります。 –

+0

あなたはそれについて質問しませんでしたが、パブリック静的変数は実際には良いデザインの例ではありません。そのようなコーディングを続けておけば、後であらゆる種類の問題に遭遇します。 –

答えて

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; 
    } 
} 

これは明らかにあなたの割り当ての1対1の相関関係はありませんが、私はあなたがやっていることにそれを適合させることができると思いますよ:-)

+0

ありがとう。私が掲示した例では、私のクラスは別のクラス(世界)のMainメソッドによって参照されています。このコードは提供されているので、呼び出されているクラスのメソッドを作成するだけです(ed、DrawingObectのメソッド) 。しかし、私はそのことが分かった。これまではクラス内でしか作業していなかったので、常にメソッドを定義するために静的メソッドを使用していましたが、DrawingSystemクラスはパブリックではないため、メソッドを定義するときに静的メソッドを含めてはいけません。そうですか?私はメソッド名から静的を削除し、現在はそれに従っています。 –

+0

あなたは正しいです。 'static'キーワードは、クラスのインスタンスを使用して状態を維持したくない場合にのみ使用します(例えば、入力を受け取り、出力を提供するユーティリティメソッド - Math.absを参照)。あなたの特別なケースでは、静的はあなたが作業しているインスタンス変数では動作しません。よくやった! – bedwyr

+0

恐ろしい!再度、感謝します! –

0

いつでもグローバルアレイを再宣言して、自分のニーズに合わせて使用​​することはできますが、それはむしろ疑わしい(意味...なぜグローバルアレイになるのでしょうか)。

あなたのキャンバスがサイズを変えてはいけないようですが、もう一度、あなたの状況についてよく分かりません。

配列がnullであるかどうかを確認し、必要なサイズで宣言すれば幸いですか?

+0

こんにちは、お返事ありがとうございます。キャンバスがグローバルな理由は、クラス内のすべてのメソッドで変更できるためです。最初のメソッドはそれを定義し、2番目のメソッドはそれを定義し、3番目のメソッドはそれを印刷します。配列のキャンバスは既にクラス内でパブリック配列として定義されていますが、私はちょうどcanvas = new char [tmpHeight] [tmpWidth]を使用するかのようにメソッドで呼び出すのに問題があります。メソッドの中で、私はエラーを取得する "静的な変数上のキャンバスは、静的コンテキストから参照することはできません"コンパイルしようとするとき。 –

1

私は右のあなたの質問を得た場合、わからないんだけど

しかし、あなたはSingletonパターンを必要とするように、代わりに公共の場としてchar canvas[][]を宣言する、読み取り専用のプロパティ

としてキャンバスの配列をカプセル化に見えます
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は、彼らそれぞれが自分のcanvas配列を持っていることを意味し、クラスDrawingSystemのインスタンスです。 makeNewCanvasは静的であり、すべてのインスタンスで同じように動作する必要があります。a.canvasまたはb.canvasは、aおよびbに固有であり、内容が異なる可能性があるため使用できません。

+0

ありがとうナッシュ、ええ、ベッドウィーラーが答えを投稿した後、何がうまくいかないのか分かりました。私が上で述べたように、これまでは1つのクラス内でしか作業していませんでした。したがって、Javaでオブジェクトを使用したのは初めてです。したがって、静的メソッドをまだ呼び出そうとしていました。再度、感謝します。 A –

+0

問題なし、何かに新しいことは間違いありません! – nash

関連する問題