Javaの静的クラス


947

static classJavaのようなものはありますか?

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

逆に、クラスにすべての静的メソッドが含まれている場合、クラスも静的である必要がありますか?

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



静的クラスは基本的にクラスをグループ化するために使用されます。
RockingDev 2018

回答:


847

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

  • クラスを宣言するfinal-静的クラスを拡張しても意味がないため、クラスの拡張を防止します
  • コンストラクターを作成private-静的クラスをインスタンス化しても意味がないため、クライアントコードによるインスタンス化を防止します
  • 作成し、すべてのクラスのメンバーと機能を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;
    }
}

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


35
メソッドFooのみのクラスstaticは同じではありませんstatic class Foo
craigb

12
@Evorlor:クラスがfinalと宣言されている場合、そのメソッドは自動的に(事実上)finalになります。これは、最終クラスをサブクラス化できないため、そのメソッドをオーバーライドできない(つまり、事実上最終的な)ためです。 docs.oracle.com/javase/tutorial/java/IandI/final.html
jwayne

30
この答えは、おそらくOPの意味に対処していますが、(現在のところ)Java静的クラスを説明していないため、質問にはまったく答えていません。これは、Javaで静的クラスが何を意味するかを理解しようとする人々にとって非常に悪いことです。
トム

12
@JBoy:Javaには「静的クラス」のようなものがあります。それが問題ですが、この答えはまったく説明しません。その代わりに、答えは「静的なクラス」と呼ぶものJavaでシミュレートする方法を説明します-しかし、これはない Javaで「静的クラスは」何ですか!(おそらく他の言語では「静的クラス」と呼ばれているかもしれませんが、Java静的クラスについて学ぶためにここに来る人々は混乱し混乱します。)
Tom

4
プライベートMyStaticClass(){//プライベートコンストラクターmyStaticMember = 1; コンストラクタは呼び出されないため、}はまったく効果がありません。しかし、これは重要ではありません。Javaの静的内部クラスの有用性とその有用性または付加価値について、私はまだ非常に混乱しています。
モルドベアン2017

316

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

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

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


12
Javaで静的ネストクラスがインスタンスメソッドを許可するのはなぜですか?そのようなクラスでのインスタンスメソッドの使用は何ですか?
オタク

19
@オタク:私の答えを読んだ?2番目の文を注意深く読んでください。静的クラスのインスタンスメソッドを持たたくないのはなぜですか?結局、それらのインスタンスを作成できます。
Jon Skeet 2013

17
@オタク:はい、それは完全に許容されています。静的クラスがユーティリティクラスであるという「理解」は、基本的に正しくありません。これは、Javaの静的クラスが意味することではありません。
Jon Skeet 2013

14
@オタク:はい。まさに私が私の回答で書いたように:「静的なネストされたクラスは、暗黙的に外部クラスのインスタンスへの参照を持たないクラスです。」
Jon Skeet 2013

6
@KhurramAli:暗黙的にですか?それらを宣言するときにキーワードを使用しないことを考えると、これらは明示的に静的ではありませんstatic。それらを作成するために他のものへの参照を必要としないという点で、それらは暗黙的に静的です。個人的には、静的/非静的の用語は、入れ子になったクラスでは少し奇妙だと思います...動作とは何かについて話す方が簡単だと思います。
Jon Skeet

157

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

これらのクラス[静的にネストされたクラス]は、それを含むクラスの静的メンバーにのみアクセスできます[それを含むクラスのインスタンスへの参照がないため...]

コードサンプル:

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(); 
  }
}

1
それで、それらをパブリックにする必要なしにインスタンス化するために内部静的クラスを使用できると言えるでしょうか?
モルドベアン2017

@moldovean 静的コンテキスト(mainなど)からインスタンス化するために、内部静的クラスを使用します。視認性とは関係ないと思います。
マイケルドー

2
@moldovean静的/非静的は、可視性と直交しています。静的または非静的のいずれかで、あらゆる種類の可視性を持つことができます。ポイントは、内側のクラスを作成するために、それを囲むクラスのインスタンスが必要ですか?
amit

103

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

例:

public class A
{

 public static class B
 {
 }
}

class Bは静的に宣言されているため、次のように明示的にインスタンス化できます。

B b = new B();

class Bスタンドアロンにするために静的に宣言されていない場合、インスタンスオブジェクトの呼び出しは次のようになります。

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

7
B b = new B();クラスA自体からインスタンス化しようとしている場合と同様に、非静的クラスを定期的にインスタンス化できることに注意してください。
Muhammed Refaat 2016年

33

内のメンバーが.. 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();
}

ただしstaticnon-static内部クラス内にメンバーを含めることはできません。


静的クラスをインスタンス化できますか、それとも意味がありますか?
Supun Wijerathne

6
他の言語とstaticは異なり、Javaでの意味は1つだけです。staticクラスに何かがある場合、そのクラスをインスタンス化せずにその物にアクセスできることを意味します。それは...インスタンスを作成するかどうかについては何も言っていない
ラメシュ-X

申し訳ありませんがstackoverflow!この場合は、ありがとうRamesh-Xと言わざるを得ません!静的内部クラスと内部クラスについて私が疑問に思ったほとんどすべてをカバーしました。
モルドベアン2017

「内部クラスを静的に設定」することはできません。これは言葉の矛盾です。ネストされたクラスは内部または静的です。
ローン侯爵

13

これが「静的クラスjava」のGoogleでの最高の結果であり、最良の答えがここにないので、追加すると思いました。私はOPの質問を、Javaの世界ではシングルトンとして知られているC#の静的クラスに関するものとして解釈しています。それらを知らない人のために、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() { ... }
}

このアプローチは、パブリックフィールドアプローチと機能的に同等ですが、より簡潔であり、シリアル化機構を無料で提供し、高度なシリアル化攻撃またはリフレクション攻撃に直面しても、複数のインスタンス化に対する強力な保証を提供します。このアプローチはまだ広く採用されていませんが、単一要素の列挙型がシングルトンを実装する最良の方法です。(強調著者)

ブロッホ、ジョシュア(2008-05-08)。効果的なJava(Javaシリーズ)(p。ピアソン教育。

実装と正当化はかなり自明だと思います。


6
シングルトンを実装する良い方法。残念ながら、問題はシングルトンではなく、静的クラスに関するものです
David SN

1
Javaは「静的」キーワードのかなりユニークな解釈を持っています。OPはC#から来ているようですが、「静的クラス」はJavaのシングルトンに相当します。この質問の解釈を明確にするために、回答を更新しました。
Bennet Huber

1
C#静的クラスはシングルトンではありません。シングルトンインスタンスはオブジェクトであり、依存関係の注入に参加したり、モックしたりできるインターフェースを実装できます。C#静的クラスは、インターフェイスを実装したり、何らかの方法で注入したりすることはできません。C関数の集まりに非常に近く、もちろん拡張メソッドを使用できます。
Novaterata

13

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

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

Javaでは、トップレベル(外部)クラスを静的にすることはできません。入れ子になったクラスだけが静的にできます。

静的ネストクラスと非静的ネストクラス

1)ネストされた静的クラスは外部クラスの参照を必要としませんが、静的でないネストされたクラスまたは内部クラスは外部クラスの参照を必要とします。

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

こちらをご覧くださいhttps : //docs.oracle.com/javase/tutorial/java/javaOO/nested.html


また、内部の「非静的」クラスは静的フィールドまたはメソッドを宣言できません
Mr.Cat


2

簡単に言うと、Javaは、内部クラスに対してのみ静的であるようにクラスの宣言をサポートしますが、トップレベルのクラスに対してはサポートしません。

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

内部クラス:最上位クラスの内部にあるクラスは内部クラスと呼ばれ、基本的にはネストされたクラスの概念です。内部クラスは静的にすることができます。内部クラスを静的にするアイデアは、最上位クラスのオブジェクトをインスタンス化せずに内部クラスのオブジェクトをインスタンス化するという利点を活用することです。これは、静的メソッドと変数がトップレベルのクラス内で機能するのとまったく同じ方法です。

したがって、Javaは(ネストされたクラスの)内部クラスレベルで静的クラスをサポートします。

また、Javaは最上位クラスの静的クラスをサポートしていません。

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



0

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


0

内部クラスでない限り、クラスでstaticキーワードを使用することはできません。静的内部クラスは、外部クラスの静的メンバーであるネストされたクラスです。他の静的メンバーを使用して、外部クラスをインスタンス化せずにアクセスできます。静的メンバーと同様に、静的ネストクラスは、外部クラスのインスタンス変数とメソッドにアクセスできません。

public class Outer {
   static class Nested_Demo {
      public void my_method() {
          System.out.println("This is my nested class");
      }
   }
public static void main(String args[]) {
      Outer.Nested_Demo nested = new Outer.Nested_Demo();
      nested.my_method();
   }
}

ネストされstaticたクラスでない限り、クラスでキーワードを使用することはできません。「静的インナー」は用語で矛盾しています
ローン侯爵

0

静的メソッドは、パブリックとは異なり、クラスのオブジェクトを作成せずにアクセスできることを意味します。

public class MyClass {
   // Static method
   static void myStaticMethod() {
      System.out.println("Static methods can be called without creating objects");
   }

  // Public method
  public void myPublicMethod() {
      System.out.println("Public methods must be called by creating objects");
   }

  // Main method
  public static void main(String[ ] args) {
      myStaticMethod(); // Call the static method
    // myPublicMethod(); This would output an error

    MyClass myObj = new MyClass(); // Create an object of MyClass
    myObj.myPublicMethod(); // Call the public method
  }
}

質問には答えません。
ローン侯爵

-1

すべての良い答えですが、静的ファクターメソッドに大量の静的内部クラスを使用するjava.util.Collectionsへの参照はありませんでした。だから同じを追加します。

複数の静的内部クラスを持つjava.util.Collectionsから例を追加します。内部クラスは、外部クラスを介してアクセスする必要があるコードをグループ化するのに役立ちます。

/**
 * @serial include
 */
static class UnmodifiableSet<E> extends UnmodifiableCollection<E>
                             implements Set<E>, Serializable {
    private static final long serialVersionUID = -9215047833775013803L;

    UnmodifiableSet(Set<? extends E> s)     {super(s);}
    public boolean equals(Object o) {return o == this || c.equals(o);}
    public int hashCode()           {return c.hashCode();}
}

これがjava.util.Collectionsクラスの静的因子メソッドです

public static <T> Set<T> unmodifiableSet(Set<? extends T> s) {
    return new UnmodifiableSet<>(s);
}


コメントがありませんでしたか?詳しく説明できますか?コメントを理解しようとしています。
Jay Rajput
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.