1073

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

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

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

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

4

14 に答える 14

951

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 クラスは実際に静的になります。

于 2011-09-20T13:39:44.330 に答える
340

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

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

Java には最上位の静的クラスなどというものはありません。

于 2011-09-20T13:35:24.127 に答える
179

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

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

コードサンプル:

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(); 
  }
}
于 2011-09-20T13:35:24.610 に答える
123

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

例:

public class A
{

 public static class B
 {
 }
}

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

B b = new B();

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

A a= new A();
B b = a.new B();
于 2011-09-20T13:39:38.273 に答える
37

a 内のメンバーが..classとして宣言されるとどうなりますか? staticそのメンバーには、 をインスタンス化せずにアクセスできますclass。したがって、外部クラス(トップレベルクラス)を作成しstaticても意味がありません。したがって、許可されていません。

ただし、内部クラスを静的として設定できます (最上位クラスのメンバーであるため)。その後、最上位クラスをインスタンス化せずにそのクラスにアクセスできます。次の例を考えてみましょう。

public class A {
    public static class B {

    }
}

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

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

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

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

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

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

于 2015-12-18T06:05:18.153 に答える
23

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

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

Java では、トップレベル (外部) クラスを静的にすることはできません。ネストされたクラスのみを静的にできます。

静的なネストされたクラスと非静的なネストされたクラス

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

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

ここを参照してください: https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

于 2016-10-10T09:19:45.050 に答える
7

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

于 2011-09-20T13:36:26.403 に答える
5

簡単に言えば、Java はクラスの static 宣言を内部クラスに対してのみサポートし、最上位クラスに対してはサポートしていません。

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

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

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

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

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

于 2019-05-21T15:31:42.667 に答える
1

Javaに静的クラスのようなものはありますか?

シングルトンは静的クラスに「似ています」。まだ誰も言及していないことに驚いています。

public final class ClassSingleton { 

private static ClassSingleton INSTANCE;
private String info = "Initial info class";

private ClassSingleton() {        
}

public static ClassSingleton getInstance() {
    if(INSTANCE == null) {
        INSTANCE = new ClassSingleton();
    }
    
    return INSTANCE;
}

// getters and setters

public String getInfo(){
    return info;
  }
}

使用法は次のようなものです。

String infoFromSingleton = ClassSingleton.getInstance().getInfo()

シングルトンは、ArrayLists/List/Collection Classes/etc の格納に最適です...複数の領域からコレクションを頻繁に収集、更新、コピーし、これらのコレクションを同期させる必要がある場合。または多対一。

于 2021-10-27T19:14:08.790 に答える
0

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

于 2011-09-20T13:35:48.510 に答える