私はJavaに慣れていないので、クラス変数とインスタンス変数の違いを理解したいと思っています。
例えば:
class Bicycle {
static int cadence = 0;
int speed = 0;
int gear = 1;
}
インスタンス変数とクラス変数はどのように違うのですか?ここでどの変数がクラス変数で、どれがインスタンス変数ですか?これはスコープにどのように影響しますか?
どちらもmember変数です。つまり、どちらもクラスに関連付けられています。もちろん、この2つには違いがあります。
インスタンス変数:
これらの変数はクラスのインスタンス、つまりオブジェクトに属しています。そして、そのクラス(オブジェクト)のすべてのインスタンスには、その変数の独自のコピーがあります。変数に加えられた変更は、そのクラスの他のインスタンスには反映されません。
public class Product {
public int Barcode;
}
クラス変数:
これらは静的メンバー変数とも呼ばれ、そのクラスのすべてのインスタンスで共有される変数のコピーは1つだけです。その変数に変更が加えられた場合、他のすべてのインスタンスは変更の効果を確認します。
public class Product {
public static int Barcode;
}
完全な例:
// INSTANCE VARIABLE
public class Main {
public static void main(String[] args) {
Product prod1 = new Product();
prod1.Barcode = 123456;
Product prod2 = new Product();
prod2.Barcode = 987654;
System.out.println(prod1.Barcode);
System.out.println(prod2.Barcode);
}
}
public class Product {
public int Barcode;
}
出力は次のようになります。
123456
987654
次に、インスタンス変数を静的にして、クラス変数に変更します。
//CLASS VARIABLE
public class Main {
public static void main(String[] args) {
Product prod1 = new Product();
prod1.setBarcode(123456);
Product prod2 = new Product();
prod2.setBarcode(987654);
System.out.println(prod1.getBarcode());
System.out.println(prod2.getBarcode());
}
}
public class Product {
public static int Barcode;
public int getBarcode() {
return Barcode;
}
public void setBarcode(int value){
Barcode = value;
}
}
非静的メソッドを使用してBarcode
の値を取得および設定し、クラスからではなくオブジェクトから呼び出すことができるようにしました。出力は次のようになります。
987654
987654
説明は here (クラス変数Bicycle
とインスタンス変数numberOfBicycles
、cadence
、speed
&gear
を含むid
クラスの例):
すべてのオブジェクトに共通の変数が必要になる場合があります。これは、
static
修飾子を使用して行います。宣言にstatic
修飾子を含むフィールドは、静的フィールドまたはクラス変数と呼ばれます。それらは、オブジェクトではなくクラスに関連付けられています。クラスのすべてのインスタンスは、メモリ内の1つの固定位置にあるクラス変数を共有します。どのオブジェクトでもクラス変数の値を変更できますが、クラスのインスタンスを作成せずにクラス変数を操作することもできます。
クラス変数(static
で宣言)は、すべてのインスタンスに共通の場所です。
この例では、numberOfBicycles
はクラス変数です(static
と宣言されているため)。すべてのインスタンスとクラスに共通するこのような変数(つまり、場所)は1つだけです。したがって、1つのメソッドでnumberOfBicycles
を変更すると、他のメソッドで新しい値が表示されます(異なるBicycle
オブジェクトの場合でも)
対照的に、gear
およびid
はinstance変数です(それらの宣言にはstatic
修飾子がないため)。すべてのBicycle
オブジェクトには独自のオブジェクトがあります。一部のgear
のBicycle
を変更する場合a、およびbが別の場合インスタンス、_a.gear
_を変更しても_b.gear
_には影響しません
各Javaオブジェクトは、いくつかのメタデータ(たとえば、そのクラスへの参照)と独自のインスタンス変数(おそらくスーパークラスから継承されたもの)を持つ別個のメモリゾーンです。ただし、クラス変数は、クラスであり、すべてのインスタンスで共有されます。
Object(computer science) & Instance variable wikipagesも参照してください。
インスタンス変数:
インスタンス変数には、クラスのインスタンスごとに個別の値があります。
Class InstanceDemo {
// this instance variable is visible for any child class.
public String name = "Testing";
// count variable is visible in Demo class only.
private int count = 2;
}
インスタンス変数にアクセスする方法:
InstanceDemo demo = new InstanceDemo (); System.out.println("Access Instance variable: " + demo.count + " , "+demo.name );
出力: 2、テスト
クラス変数:
また、最も重要なクラス変数は、クラスのインスタンスオブジェクトが存在しない場合でも、クラスのすべてのインスタンスに対して単一の共有値を維持します。
Class ClassDemo {
// count variable is Same for all instance of this class
public static int count = 2;
}
クラス変数にアクセスする方法:
System.out.println("Access Class variable: " + ClassDemo.count ); //class variable is directly refer with class name
出力:2
クラス変数とインスタンス変数の簡単な違い:
class variables
変数とinstance
変数の違いは、単にwho knows what?
の問題です。
instance variable
は、(=bound)だけがそのconcreteインスタンスに認識されているため、名前。
public class Person {
private String firstName;
private String lastName;
[...]
}
クラスの定義は、concreteオブジェクトを構築するためのblueprintのようなものです。おそらく、この点は少し混乱します。しかし、このように書くと、すべての変数がその具体的なオブジェクトにバインドされます。 すべての人は独自の名を持っています
一方、class variable
は-名前が示すように-クラスのすべてのメンバーに知られています。または技術的に:クラスレベルで既知/バインドされています。典型的な例は、作成したオブジェクトの数のカウンターです-これは非常に問題のある例ですが、しかし、それはこの初期段階では問題ではありません。
public class Person {
private String firstName;
private String lastName;
[...]
static int numberOfPersons = 0
}
numberOfPersons
はstatic
と宣言されています。これは、class variables
とinstance variabes
を区別するためのキーワードです。変数は、クラス定義内で他の変数と同様に宣言されています。しかし、static
キーワードは、それが異なることを示しています。
firstName
、lastName
はインスタンス変数であり、その具象インスタンスにバインドされています
numberOfPersons
はクラスにバインドされているため、すべてのインスタンスがこの変数にアクセスできます。
変数が定義されている場所はクラス定義です。
クラス変数は、クラスレベルで認識されているか、クラスレベルにバインドされています。つまり、各具象インスタンスはそれにアクセスできます。クラス変数を定義するには、キーワードstatic
を使用します。
インスタンス変数はインスタンスレベルでのみ認識されます。 static
キーワードなしで定義します。
Javaの詳細なドキュメントは here です