Javaでクラスを静的として宣言できないのはなぜですか?
static
クラスをとして解釈しますabstract final
。つまり、クラスをインスタンス化したり拡張したりすることはできません。つまり、静的メンバーのみを含めることができます。これは、ヘルパーメソッドのみを含むクラスに役立ちます。
Javaでクラスを静的として宣言できないのはなぜですか?
static
クラスをとして解釈しますabstract final
。つまり、クラスをインスタンス化したり拡張したりすることはできません。つまり、静的メンバーのみを含めることができます。これは、ヘルパーメソッドのみを含むクラスに役立ちます。
回答:
入れ子になったクラスだけが静的にできます。そうすることで、外部クラスのインスタンスがなくてもネストされたクラスを使用できます。
class OuterClass{
public static class StaticNestedClass{
}
public class InnerClass{
}
public InnerClass getAnInnerClass(){
return new InnerClass();
}
//This method doesn't work
public static InnerClass getAnInnerClassStatically(){
return new InnerClass();
}
}
class OtherClass{
//Use of a static nested class:
private OuterClass.StaticNestedClass staticNestedClass = new OuterClass.StaticNestedClass();
//Doesn't work
private OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
//Use of an inner class:
private OuterClass outerclass= new OuterClass();
private OuterClass.InnerClass innerClass2 = outerclass.getAnInnerClass();
private OuterClass.InnerClass innerClass3 = outerclass.new InnerClass();
}
出典:
同じトピックについて:
トップレベルのクラスはデフォルトで静的です。内部クラスはデフォルトでは静的ではありません。明示的に静的とマークすることで、内部クラスのデフォルトを変更できます。トップレベルであるため、参照する親クラスがないため、トップレベルのクラスは非静的セマンティクスを持つことができません。したがって、最上位クラスのデフォルトを変更する方法はありません。
static
、最上位クラスのキーワードが静的メンバーのみを含み、インスタンス化されないことを示し、強制することを許可することができます。ただし、static
ネストされたクラスには別の意味があるため、混乱する可能性があります。
それで、私はパーティーに遅れて来ています、しかしここに私の2セントがあります-哲学的にコリン・ハーバートの答えに追加します。
高レベルでは、質問はオブジェクトとタイプの違いを扱います。車(オブジェクト)は多数ありますが、車クラス(タイプ)は1つだけです。静的として宣言することは、「タイプ」スペースで操作していることを意味します。1つだけです。最上位のclassキーワードは、「タイプ」スペースでタイプをすでに定義しています。その結果、「public static class Car」は冗長になります。
プライベートコンストラクターを持つクラスは静的です。
次のようにクラスを宣言します。
public class eOAuth {
private eOAuth(){}
public final static int ECodeOauthInvalidGrant = 0x1;
public final static int ECodeOauthUnknown = 0x10;
public static GetSomeStuff(){}
}
また、初期化せずに使用できます。
if (value == eOAuth.ECodeOauthInvalidGrant)
eOAuth.GetSomeStuff();
...
static class
C#での宣言の効果)とマークされている場合、コンパイラーはコードでその型の変数を宣言することも、ジェネリック型パラメーターとして使用することもできません。クラスにアクセス可能なコンストラクターが欠けているだけで、インスタンス化または継承される可能性がある場合、その型の変数の宣言も、ジェネリック型パラメーターとしての使用も除外されません。
もちろん可能ですが、ネストされた内部クラスのみです。そこでは、ネストされたクラスのインスタンスは、外側のクラスの囲んでいるインスタンスを必要としないことを意味します。
しかし、トップレベルのクラスの場合、言語設計者はキーワードを使用して役立つことを何も考えられなかったため、許可されていません。
static
、できるようにすると意味がある場合があります。たとえば、静的ヘルパーメソッドのみを含むクラスは、インスタンス化しても意味がありませんが、Java言語はインスタンス化を妨げません。デフォルトのコンストラクターを宣言することにより、クラスを他のクラスに対してインスタンス化不可能(および実質的に「静的」)にprivate
することができます。これにより、コンストラクターが表示されないため、インスタンス化が禁止されます。
インスタンスのない列挙型を宣言することで、ユーティリティクラス(インスタンスを作成できない)を作成できます。つまり、インスタンスがないことを具体的に宣言しています。
public enum MyUtilities {;
public static void myMethod();
}
public class Outer {
public static class Inner {}
}
...メンバークラスである限り、静的と宣言できます。
JLSから:
メンバークラスは静的である場合があり、その場合、周囲のクラスのインスタンス変数にアクセスできません。または、それらは内部クラスである場合があります(§8.1.3)。
そしてここ:
staticキーワードは、非内部クラスTの本体内のメンバー型Cの宣言を変更する場合があります。その効果は、Cが内部クラスではないことを宣言することです。Tの静的メソッドの本体にTの現在のインスタンスがないのと同じように、CにもTの現在のインスタンスがなく、字句的に囲んでいるインスタンスもありません。
静的キーワードは、トップレベルのクラスに囲み型がないため、トップレベルのクラスには意味がありません。
Inner
ですか?Nested
混乱の少ない選択だったでしょう。
Javaが静的内部クラスを定義する方法に加えて、C#の世界ごとに静的クラスの別の定義があります[1]。静的クラスは、静的メソッド(関数)のみを含むクラスであり、手続き型プログラミングをサポートするためのものです。このようなクラスは、クラスのユーザーがヘルパー関数にのみ関心があり、クラスのインスタンスの作成には関心がないという点で、実際にはクラスではありません。静的クラスはC#でサポートされていますが、Javaではそのような直接的なサポートはありません。ただし、列挙型を使用してJavaのC#静的クラスを模倣できるため、ユーザーは特定のクラスのインスタンスを(リフレクションを使用しても)作成できません[2]。
public enum StaticClass2 {
// Empty enum trick to avoid instance creation
; // this semi-colon is important
public static boolean isEmpty(final String s) {
return s == null || s.isEmpty();
}
}
Javaでコーディングしたものはすべてクラスに入ります。クラスJVMを実行するたびに、オブジェクトがインスタンス化されます。JVMは、多くのオブジェクトを作成できます。定義上、静的とは、すべてのオブジェクトに同じコピーのセットがあることを意味します。
そのため、プログラムを実行するたびにJavaがトップクラスを静的にできるようにした場合、オブジェクトが作成され、同じメモリロケーションに上書きされ続けます。
実行するたびにオブジェクトを置き換えるだけの場合、作成のポイントは何ですか?
そのため、Javaがトップレベルクラスのstaticを削除したのはそのためです。
より具体的な理由があるかもしれませんが、これは私にとって非常に理にかなっています。
静的にできる唯一のクラスは内部クラスです。次のコードは問題なく動作します。
public class whatever {
static class innerclass {
}
}
静的内部クラスの要点は、外部クラスオブジェクトへの参照がないことです。
これは一杯のコーヒーを飲むのと同じくらい簡単だと思います!。これを見てください。クラスを定義するときに、staticキーワードを明示的に使用しません。
public class StaticClass {
static private int me = 3;
public static void printHelloWorld() {
System.out.println("Hello World");
}
public static void main(String[] args) {
StaticClass.printHelloWorld();
System.out.println(StaticClass.me);
}
}
それは静的クラスの定義ではありませんか?クラスだけにバインドされた関数を使用します。この場合、ネストされたその中で別のクラスを使用できることに注意してください。これを見てください:
class StaticClass1 {
public static int yum = 4;
static void printHowAreYou() {
System.out.println("How are you?");
}
}
public class StaticClass {
static int me = 3;
public static void printHelloWorld() {
System.out.println("Hello World");
StaticClass1.printHowAreYou();
System.out.println(StaticClass1.yum);
}
public static void main(String[] args) {
StaticClass.printHelloWorld();
System.out.println(StaticClass.me);
}
}
new StaticClass()
。そうしないと言うことができますが、これはあまり意味がありません。プライベートコンストラクターでは、そのインスタンスは許可されません。
PlatformUI
Eclipseで静的メソッドとプライベートコンストラクターを含むクラスを調べ、それ自体が最終的なものにすることができます。
public final class <class name>
{
//static constants
//static memebers
}
static
ますか?