Javaでのプライベート静的変数の使用は何ですか?


156

変数がとして宣言されている場合、public static varName;どこからでもとしてアクセスできますClassName.varName。また、静的メンバーはクラスのすべてのインスタンスによって共有され、各インスタンスに再割り当てされないことも認識しています。

変数の宣言は、変数の宣言とはprivate static varName;異なりますprivate varName;か?

どちらの場合も、他のクラスから、ClassName.varNameまたはClassInstance.varName他のクラスからアクセスすることはできません。

変数を静的として宣言すると、他の特別なプロパティが得られますか?


5
Java変数名にダッシュ(-)を含めることはできません。
Martijn Courteaux、2009

回答:


127

もちろん、としてアクセスできますがClassName.var_name、それが定義されているクラスの内部からのみアクセスできますprivate。これは、として定義されているためです。

public staticまたはprivate static変数は定数によく使用されます。たとえば、多くの人はコードに定数を "ハードコード"することを好みません。彼らは意味のある名前でpublic staticまたはprivate static変数を作成し、それをコードで使用することを好みます。これにより、コードが読みやすくなります。(そのような定数も作成する必要がありますfinal)。

例えば:

public class Example {
    private final static String JDBC_URL = "jdbc:mysql://localhost/shopdb";
    private final static String JDBC_USERNAME = "username";
    private final static String JDBC_PASSWORD = "password";

    public static void main(String[] args) {
        Connection conn = DriverManager.getConnection(JDBC_URL,
                                         JDBC_USERNAME, JDBC_PASSWORD);

        // ...
    }
}

あなたはそれを作るかどうかpublic、またはprivateあなたは変数がクラスまたは見えない外になりたいかどうかによって異なります。


6
としてアクセスするには何が必要ClassName.var_namですか?直接アクセスできる場所:var_namクラス内
Vaibhav Jani

12
クラス名を介してアクセスする必要はありませんが、非静的変数と区別するために、それを良いスタイルだと考える人もいます。
Jesper、2011

5
静的変数を使用してそれにアクセスするために必要なものは、「private final String JDBC_PASSWORD = "password";」と書くことができます。このパスワード文字列に静的変数を使用する代わりに。
chaitanya 2014年

48
@chaitanya定数です。非静的にすることで、クラスの各インスタンスの変数のコピーが必要なのはなぜですか?
Jesper、2014年

16
staticはクラスレベルの変数です。これは一般的であり、そのクラスのすべてのインスタンスに対して1つのコピーのみが存在します。ルールは、プライベートでもパブリックでも適用されます。privateは、外部の世界が変数の値を破壊したくない(最終的な静的でない場合)とだけ言っています。staticがfinalの場合、値を変更することはできないため、それをpublicにしても害はありません。
user1923551 2015

94

静的変数は、クラスのすべてのインスタンスに対して単一の値を持っています。

次のようなものを作成する場合:

public class Person
{
    private static int numberOfEyes;
    private String name;
}

それからあなたはあなたの名前を変えたかった、それは結構です、私の名前は同じままです。ただし、17の目を持つように変更したい場合は、世界中の誰もが17の目を持つことになります。


3
クラスの外部からアクセスできないため、プライベート変数のアクセサメソッドも作成しない限り、これはプライベート静的変数には適用されません。
ガネーシュクリシュナン2014

2
真ではない@GaneshKrishnan、クラスのインスタンスは両方の変数にアクセスできます。当然、クラスの作成者がばかげたことをしないと期待できます。また、リフレクションとJNIでは、すべてのベットがオフになっています。
TofuBeer 14

46

プライベート静的変数は、プライベートインスタンス変数が役立つのと同じように役立ちます。それらは、同じクラス内のコードによってのみアクセスされる状態を格納します。変数のアクセス可能性(private / public / etc)およびインスタンス/静的な性質は、完全に直交する概念です。

静的変数がクラスの「すべてのインスタンス」間で共有されると考えることは避けます。これは、状態が存在するには少なくとも1つのインスタンスが必要であることを示唆しています。いいえ-静的変数は型自体の代わりに関連付けられている任意のタイプのインスタンス。

したがって、特定のインスタンスではなくタイプに関連付けられた状態が必要で、その状態をプライベートにしたい場合(たとえば、プロパティを介してアクセスを制御できるようにする場合)は、プライベート静的変数を使用するのが理にかなっています。

余談ですが、公開する(または非公開でない)変数の型は定数(不変型の静的最終変数)のみにすることを強くお勧めします。それ以外のものは、APIと実装を分離するために(特に)非公開にする必要があります。


1つのクラスでのプライベートスタティックアクセスとプライベートではないプライベート変数アクセスの違いについてもう少し説明できますか?
Dharmendra、2011

1
@Dharmendra:あなたが何を言っているのか私には分かりません。プライベートな部分は無関係です-静的変数とインスタンス変数の違いについて正確に何を混乱させていますか?
Jon Skeet、2011

それらが宣言されている単一のクラス内で静的変数と非静的変数を使用するときのアクセシビリティの違いは何ですか?
Dharmendra、2011

2
@YogGuru:質問の関連性がわかりません。プライベートにする場合はプライベートにし、静的にする場合はスタティックにします。それらは直交しています。
Jon Skeet 2013

1
@ryvantage:いいえ、まったくありません。静的メソッドは問題なくアクセスできます。
Jon Skeet

11

そうですね、クラスのインスタンスを作成せずにパブリック静的変数を使用していますが、プライベート静的変数は使用していません。それらと私がプライベート静的変数を使用する場所の主な違いは、静的関数で変数を使用する必要がある場合です。静的関数の場合は、静的変数しか使用できないため、他のクラスからアクセスできないように、それらをプライベートにします。それが私がプライベートスタティックを使用する唯一のケースです。

次に例を示します。

Class test {
   public static String name = "AA";
   private static String age;

   public static void setAge(String yourAge) {
       //here if the age variable is not static you will get an error that you cannot access non static variables from static procedures so you have to make it static and private to not be accessed from other classes
       age = yourAge;
   }
}

3
私はこの答えが一番好きだと思います。+1。プライベート変数でstaticを使用する意味があるのは、静的メソッドがそれにアクセスする場合だけです。
ムクス2014

クラスに適切な名前を付けないと、これが有効なユースケースであるかどうかを実際に言うことはできません。同様に、クラスが呼び出された場合、Person年齢の異なる複数の人がいることができないので、それはおそらくバグでしょう(それが意図されたユースケースである場合)。
DanMan、2015年

@Mukusに同意します。これがこの質問に対する唯一の本当の答えかもしれません。OPは静的を既に理解していると思いますが、人々はそれをもう一度説明したいと思うようです。彼は特定のシナリオについて尋ねています。静的メソッドの変数にアクセスする機能は、「プライベート静的」が追加する機能です。また、ネストされた静的CLASSESが変数にアクセスできるようにすることも追加したいだけです。
Pinkerton 2017

1
メモリはどうですか?staticでは、すべてのインスタンスのコピーではなく、クラスのコピーを1つだけ作成します。そして、明らかに定数があれば、クラスに必要なコピーは1つだけです。これはメモリを節約しますか?
Pinkerton 2017年

1
調べた。私の前の質問に対する答えは次のとおりです。はい、それはメモリを節約します
Pinkerton

8

まあ、private static変数は、そのクラスのインスタンス間でデータを共有するために使用することができます。またはのprivate staticような構成要素を使用して変数にアクセスすることはできませんが、メンバーはそのクラスのメソッドまたはそのクラスのインスタンスから常に表示されます。したがって、実際には、そのクラスのインスタンスは常にメンバーを参照できます。ClassName.memberClassInstance.member


6

プライベート静的クラス変数の使用は何ですか?

あなたが図書館の本のクラスを持っているとしましょう。新しいブックを作成するたびに、固有のIDを割り当てる必要があります。1つの方法は、単に0から開始してID番号をインクリメントすることです。しかし、他のすべての本は、最後に作成されたID番号をどのようにして知るのでしょうか。単純に、それを静的変数として保存します。常連客は、実際の内部ID番号が各本に対するものであることを知っている必要がありますか?いいえ。その情報は非公開です。

public class Book {
    private static int numBooks = 0;
    private int id;
    public String name;

    Book(String name) {
        id = numBooks++;
        this.name = name;
    }
}

これは人為的な例ですが、すべてのクラスインスタンスが他の誰からも非公開にしておくべき共通の情報にアクセスできるようにしたい場合は簡単に思いつくと思います。あるいは、できなくても、物事をできる限りプライベートにすることは、プログラミングの実践に適しています。Bookユーザーが何もしないことになっているにもかかわらず、誤ってそのnumBooksフィールドをパブリックにしたとしたらどうでしょう。そうすれば、誰かが新しい本を作成せずに本の数を変更できます。

とても卑劣です!


6

変数の宣言は、変数の宣言とはprivate static varName;異なりますprivate varName;か?

はい、どちらも異なります。そして、最初のものはそのclass variableための単一の値を保持するためにclass呼び出され、もう1つはinstance variable異なるために異なる値を保持できるために呼び出されますinstances(Objects)。最初のインスタンスはjvmで1回だけ作成され、他のインスタンスはインスタンスごとに1回作成されます。つまり、10個のインスタンスがある場合private varName;、jvmには10個の異なるインスタンスがあります。

変数を宣言しstaticて他の特別なプロパティを与えますか?

はい、静的変数は通常のインスタンス変数とは異なるいくつかのプロパティを取得します。私はすでにいくつか言及しましたが、ここでいくつか見てみましょう:(class variables静的として宣言されているインスタンス変数)はのようなクラス名を使用して直接アクセスできますClassName.varName。そして、そのクラスのオブジェクトは、インスタンス変数がそれぞれのオブジェクトによってのみアクセスされるのとは異なり、その値にアクセスして変更できます。クラス変数は静的メソッドで使用できます。

private static variableJavaでのの使用は何ですか?

論理的にprivate static variableは、違いはありませんpublic static variable、最初のものなく、より細かく制御できます。IMO、あなたは文字通り置き換えることができるpublic static variableことでprivate static variableの助けを借りて、public staticgetterメソッドとsetterメソッド。

の広く使用されている領域の1つprivate static variableSingleton、全世界でそのクラスのインスタンスが1つだけ存在する単純なパターンの実装です。ここで、static識別子は、その単一のインスタンスに外部からアクセスできるようにするために重要な役割を果たします(もちろん、パブリックな静的ゲッターメソッドも主な役割を果たします)。

public class Singleton {
    private static Singleton singletonInstance = new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){
        return Singleton.singletonInstance;
    }
}

4

プライベートキーワードは、クラス内の変数アクセスに使用し、静的メソッドで変数にアクセスできるという意味で静的に保ちますが、参照変数は静的メソッドでアクセスできません。


3

別の見方:

  1. クラスとそのインスタンスは、実行時に2つの異なるものです。クラス情報は、そのクラスのすべてのインスタンスによって「共有」されます。
  2. 非静的クラス変数はインスタンスに属し、静的変数はクラスに属します。
  3. インスタンス変数をプライベートまたはパブリックにすることができるのと同じように、静的変数もプライベートまたはパブリックにすることができます。

1

静的メソッドで変数を使用する場合、変数も例として静的でなければなりません。

private static int a=0;  
public static void testMethod() {  
        a=1;  
}

3
もちろん、メソッドにクラスのインスタンスへの参照が与えられていない限り。
Jon Skeet、2011

1

静的変数は、クラスのすべてのインスタンスに共通の変数です。1つのインスタンスがそれを変更すると、静的変数の値が他のすべてのインスタンスに対して更新されます。


1

一部の人にとっては、2つの異なる言語で見た方が理にかなっているので、JavaおよびPHPで例を書いて、これらの修飾子のいくつかを説明しています。これについて誤って考えている可能性があります。

以下で意味がわからない場合は、私の例をご覧ください。ここに移動http://www.siteconsortium.com/h/D0000D.php

肝心なのは、それが言っていることとまったく同じだということです。これは、プライベートな静的メンバー変数です。たとえば、Singletonオブジェクトを作成する必要がある場合、なぜ、SingletonExample.instance変数をパブリックにする必要があるのでしょうか。クラスを使用していた人がそうした場合、値を簡単に上書きできます。

それだけです。

    パブリッククラスSingletonExample {
      プライベート静的SingletonExampleインスタンス= null;
      プライベート静的整数値= 0;
      プライベートSingletonExample(){
        ++ this.value;
      }
      public static SingletonExample getInstance(){
        if(instance!= null)
        インスタンスを返す。
        synchronized(SingletonExample.class){
        instance = new SingletonExample();
        インスタンスを返す。
        }
      }
      public void printValue(){
        System.out.print(this.value);
      }

      public static void main(String [] args){
        SingletonExampleインスタンス= getInstance();
        instance.printValue();
        インスタンス= getInstance();
        instance.printValue();
         }
    }


1

クラスでプライベート静的変数を使用する場合、クラスの静的内部クラスが変数に到達できます。これは、コンテキストセキュリティに最適です。


0

変数がpublic staticとして定義されている場合、任意のクラスからそのクラス名を介してアクセスできます。

通常、関数はpublic staticとして定義され、実装クラス名を呼び出すだけでアクセスできます。

その良い例がsleep()Threadクラスのメソッドです

Thread.sleep(2500);

変数がプライベートstaticとして定義されている場合、そのクラス内でのみアクセスできるため、クラス名は必要ありません。または、クラス名を(自分で)使用できます。プライベートvar_nameとプライベートスタティックvar_nameの違いは、プライベートスタティック変数にはクラスのスタティックメソッドのみがアクセスできるのに対し、プライベート変数はそのクラスの任意のメソッド(スタティックメソッドを除く)からアクセスできることです。

これの非常に良い例は、変数をプライベートstaticとして宣言する必要があるデータベース接続または定数を定義しているときです。

別の一般的な例は

private static int numberOfCars=10;

public static int returnNumber(){

return numberOfCars;

}

0

Javaは初めてですが、静的変数を使用する1つの方法は、多くの人がそうであると想定しているように、クラスのインスタンスの数をカウントすることです。例えば:

public Class Company {
    private static int numCompanies;

    public static int getNumCompanies(){
        return numCompanies;
    }
}

次に、sysoutを実行できます。

Company.getNumCompanies();

クラスの各インスタンスからnumCompaniesにアクセスすることもできます(完全には理解していません)が、「静的な方法」ではありません。これがベストプラクティスであるかどうかはわかりませんが、私には理にかなっています。


0

*)変数がプライベートとして宣言されている場合、クラスの外からは見えません。これはデータ非表示として呼び出されます。

*)変数が静的として宣言されている場合、変数の値はすべてのインスタンスで同じであり、その変数を呼び出すオブジェクトを作成する必要はありません。単純にその変数を呼び出すことができます。

classname.variablename;


0

プライベート静的変数もサブクラスで共有されます。1つのサブクラスで変更した場合、他のサブクラスは変更された値を取得しますが、その場合、期待どおりにならない可能性があります。

public class PrivateStatic {

private static int var = 10;
public void setVar(int newVal) {
    var = newVal;
}

public int getVar() {
    return var;
}

public static void main(String... args) {
    PrivateStatic p1 = new Sub1();
    System.out.println(PrivateStatic.var);
    p1.setVar(200);

    PrivateStatic p2 = new Sub2();
    System.out.println(p2.getVar());
}
}


class Sub1 extends PrivateStatic {

}

class Sub2 extends PrivateStatic {
}

0

ThreadLocal変数は通常、として実装されprivate staticます。このように、それらはクラスにバインドされておらず、各スレッドは独自の「ThreadLocal」オブジェクトへの独自の参照を持っています。


3
この答えがわかりません。どういう意味ですか?
H.Rabiee 2017

-1

次の例でeyeは、はleg同じままでPersonBによって変更されます。これは、プライベート変数がそれ自体をメソッドにコピーするため、元の値は同じままになるためです。プライベート静的値には、共有するすべてのメソッドのコピーが1つしかないため、その値を編集すると元の値が変更されます。

public class test {
private static int eye=2;
private int leg=3;

public test (int eyes, int legs){
    eye = eyes;
    leg=leg;
}

public test (){
}

public void print(){
    System.out.println(eye);
    System.out.println(leg);
}

public static void main(String[] args){
    test PersonA = new test();      
    test PersonB = new test(14,8);
    PersonA.print();    
}

}

> 14 3

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