web-dev-qa-db-ja.com

Javaでトップレベルのクラスを静的にできないのはなぜですか?

満足のいく答えがどこにも見つからない。

39
ngesh

すべての最上位クラスは、定義により静的です。

staticが要約すると、クラスのインスタンスが単独で立つことができるということです。または、他の方法:非静的内部クラス(=インスタンス内部クラス)は、外部クラスのインスタンスなしでは存在できません。最上位クラスには外部クラスがないため、static以外にできません。

allトップレベルのクラスは静的であるため、トップレベルのクラス定義にstaticキーワードを使用しても意味がありません。

遊ぶコード:

public class Foo {

    public class Bar {
         // Non-static innner class
    }

    public static class Baz {
         // Static inner class
    }
}

public class Example {
    public static void main(String[] args) {
        new Foo(); // this is ok
        new Foo.Baz(); // this is ok
        new Foo.Bar(); // does not compile!

        Foo f = new Foo();
        Foo.Bar bar = f.new Bar(); //this works, but don't do this
    }
}

本当に ugいコード設計であるため、ここに「しかしこれをしないでください」と入れました。インスタンスの内部クラスは、外部クラスの外側に表示されるべきではありません。外部クラス内からのみ使用する必要があります。

68
Barend

私は同じ答えを与えました なぜJavaクラスをstaticとして宣言できないのですか? 。しかし、ここにもう一度書いてください。

メンバーを静的として定義する必要があります

  1. クラスのすべてのオブジェクトに共通する必要があります。
  2. クラスに属し、クラス名でアクセスできる必要があります。
  3. それらにアクセスするためにクラスのオブジェクトは必要ないはずです。

ここで、外部クラスを静的として定義し、それを許可されているとします。これは目的に役立つか、開発者に利点を提供しますか、それとも開発者と言語作成者の両方にあいまいさと複雑さをもたらしますか?

外側のクラスを静的として定義すると、上記で定義した目的に役立つかどうかを確認しましょう。

  1. すべてのクラスはそのすべてのオブジェクトに既に共通しており、すべてのオブジェクトで利用可能になるために静的にする必要はありません。
  2. 静的メンバーにアクセスするにはクラス名が必要です。これらのメンバーはクラスの一部であり、外部クラスはパッケージの一部であり、package_name.class_name(class_name.static_field_nameと同様)を記述するだけでクラスに直接アクセスできるためです。デフォルトですでに存在することを行う必要はありません。
  3. クラスが可視であれば、クラスにアクセスするためのオブジェクトは必要ありません。package_name.class_nameを書くだけでアクセスできます。そして、定義により、クラスはそのオブジェクトの青写真であり、そこからオブジェクトを作成するためのクラスを作成します(例外は常に存在します(例:Java.lang.Math))、再び外部クラスを静的として定義する必要はありません。

上記の点から、Java作成者は、外部クラスを静的にする必要がないため、外部クラスを静的にすることを許可していませんでした。外部クラスを静的にすることは、複雑さ、曖昧さのみを増加させます 外側がなぜJavaクラスが静的になれない

3
Naresh Joshi

staticは、デフォルトですが、インターフェイスのネストされたクラスを追加できます。

最初はネストされたクラスがなく、どのクラスにもstaticを追加できなかったため、staticを最上位クラスに追加できないと思います。

後でネストされたクラスが追加され、ネストされたクラスに静的を追加できましたが、必要以上に構文を変更しない傾向があるため、トップレベルのクラスには追加されませんでした。 (必要性/利点がなかったため)

2
Peter Lawrey

クラスJVMを実行するたびに、JVMはオブジェクトをインスタンス化します。 JVMは多数のオブジェクトを作成できますが、定義上、静的とはすべてのオブジェクトに同じコピーセットがあることを意味するため、トップクラスが静的である場合、プログラムを実行するたびにオブジェクトが作成され、同じメモリロケーションに乗り続けます。

2
salsinga
  1. クラスを実行するたびに、JVMはオブジェクトを作成します。すべての静的オブジェクトは、ヒープメモリではなく静的メモリに作成されます。つまり、すべてのオブジェクトに同じコピーのセットがあります。したがって、最上位クラスが静的で、pgmを実行すると、静的オブジェクトが作成され、同じ静的メモリに乗り続けます。それは間違っています。

2.メンバーを静的として定義する必要があります。これはクラスのすべてのオブジェクトに共通する必要があります。なぜなら、すべてのクラスはすでにすべてのオブジェクトに共通しており、すべてのオブジェクトで使用可能にするために静的にする必要はありません。

0
Anurag Prasad

外部クラスで「静的」キーワードを見たいと思うなら、あなたは正しく理解していないと思います。

要するに、外部クラスで静的機能をどのように使用するのでしょうか?

public class Outer
{
   public static int x = 0 ; 

}

次に、Outer.xを実行して静的変数にアクセスします。これは、xがOuterのすべてのオブジェクトで単一の値を共有することを意味します。

これで、Outerクラスのstaticキーワードはどのような結果になりますか? 。

Staticキーワードはメモリを提供し、オブジェクトを作成せずにロジックを実行することを目的としているため、外部(トップレベル)クラスをstaticとして宣言できません。クラスには値ロジックが直接ないため、staticキーワードは外部クラスでは許可されません。

0
user6674097