0

重複の可能性:
「静的コンテキストから非静的メソッドを参照できない」理由は何ですか?

私はJavaが初めてです。以下のコードセットがあります。

class Default
{
    private short s;
    private int i;
    private long l;
    private float f;
    private double d;
    private char c;
    private String str;
    private boolean b;

    public static void main (String args[ ])
    {

        Default df = new Default();

        System.out.println("\n Short = "+s);

        System.out.println ("\n int i =" + i);
        System.out.println ("\n long l =" + l );
        System.out.println ("\n float f =" + f);
        System.out.println ("\n double d =" + d);
        System.out.println ("\n char c =" + c);
        System.out.println ("\n String s =" + str);
        System.out.println("\n boolean b =" + b);
    }
}

これにより、この質問の主題としてエラー メッセージが生成されますが、次のコードは完全に機能します。

class Default
{
    private short s;
    private int i;
    private long l;
    private float f;
    private double d;
    private char c;
    private String str;
    private boolean b;

    public static void main (String args[ ])
    {

        Default df = new Default();

        System.out.println("\n Short = "+df.s);

        System.out.println ("\n int i =" + df.i);
        System.out.println ("\n long l =" + df.l );
        System.out.println ("\n float f =" + df.f);
        System.out.println ("\n double d =" + df.d);
        System.out.println ("\n char c =" + df.c);
        System.out.println ("\n String s =" + df.str);
        System.out.println("\n boolean b =" + df.b);
    }
}

これにより、目的の結果が得られます。これら 2 つのコード セットの違いは何ですか。

4

2 に答える 2

2

これらの変数を呼び出しているDefaultnamedのインスタンス化されたオブジェクトがあります。df作成した変数はではないためstatic、作成されたオブジェクトの一部である必要があります。

Default df = new Default();
df.i //<- is now a part of the instantiated object df.

staticオブジェクトで使用されていない場合は、キーワードを使用します。だからあなたはただ言うことができます:

private static char c;

そして、char cいつでも電話をかけることができますnull。これは、まだ値を指定していないためです。

staticオブジェクトなしでその変数またはメソッドを使用する場合に使用します。

于 2012-11-19T23:19:17.250 に答える
0

2 つのコード セットの違いは、2 番目の例ではクラスのインスタンスがあり、これはDefault df = new Default();.

クラス内のすべての変数をインスタンス レベルの変数として宣言しました。Defaultつまり、変数にアクセスするには、クラスの特定のインスタンスを経由する必要があります。別の言い方をすれば、クラスの各インスタンスには独自の変数セットがあるため、コンパイラが実際にアクセスしている変数を知る唯一の方法は、最初に使用するインスタンスを指定することです。

たとえば、次のことができます。

Default df = new Default();
Default anotherOne = new Default();

df.s = 1;
anotherOne.s = 2;

System.out.println("\n Short(df) = "+df.s);                  //'1'
System.out.println("\n Short(anotherOne) = "+anotherOne.s);  //'2'

main()(または他の静的メソッドから)インスタンス変数に直接アクセスしようとする場合の問題は、main()メソッドがクラスのインスタンスに直接関連付けられていないことです。その場合、コンパイラは、変数を明示的に指定しない限り、どのインスタンスから変数をフェッチするかを認識しません。

もちろん、変数を静的にすることもできますが、インスタンスごとに 1 つの値のセットを作成する代わりに、作成するインスタンスの数に関係なく、クラスの変数のセットを 1 つだけ持つことになります。sこのような場合、例のコードは引き続きコンパイルおよび実行されます(ただし、コンパイラの警告が生成される/生成されるはずです) 。クラスの。

于 2012-11-19T23:34:40.250 に答える