私はJavaが初めてなので、クラス変数とインスタンス変数の違いを理解したいと思っています。
例えば:
class Bicycle {
static int cadence = 0;
int speed = 0;
int gear = 1;
}
インスタンス変数とクラス変数はどう違うのですか?ここでどの変数がクラス変数であり、どの変数がインスタンス変数ですか?これはスコープにどのように影響しますか?
私はJavaが初めてなので、クラス変数とインスタンス変数の違いを理解したいと思っています。
例えば:
class Bicycle {
static int cadence = 0;
int speed = 0;
int gear = 1;
}
インスタンス変数とクラス変数はどう違うのですか?ここでどの変数がクラス変数であり、どの変数がインスタンス変数ですか?これはスコープにどのように影響しますか?
回答:
どちらもメンバー変数です。つまり、両方がクラスに関連付けられています。もちろん、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
これは、説明され、ここで(例でBicycle
クラス変数とクラスnumberOfBicycles
とインスタンス変数cadence
、speed
、gear
&id
):
すべてのオブジェクトに共通の変数が必要な場合があります。これは、
static
修飾子を使用して実現されます。static
宣言に修飾子があるフィールドは、静的フィールドまたはクラス変数と呼ばれます。オブジェクトではなく、クラスに関連付けられています。クラスのすべてのインスタンスは、メモリ内の1つの固定位置にあるクラス変数を共有します。どのオブジェクトでもクラス変数の値を変更できますが、クラスのインスタンスを作成せずにクラス変数を操作することもできます。
クラス変数(宣言済みstatic
)は、すべてのインスタンスに共通の場所です。
例でnumberOfBicycles
は、クラス変数です(宣言されているためstatic
)。すべてのインスタンスとクラスに共通する変数(場所)は1つだけです。したがってnumberOfBicycles
、1つのメソッドで変更すると、他のメソッドでは新しい値が表示されます(異なる値でもBicycle
オブジェクトで)
対照的にgear
&id
はインスタンス変数です(それらの宣言にはstatic
修飾子がないため)。すべてのBicycle
オブジェクトには独自のオブジェクトがあります。gear
いくつかのBicycle
aを変更し、bが別のインスタンスである場合、変更a.gear
は影響しませんb.gear
各Javaオブジェクトは、いくつかのメタデータ(クラスへの参照など)と独自のインスタンス変数(おそらくスーパークラスから継承される)を持つ個別のメモリゾーンです。ただし、クラス変数はクラスに共通であり、すべてのインスタンスで共有されます。
オブジェクト(コンピューターサイエンス)とインスタンス変数の wiki ページも参照してください。
インスタンス変数:
インスタンス変数には、クラスのすべてのインスタンスの個別の値があります。
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?
。
An instance variable
はその具体的なインスタンスにのみ知られている(= bound)-それゆえ名前。
public class Person {
private String firstName;
private String lastName;
[...]
}
クラスの定義は、具体的なオブジェクトを構築するための青写真のようなものです。おそらく、この点で少し混乱するでしょう。しかし、このように書くと、すべての変数はその具体的なオブジェクトにバインドされます。たとえば、すべての人が独自のfirstNameを持っています
class variable
一方、A は、名前が示すように、クラスのすべてのメンバーに知られています。または技術的に:クラスレベルで既知/バインドされています。典型的な例は、作成したオブジェクトの数のカウンターです-これは非常に問題の多い例です。しかし、それはこの初期段階では重要ではありません。
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の詳細なドキュメントはこちら