非静的な意味、つまりキーワードなしで宣言されたfield / methods/...を理解するのに役立つと思いますstatic
。
キーワードstaticなしで宣言されたすべてのフィールドは、オブジェクトの一部として存在します。2つのオブジェクトがある場合、これら2つのオブジェクトのそれぞれに、内容が異なる可能性のあるフィールドがあります。
class X {
int f;
}
X x1 = new X();
X x2 = new X();
x1.f = 5;
x2.f = 10;
// x1.f still is 5
ただし、静的フィールドはオブジェクトごとではなく、クラスごとに存在します。g
したがって、次の例では、クラスのオブジェクトがいくつ(ある場合)でも、フィールドは1つだけY
です。
class Y {
static int g;
}
Y y1 = new Y();
Y y2 = new Y();
y1.g = 5;
y2.g = 10;
// y1.g is 10, because y1.g and y2.g mean the exact same thing
個人的には、静的フィールドへのアクセスは、Y.g
オブジェクトインスタンス()に言及するのではなく、クラス()を使用して行う必要があると思いますy1.g
。これにより、オブジェクトインスタンスがない場合の存在がより明確になります。
メソッドの違いは、非静的メソッドがオブジェクトインスタンスに関連付けられていることです。オブジェクトインスタンスはthis
、メソッド内を使用してアクセスできます。で宣言されたメソッドを呼び出すと、void m()
呼び出されたオブジェクトの非静的(および静的)フィールドにアクセスできます(したがって、x1.m()
上記の例から、5を含むx2.m()
フィールドにアクセスできます。10を含むフィールドにアクセスできます。
ただし、静的メソッドは、(対応する?)オブジェクトがなくても呼び出すことができます。宣言がstatic void n()
クラス内にある場合は、またはY
を使用してこのメソッドを呼び出すことができます(上記のようにinstanceofの場合)。ここでも、私はそれを書き留める最初の方法を好みます。静的メソッドでは、オブジェクトインスタンス(非静的メソッドで名前が付けられている)への参照がないため、静的メソッド内から特定の非静的フィールドにアクセスすることはできません-単に特定のオブジェクトへの明確な関連付けがないためです。Y.n()
y1.n()
y1
Y
this
static
クラス定義について:これはかなり高度です。別のクラス内でクラスを宣言できます。内部クラスが静的でない場合、内部クラスのすべてのオブジェクトインスタンスには、外部クラスのインスタンスへの参照もあります(つまり、外部クラスのインスタンスがある場合にのみ、内部クラスのインスタンスを作成できます)。 )。これは必ずしもあなたが望むものではありません。内部クラスを宣言することにより、static
それは存在し、それ自体のファイルで定義されたクラスのように、多かれ少なかれ使用することができます。