web-dev-qa-db-ja.com

Javaのオブジェクト変数とクラス変数

私はJavaを学習中であり、オブジェクト変数とクラス変数の違いを理解していません。クラス変数になるためには、それを宣言する必要があることを知っています。最初に静的ステートメントを使用します。ありがとうございます。

12
foobar5512

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);
15
Heisenbug

静的変数またはクラス変数とインスタンス変数またはオブジェクト変数の違いはかなり単純です。作成するすべてのオブジェクトには、独自のインスタンス変数の独自のコピーがあります。クラスに静的変数があるかのように、その静的変数の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つの変数。

3
gluestick

ToyotaYarisという名前の車の設計図があるとします。この場合、maxSpeedという変数があるとします。その青写真(そのインスタンス)で作成されたすべての車は同じ最大速度を持つため、変数は個々の車ではなく青写真に属する必要があります。 maxSpeedが設計図で変更された場合、それが生産するすべての車で変更されます。

ただし、各車には、speedという別の変数が必要になる場合があります。各車は互いに独立して異なる速度で運転できるため、この変数を設計図に含めることはできません。そのため、ToyotaYarisの特定の各インスタンスに属する変数が必要です。

したがって:

class ToyotaYaris {
    static int maxSpeed;
    int speed;
}
2
Smig

オブジェクト変数はクラスの特定のインスタンスに依存する状態ですが、クラス変数はクラス自体からグローバルにアクセスできます。これは少しあいまいかもしれませんので、ここにいくつかの例を示します。

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は異なり、新しいマフィンごとに増加し続けます。

2
derekerdmann

オブジェクト変数またはインスタンスメンバーは、クラスの特定のインスタンスに属します。つまり、すべてのインスタンスがそのデータの独自のコピーを持っているということです。クラス変数または静的メンバーは、クラスのすべてのインスタンスで共有されます。つまり、クラスインスタンスがいくつあっても、そのデータのコピーは1つしかないということです。

0
bobbymcr