ネストしたクラスだけが静的になることができます。そうすることで、外部クラスのインスタンスを持たずにネストしたクラスを使用できます。
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();
}
出典:
同じトピックで:
それで、私はパーティーに遅刻しています、しかしここに私の2セントがあります - 哲学的にコリンHebertの答えに加えて。
大まかに言って、あなたの質問はオブジェクトとタイプの違いを扱います。多くの自動車(オブジェクト)がありますが、Carクラス(タイプ)は1つだけです。何かを静的なものとして宣言することは、あなたが「タイプ」空間で操作していることを意味します。 1つだけです。最上位クラスのキーワードは、既に "type"スペースで型を定義しています。結果として、 "public static class Car"は冗長です。
最上位クラスはデフォルトでは静的です。内部クラスはデフォルトでは非静的です。明示的に静的にマークすることで、内部クラスのデフォルトを変更できます。参照する親クラスがないため、トップレベルクラスは、トップレベルであるため、非静的セマンティクスを持つことはできません。したがって、最上位クラスのデフォルトを変更する方法はありません。
static
最上位クラスのキーワードで、静的メンバーのみを含み、インスタンス化されていないことを示して強制する。しかし、それは人々をstatic
入れ子クラスでは意味が異なります。 - Lumi
プライベートコンストラクタを持つクラスは静的です。
このようにあなたのクラスを宣言してください:
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#で宣言した場合、コンパイラはコードでその型の変数を宣言することも、一般的な型パラメータとして使用することもできません。別の方法でインスタンス化または継承できるクラスにアクセス可能なコンストラクタがないだけでは、その型の変数の宣言も、総称型パラメータとしての使用も妨げられません。 - supercat
確かに彼らはできるが、唯一の内なる入れ子クラスそこでは、ネストしたクラスのインスタンスは外側のクラスの外側のインスタンスを必要としません。
しかし、トップレベルのクラスでは、言語設計者はこのキーワードを使用して何か有用なことを考えることができないため、許可されません。
static
できることがあると意味があります。たとえば、静的ヘルパーメソッドのみを含むクラスはインスタンス化するのは意味がありませんが、Java言語ではそれをやめることはできません。デフォルトのコンストラクタを宣言することで、そのクラスを他のクラスに対してインスタンス化不可能(そして実質的には静的)にすることができます。private
コンストラクタが表示されないため、インスタンス化を禁止します。 - Iain Samuel McLean Elder
インスタンスなしでenum型を宣言することで、ユーティリティクラス(インスタンスを作成することはできません)を作成できます。つまり、インスタンスが存在しないことを明確に宣言しているということです。
public enum MyUtilities {;
public static void myMethod();
}
public class Outer {
public static class Inner {}
}
...メンバクラスである限り、staticと宣言することができます。
JLSから:
メンバクラスは静的にすることができます。その場合、メンバクラスは周囲のクラスのインスタンス変数にアクセスできません。あるいはそれらは内部クラスでもよい(8.1.3)。
そしてここ:
staticキーワードは、非内部クラスTの本体内でメンバー型Cの宣言を変更することがあります。その効果は、Cが内部クラスではないことを宣言することです。Tの静的メソッドの本体にTの現在のインスタンスがないのと同様に、CにもTの現在のインスタンスはありません。また、字句的に囲むインスタンスもありません。
最上位クラスに包含型がないという理由だけで、静的キーワードは最上位クラスには意味がありません。
Inner
?Nested
紛らわしくない選択でした。 - user207421
上で説明したように、クラスは他のクラスのメンバーでない限り静的にはできません。
「複数のインスタンスが存在できない」クラスを設計する場合は、「シングルトン」設計パターンを検討することをお勧めします。
初心者シングルトン情報ここに。
警告:
あなたが使用することを考えているなら シングルトンパターン、すべてに抵抗 あなたの力それは最も簡単なの一つです 理解するDesignPatterns、おそらく 最も人気のある、そして間違いなく 最も虐待された。(出典:上記リンクのJavaRanch)
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();
}
}
静的にできる唯一のクラスは内部クラスです。次のコードは問題なく動作します。
public class whatever {
static class innerclass {
}
}
静的内部クラスのポイントは、外部クラスオブジェクトへの参照がないということです。
Javaでコーディングしたものはすべてクラスに入ります。クラスを実行するたびに、JVMはオブジェクトをインスタンス化します。 JVMは、定義上、多数のオブジェクトを作成できます。静的とは、すべてのオブジェクトに対して同じコピーのセットがあることを意味します。
そのため、プログラムを実行するたびにJavaが最上位クラスを静的にすることを許可していた場合は、オブジェクトが作成され、同じメモリ位置に上書きされ続けます。
実行するたびにオブジェクトを置き換えるだけの場合は、それを作成することが重要です。
そのため、Javaが最上位クラスの静的クラスを削除したのはこのためです。
もっと具体的な理由があるかもしれませんが、これは私にとって論理的に意味のあることです。
私はこれがコーヒーを一杯飲むのと同じくらい簡単にできると思います。 ちょっとこれを見てください。 クラスを定義するときに静的キーワードを明示的に使用しません。
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);
}
}
一目でわかるPlatformUI
Eclipseでは、静的メソッドを持つクラスと、それ自体が最終的なプライベートコンストラクタを使用します。
public final class <class name>
{
//static constants
//static memebers
}
静的クラスを使用する利点が、オブジェクトをインスタンス化してメソッドを使用しないことであれば、そのクラスをpublicとして宣言し、このメソッドをstaticとして宣言するだけです。
static
? - Joachim Sauerstatic
クラスabstract final
つまり、インスタンス化できず、拡張できません。つまり、静的メンバーのみを含めることができます。これは、ヘルパーメソッドのみを含むクラスに役立ちます。 - bcat