web-dev-qa-db-ja.com

Javaでの静的クラス

Javaにstatic classのようなものはありますか?

そのようなクラスの意味は何ですか。静的クラスのすべてのメソッドもstaticである必要がありますか?

クラスにすべての静的メソッドが含まれている場合、そのクラスも静的にする必要があるというのは、逆のことです。

静的クラスは何に適していますか?

863
Kraken

Javaには静的な{ネストクラスがありますが、最上位の静的クラスを探しているようです。 Javaにはトップレベルクラスを静的にする方法はありませんが、次のように静的クラスをシミュレートすることができます。

  • クラスを宣言するfinal - 静的クラスを拡張しても意味がないため、クラスの拡張を防ぎます
  • コンストラクタをprivateにする - 静的クラスをインスタンス化するのは意味がないので、クライアントコードによるインスタンス化を防止する
  • all クラスのメンバーと関数を作るstatic - クラスはインスタンス化できないのでインスタンスメソッドを呼び出せないし、インスタンスフィールドにアクセスできません
  • コンパイラは、インスタンス(非静的)メンバの宣言を妨げません。インスタンスメンバーを呼び出そうとした場合にのみ問題が発生します

上からの提案ごとの簡単な例:

public class TestMyStaticClass {
     public static void main(String []args){
        MyStaticClass.setMyStaticMember(5);
        System.out.println("Static value: " + MyStaticClass.getMyStaticMember());
        System.out.println("Value squared: " + MyStaticClass.squareMyStaticMember());
        // MyStaticClass x = new MyStaticClass(); // results in compile time error
     }
}

// A top-level Java class mimicking static class behavior
public final class MyStaticClass {
    private MyStaticClass () { // private constructor
        myStaticMember = 1;
    }
    private static int myStaticMember;
    public static void setMyStaticMember(int val) {
        myStaticMember = val;
    }
    public static int getMyStaticMember() {
        return myStaticMember;
    }
    public static int squareMyStaticMember() {
        return myStaticMember * myStaticMember;
    }
}

静的クラスは何がいいの? 静的クラスの良い使い方は、インスタンス化が意味を成さないような、一回限りのユーティリティクラスやライブラリクラスを定義することです。その好例は、PIやEなどの数学定数を含み、単に数学計算を提供するMathクラスです。そのような場合にインスタンス化を要求することは不要で混乱を招くでしょう。 Math クラスおよび ソースコード を参照してください。これはfinalであり、そのすべてのメンバーはstaticです。 Javaが最上位クラスの宣言をstaticにすることを許可した場合、Mathクラスは確かに静的になります。

790
Paul Sasik

Javaには「静的ネストクラス」がありますが、C#の静的クラスとまったく同じではありません。静的な入れ子クラスは、暗黙的に外部クラスのインスタンスへの参照を持たないクラスです。

静的ネストクラスは、インスタンスメソッドと静的メソッドを持つことができます。

Javaにはトップレベルの静的クラスというものはありません。

296
Jon Skeet

静的 ネストクラス があります。この[静的ネスト]クラスは、それ自体をインスタンス化するために、それを囲むクラスのインスタンスを必要としません。

これらのクラス[静的にネストされたもの]は、それを囲むクラスの静的メンバーにのみアクセスできます。

コードサンプル:

public class Test { 
  class A { } 
  static class B { }
  public static void main(String[] args) { 
    /*will fail - compilation error, you need an instance of Test to instantiate A*/
    A a = new A(); 
    /*will compile successfully, not instance of Test is needed to instantiate B */
    B b = new B(); 
  }
}
143
amit

はい、Javaには静的な入れ子クラスがあります。ネストしたクラスを静的に宣言すると、自動的にそれが属する外部クラスをインスタンス化しなくてもインスタンス化できるスタンドアロンクラスになります。

例:

public class A
{

 public static class B
 {
 }
}

class Bはstaticとして宣言されているので、明示的にインスタンス化することができます:

B b = new B();

class Bが独立型にするためにstaticとして宣言されていない場合、インスタンスオブジェクト呼び出しは次のようになります。

A a= new A();
B b = a.new B();
92
Bitmap

class内のメンバーがstatic ..として宣言されたときに何が起こりますか?そのメンバーはclassをインスタンス化しなくてもアクセスできます。したがって、外部クラス(最上位クラス)をstaticにすることは意味がありません。したがって許可されていません。

しかし、内部クラスを静的クラスとして設定することができます(それはトップレベルクラスのメンバーなので)。それからそのクラスはトップレベルクラスをインスタンス化することなくアクセスすることができます。次の例を考えてください。

public class A {
    public static class B {

    }
}

これで、別のクラスC内で、クラスBのインスタンスを作成せずにクラスAにアクセスできるようになりました。

public class C {
    A.B ab = new A.B();
}

staticクラスはnon-staticメンバーも持つことができます。クラスだけが静的になります。

しかし、staticキーワードがクラスBから削除された場合、Aのインスタンスを作成せずに直接アクセスすることはできません。

public class C {
    A a = new A();
    A.B ab = a. new B();
}

しかしnon-static内部クラスの中にstaticメンバーを持つことはできません。

31
Ramesh-X

Javaではクラスを静的にできますか?

答えは _ yes _ です。Javaでは静的クラスにすることができます。 Javaでは、静的インスタンス変数および静的メソッド、さらには{静的ブロックがあります。クラスはJavaでも静的にすることができます。

Javaでは、最上位(外部)クラスを静的にすることはできません。 ネストしたクラスだけが静的になることができます。

静的な入れ子クラスと非静的な入れ子クラス

1)ネストした静的クラスはOuterクラスの参照を必要としませんが、Non-staticネストクラスまたはInnerクラスはOuterクラスの参照を必要とします。

2)内部クラス(または非静的ネストクラス)は、外部クラスの静的メンバーと非静的メンバーの両方にアクセスできます。静的クラスは、Outerクラスの非静的メンバーにはアクセスできません。外部クラスの静的メンバーにのみアクセスできます。

https://docs.Oracle.com/javase/tutorial/Java/javaOO/nested.html

12
roottraveller

これがGoogleでの "静的クラスJava"のトップ結果であることを見れば、最良の答えはここにはありません私はそれを追加したいと思いました。私はOPの質問をC#の静的クラスに関するものとして解釈しています。これはJavaの世界ではシングルトンとして知られています。知らない人のために、C#では "static"キーワードをクラス宣言に適用することができます。これは結果として得られるクラスが決してインスタンス化されないことを意味します。

Joshua Blochによる「Effective Java - Second Edition」からの抜粋(利用可能な最良のJavaスタイルガイドの1つであると広く考えられている):

リリース1.5以降、シングルトンを実装するための3番目のアプローチがあります。 1つの要素を持つ列挙型を作るだけです:

// Enum singleton - the preferred approach
public enum Elvis {
    INSTANCE;
    public void leaveTheBuilding() { ... }
}

このアプローチは、より簡潔で、シリアル化の仕組みを無料で提供し、洗練されたシリアル化やリフレクション攻撃に直面したとしても、多重インスタンス化に対する確固たる保証を提供することを除けば、パブリックフィールドアプローチと機能的に同等です。このアプローチはまだ広く採用されていませんが、 single-element enum型がシングルトンを実装するための最良の方法です。 (著者の強調)

Bloch、Joshua(2008-05-08)。有効なJava(Javaシリーズ)(p。18)ピアソン教育

実装と正当化はかなり自明です。

12
Bennet Huber

外部クラスは静的にはできませんが、ネストしたクラスや内部クラスは静的にできません。これは基本的に、外部クラスのインスタンスを作成せずにネストした/内部クラスを使用するのに役立ちます。

9
Saket

簡単に言えば、Javaは、クラスの宣言が内部クラスに対してのみ静的であり、最上位クラスに対しては静的であることをサポートします。

トップレベルクラス: Javaプロジェクトには、各Javaソースファイルに複数のトップレベルクラスを含めることができます。クラスの1つはファイル名の後に名前が付けられます。最上位クラスの前には、3つのオプションまたはキーワードだけが許可されています。 public、abstract、およびfinal です。

内部クラス: 最上位クラスの内部にあるクラスは内部クラスと呼ばれます。これは基本的に入れ子クラスの概念です。 内部クラスは静的にすることができます 。内部クラスを静的にするという考えは、最上位クラスのオブジェクトをインスタンス化することなく、内部クラスのオブジェクトをインスタンス化するという利点を利用することです。これは、静的メソッドと変数が最上位クラス内で機能するのとまったく同じです。

したがって、Javaは内部クラスレベルで静的クラスをサポートする(入れ子になったクラス内)

そしてJavaはトップレベルクラスで静的クラスをサポートしていません。

私はこれがJavaの静的クラスの基本的な理解のための質問に対するより簡単な解決策を与えることを願っています。

1
saichand

Javaにはクラスに関連付けられた静的メソッドがあります(たとえば、Java.lang.Mathには静的メソッドしかありません)が、クラス自体は静的ではありません。

1
duffymo