1

現在、2D Arrays を使用して図形を描画しようとしています。私のクラスには、で定義されたグローバル配列があります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] = ' ';
            }
        }       
    }
4

4 に答える 4

2

あなたの問題は、それmakeNewCanvas(int tmpWidth, int tmpHeight)が静的であるか静的public char canvas[][]ではないことです。

Java の静的クラス メンバーは、他の静的クラス メンバーとのみ連携できます。静的メンバーはクラスに属し、非静的メンバーはインスタンスに属します。クラスはオブジェクトの作成に使用されるテンプレートであり、これらのオブジェクトはクラスのインスタンスと呼ばれます。static を宣言すると、クラスのすべてのインスタンスで共有されます。メソッドの場合、これは、静的メソッドがすべてのインスタンスでまったく同じように動作する必要があることを意味します。

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

abはクラスのインスタンスであり、DrawingSystemそれぞれが独自のcanvas配列を持つことを意味します。は静的makeNewCanvasであり、使用できないすべてのインスタンスに対して同じように動作する必要があるため、a.canvasまたはb.canvasそれらが一意でaありb、異なるコンテンツを持つことができるためです。

于 2009-05-17T03:37:11.600 に答える
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;
    }
}

これは明らかにあなたの課題と一対一の相関関係ではありませんが、あなたがやっていることに適応できると確信しています:-)

于 2009-05-17T02:25:55.263 に答える
1

あなたの質問が正しいかどうかわかりませんが、

ただし、シングルトン パターンが必要なようです。char canvas[][]パブリック フィールドとして宣言する代わりに、キャンバス配列を読み取り専用プロパティとしてカプセル化します。

public class MyDrawing 
{

private char canvas[][] = null;

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

getCanvas()以前に使用されたキャンバス パブリック変数の代わりにキャンバス配列が必要な場合に、コードの他の部分で使用する場合。

于 2009-05-17T02:23:49.340 に答える
0

あなたが何を求めているのかちょっと混乱しています。

いつでもグローバル配列を再宣言して、自分のニーズに合わせて使用​​できます...しかし、それはかなり疑わしいようです(つまり...なぜこれがグローバル配列になるのでしょうか)。

キャンバスのサイズを変更するべきではないようです...しかし、繰り返しになりますが、私はあなたの状況についてあまり知りません.

配列が null かどうかを確認し、そうであれば、必要なサイズであると宣言して、喜んで使用しますか?

于 2009-05-17T01:27:41.567 に答える