私はJavaの初心者で、クラス変数とインスタンス変数の違いを理解したいと思っています。
例えば、以下のようなものです。
class Bicycle {
static int cadence = 0;
int speed = 0;
int gear = 1;
}
インスタンス変数とクラス変数はどのように違うのですか?ここではどの変数がクラス変数で、どの変数がインスタンス変数なのでしょうか?これはスコープにどう影響しますか?
この2つはどちらもメンバー変数、つまりクラスに関連付けられています。もちろん、この2つには違いがあります。
**インスタンス変数:***。
これらの変数は、クラスのインスタンス、つまりオブジェクトに属します。そして、そのクラス(オブジェクト)のすべてのインスタンスは、その変数のコピーを持っています。その変数を変更しても、そのクラスの他のインスタンスには反映されません。
public class Product {
public int Barcode;
}
クラス変数:。
これらは、static member variablesとも呼ばれ、そのクラスのすべてのインスタンスで共有される変数のコピーは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
これはこちらで説明されています(クラス変数numberOfBicycles
とインスタンス変数cadence
, speed
, gear
& id
を持つBicycle
クラスを例にしています)。
時にはすべてのオブジェクトに共通する変数を持ちたいことがあります。これを実現するには、static
修飾子を使用します。宣言にstatic
修飾子が付いているフィールドは、staticフィールドまたはクラス変数と呼ばれます。これらはオブジェクトではなく、クラスに関連付けられています。クラスのすべてのインスタンスは、クラス変数を共有しており、その変数はメモリ内の1つの固定された場所にあります。どのオブジェクトでもクラス変数の値を変更することができますが、クラスのインスタンスを作成しなくてもクラス変数を操作することができます。
クラス変数(static
と宣言されている)は、すべてのインスタンスに共通する場所です。
例題では,numberOfBicycles
がクラス変数です(static
と宣言されているので).すべてのインスタンスとクラスに共通するこのような変数(つまり場所)は1つしかありません。そのため、あるメソッドで numberOfBicycles
を変更すると、他のメソッドにも新しい値が表示されます (異なる Bicycle
オブジェクトであっても)。
対照的に、 gear
や id
は インスタンス 変数です (その宣言には static
修飾子がないため)。すべての Bicycle
オブジェクトは独自のものを持っています。ある Bicycle
の a に対して gear
を修正し、b が別のインスタンスである場合、a.gear
を修正しても b.gear
には影響しません。
各Javaオブジェクトは、いくつかのメタデータ(クラスへの参照など)と独自のインスタンス変数(おそらくスーパークラスから継承されたもの)を持つ、個別のメモリゾーンです。しかし、クラス変数はそのクラスに共通で、すべてのインスタンスで共有されます。
インスタンス変数:。
インスタンス変数は、クラス内で宣言されますが、メソッドやコンストラクタ、ブロックの外で宣言されます。 コンストラクタやブロックの外側で宣言されます。
インスタンス変数は、クラスのインスタンスに属するものであり、また、インスタンス変数はオブジェクトに属するものとも言えます。 インスタンス変数は、クラスのインスタンスに属しているか、オブジェクトに属していると言えます。
インスタンス変数は、クラスのすべてのインスタンスごとに別々の値を持ちます。 クラスのインスタンスごとに別々の値を持ちます。
クラス InstanceDemo {
// このインスタンス変数は、どの子クラスでも見ることができます。
public String name = "Testing";
public String name = "Testing" // count変数は、Demoクラスでのみ表示されます。
private int count = 2;
}
**インスタンス変数にアクセスするためのメソッド:***.
InstanceDemo demo = new InstanceDemo ();
System.out.println("Access Instance variable: " + demo.count + " , "+demo.name ); と表示されます。 出力: 2 , テスト
クラス変数:
クラス変数は、クラスに属する変数です。
クラス変数は、変数の前に "static "キーワードを付けて作成します。 変数を作成します。
静的変数とも呼ばれます。
そして最も重要なことは、クラス変数は、クラスのすべてのインスタンスに対して クラスのインスタンスオブジェクトが存在しなくても、クラスのすべてのインスタンスに が存在します。
クラスDemo {。
// count変数は、このクラスの全てのインスタンスで同じです。
public static int count = 2;
}
クラス変数にアクセスするためのメソッド:。
System.out.println("Access Class variable: " + ClassDemo.count ); //クラス変数は、クラス名で直接参照されます。
Output:2
***クラス変数とインスタンス変数の簡単な違いを説明します。