私はJavaを学習中であり、オブジェクト変数とクラス変数の違いを理解していません。クラス変数になるためには、それを宣言する必要があることを知っています。最初に静的ステートメントを使用します。ありがとうございます。
Java(および一般的にOOP)の場合)では、オブジェクトには2種類のフィールド(変数)があります。
インスタンス変数(またはオブジェクト変数)は、オブジェクトの特定のインスタンスに属するフィールドです。
静的変数(またはクラス変数)は、同じクラスのすべてのインスタンスに共通です。
次に例を示します。
public class Foobar{
static int counter = 0 ; //static variable..all instances of Foobar will share the same counter and will change if such is done
public int id; //instance variable. Each instance has its own id
public Foobar(){
this.id = counter++;
}
}
使用法:
Foobar obj1 = new Foobar();
Foobar obj2 = new Foobar();
System.out.println("obj1 id : " + obj1.id + " obj2.id "+ obj2.id + " id count " + Foobar.counter);
静的変数またはクラス変数とインスタンス変数またはオブジェクト変数の違いはかなり単純です。作成するすべてのオブジェクトには、独自のインスタンス変数の独自のコピーがあります。クラスに静的変数があるかのように、その静的変数の1つのコピーのみがすべてのオブジェクトに存在します。例えば
public class JellyBean{
// instance variables every jellyBean object will have its own
// variable for color
String color;
// static variable only one copy of this variable exists for
// all jellyBean objects.
static int totalNumberOfJellyBeans;
}//end class
2つのジェリービーンオブジェクトを作成した場合、各ジェリービーンには独自のカラー変数があるため、カラーには2つの変数があります。また、両方のjellyBeanオブジェクトがこの1つのクラス変数を使用するため、totalNumberOfJellyBeansの1つの変数。
ToyotaYaris
という名前の車の設計図があるとします。この場合、maxSpeed
という変数があるとします。その青写真(そのインスタンス)で作成されたすべての車は同じ最大速度を持つため、変数は個々の車ではなく青写真に属する必要があります。 maxSpeed
が設計図で変更された場合、それが生産するすべての車で変更されます。
ただし、各車には、speed
という別の変数が必要になる場合があります。各車は互いに独立して異なる速度で運転できるため、この変数を設計図に含めることはできません。そのため、ToyotaYaris
の特定の各インスタンスに属する変数が必要です。
したがって:
class ToyotaYaris {
static int maxSpeed;
int speed;
}
オブジェクト変数はクラスの特定のインスタンスに依存する状態ですが、クラス変数はクラス自体からグローバルにアクセスできます。これは少しあいまいかもしれませんので、ここにいくつかの例を示します。
class Muffin {
private static final int calories = 9320;
public String flavor;
public Muffin( String flavor ){
this.flavor = flavor;
}
}
このクラスでは、calories
はクラス変数です。他のコードでは、Muffin.calories
を呼び出すことで、あらゆる種類のマフィンのカロリー数を取得できます。この場合、final
キーワードもカロリー数を一定にするために使用されます。
同じクラスに、オブジェクト変数flavor
があります。これはクラスのインスタンスに依存し、コンストラクターで設定されます。
Muffin myMuffin = new Muffin( "blueberry" );
したがって、myMuffin.flavor
を呼び出すことにより、この特定のマフィンのフレーバーにアクセスできます。 Muffin
にアクセスする前に、flavor
オブジェクトをインスタンス化する必要があることに注意してください。
上記の例は少しストレッチです。マフィンの種類によってカロリー数が異なるためです。これらは定数に役立ちますが、静的変数の値が変化する場合を次に示します。
class Muffin {
private static int next_id = 1;
public int id;
public String flavor;
public Muffin( String flavor ){
this.flavor = flavor;
id = next_id++;
}
}
2番目の例では、作成するすべてのマフィンに一意のID番号を設定する必要があるため、Muffin
がインスタンス化されるたびに増分される静的変数を使用できます。 static
キーワードは、コンストラクターへのすべての呼び出しを通じてnext_id
の値を維持するため、id
は異なり、新しいマフィンごとに増加し続けます。
オブジェクト変数またはインスタンスメンバーは、クラスの特定のインスタンスに属します。つまり、すべてのインスタンスがそのデータの独自のコピーを持っているということです。クラス変数または静的メンバーは、クラスのすべてのインスタンスで共有されます。つまり、クラスインスタンスがいくつあっても、そのデータのコピーは1つしかないということです。