Javaのクラス変数とインスタンス変数の違いは何ですか?[閉まっている]


16

私はJavaが初めてなので、クラス変数とインスタンス変数の違いを理解したいと思っています。

例えば:

class Bicycle { 
    static int cadence = 0; 
    int speed = 0; 
    int gear = 1; 
}

インスタンス変数とクラス変数はどう違うのですか?ここでどの変数がクラス変数であり、どの変数がインスタンス変数ですか?これはスコープにどのように影響しますか?


1
これを説明するJava™チュートリアル:クラスメンバーの理解を読み始めたようですが、完全には理解していません。

回答:


35

どちらもメンバー変数です。つまり、両方がクラスに関連付けられています。もちろん、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


Java質問のC#の例はなぜですか?
バジルStarynkevitch

あなたは多くの助けになってhaventはので、私の考えはexactly.Iは、JavaのC#ではないプログラミングを知っている
Skylarアダムス

1
@BasileStarynkevitch私は主にC#開発者であり、原則は両方に当てはまり、同じように優れているため、C#の例をすぐに提供しました。:)私の例をJavaに変更しました。
アッバス

2
@SkylarAdams申し訳ありませんが、Javaを知っている人は誰でもC#を知っていると間違って思いました。サンプルをJavaに変更しました。
アッバス

9
質問のこの種のために、私は、JavaやC#を使用しているかどうか、それは無関係だと思う
トーマス・ジャンク

6

これは、説明され、ここで(例でBicycleクラス変数とクラスnumberOfBicyclesとインスタンス変数cadencespeedgearid):

すべてのオブジェクトに共通の変数が必要な場合があります。これは、static修飾子を使用して実現されます。static宣言に修飾子があるフィールドは、静的フィールドまたはクラス変数と呼ばれます。オブジェクトではなく、クラスに関連付けられています。クラスのすべてのインスタンスは、メモリ内の1つの固定位置にあるクラス変数を共有します。どのオブジェクトでもクラス変数の値を変更できますが、クラスのインスタンスを作成せずにクラス変数を操作することもできます。

クラス変数(宣言済みstatic)は、すべてのインスタンスに共通の場所です。

例でnumberOfBicyclesは、クラス変数です(宣言されているためstatic)。すべてのインスタンスとクラスに共通する変数(場所)は1つだけです。したがってnumberOfBicycles、1つのメソッドで変更すると、他のメソッドでは新しい値が表示されます(異なる値でもBicycleオブジェクトで)

対照的にgearidインスタンス変数です(それらの宣言にはstatic修飾子がないため)。すべてのBicycleオブジェクトには独自のオブジェクトがあります。gearいくつかのBicycle aを変更し、bが別のインスタンスである場合、変更a.gearは影響しませんb.gear

各Javaオブジェクトは、いくつかのメタデータ(クラスへの参照など)と独自のインスタンス変数(おそらくスーパークラスから継承される)を持つ個別のメモリゾーンです。ただし、クラス変数はクラスに共通であり、すべてのインスタンスで共有されます。

オブジェクト(コンピューターサイエンス)インスタンス変数の wiki ページも参照してください。


4

インスタンス変数:

  • インスタンス変数はクラスで宣言されますが、メソッド、コンストラクター、またはブロックの外部で宣言されます。
  • インスタンス変数はクラスのインスタンスに属しているか、インスタンス変数はオブジェクトに属していると言えます。
  • インスタンス変数には、クラスのすべてのインスタンスの個別の値があります。

    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

クラス変数とインスタンス変数の簡単な違い:

  • インスタンス変数には、クラスのインスタンスごとに個別の値があります。クラス変数は、そのクラスのインスタンスオブジェクトが存在しない場合でも、クラスのすべてのインスタンスに対して単一の共有値を維持します。
  • インスタンス変数をクラス変数に変更するには、staticキーワードを使用します。
  • インスタンス変数とクラス変数は両方とも、メソッド内ではなく、クラスレベルで宣言されます。

3

class variablesinstance変数の違いは、単にの質問です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
  }

numberOfPersonsstaticを区別するキーワードであると宣言されclass variablesていinstance variabesます。変数は、クラス定義内で他の変数と同様に宣言されます。しかし、staticキーワードは、それが異なることを示しています。

  • firstNamelastNameあるインスタンス変数は、その具体的なインスタンスにバインド

  • numberOfPersons すべてのインスタンスがこの変数にアクセスできるように、クラスにバインドされています。

tl; dr

変数が定義される場所はクラス定義です。

クラス変数は、クラスレベルで/クラスレベルにバインドされており、具体的な各インスタンスがそれにアクセスできます。クラス変数を定義するには、キーワードを使用しますstatic

インスタンス変数は、インスタンスレベルでのみ認識されます。それらを定義せずにstaticキーワード。

Javaの詳細なドキュメントはこちら

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.