static class
Javaのようなものはありますか?
そのようなクラスの意味は何ですか。静的クラスのすべてのメソッドもそうである必要がありstatic
ますか?
逆に、クラスにすべての静的メソッドが含まれている場合、クラスも静的である必要がありますか?
静的クラスは何に適していますか?
static class
Javaのようなものはありますか?
そのようなクラスの意味は何ですか。静的クラスのすべてのメソッドもそうである必要がありstatic
ますか?
逆に、クラスにすべての静的メソッドが含まれている場合、クラスも静的である必要がありますか?
静的クラスは何に適していますか?
回答:
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クラスは実際に静的になります。
Foo
のみのクラスstatic
は同じではありませんstatic class Foo
まあ、Javaには「静的なネストされたクラス」がありますが、C#の静的クラスと同じではありません。静的ネストクラスは、外部クラスのインスタンスへの参照を暗黙的に持たないクラスです。
静的ネストクラスには、インスタンスメソッドと静的メソッドを含めることができます。
Javaのトップレベルの静的クラスのようなものはありません。
static
。それらを作成するために他のものへの参照を必要としないという点で、それらは暗黙的に静的です。個人的には、静的/非静的の用語は、入れ子になったクラスでは少し奇妙だと思います...動作とは何かについて話す方が簡単だと思います。
静的なネストされたクラスがあります。この[静的なネストされた]クラスは、それ自体をインスタンス化するために、囲んでいるクラスのインスタンスを必要としません。
これらのクラス[静的にネストされたクラス]は、それを含むクラスの静的メンバーにのみアクセスできます[それを含むクラスのインスタンスへの参照がないため...]
コードサンプル:
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();
}
}
はい、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();
B b = new B();
クラスA
自体からインスタンス化しようとしている場合と同様に、非静的クラスを定期的にインスタンス化できることに注意してください。
内のメンバーが.. 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();
}
ただしstatic
、non-static
内部クラス内にメンバーを含めることはできません。
static
は異なり、Javaでの意味は1つだけです。static
クラスに何かがある場合、そのクラスをインスタンス化せずにその物にアクセスできることを意味します。それは...インスタンスを作成するかどうかについては何も言っていない
これが「静的クラス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。ピアソン教育。
実装と正当化はかなり自明だと思います。
クラスをJavaで静的にすることはできますか?
答えはYESです。Javaで静的クラスを持つことができます。Javaには、静的インスタンス変数、静的メソッド、および静的ブロックがあります。クラスはJavaで静的にすることもできます。
Javaでは、トップレベル(外部)クラスを静的にすることはできません。入れ子になったクラスだけが静的にできます。
静的ネストクラスと非静的ネストクラス
1)ネストされた静的クラスは外部クラスの参照を必要としませんが、静的でないネストされたクラスまたは内部クラスは外部クラスの参照を必要とします。
2)内部クラス(または非静的ネストクラス)は、外部クラスの静的メンバーと非静的メンバーの両方にアクセスできます。静的クラスは、外部クラスの非静的メンバーにアクセスできません。外部クラスの静的メンバーのみにアクセスできます。
こちらをご覧ください:https : //docs.oracle.com/javase/tutorial/java/javaOO/nested.html
外部クラスは静的にすることはできませんが、ネストされたクラスや内部クラスは静的にすることができます。これは基本的に、外部クラスのインスタンスを作成せずに、ネストされた/内部クラスを使用するのに役立ちます。
簡単に言うと、Javaは、内部クラスに対してのみ静的であるようにクラスの宣言をサポートしますが、トップレベルのクラスに対してはサポートしません。
最上位クラス: Javaプロジェクトには、各Javaソースファイルに複数の最上位クラスを含めることができます。クラスの1つはファイル名に基づいて命名されます。トップレベルのクラスの前で許可されているオプションまたはキーワードは、 public、abstract、finalの 3つだけです。
内部クラス:最上位クラスの内部にあるクラスは内部クラスと呼ばれ、基本的にはネストされたクラスの概念です。内部クラスは静的にすることができます。内部クラスを静的にするアイデアは、最上位クラスのオブジェクトをインスタンス化せずに内部クラスのオブジェクトをインスタンス化するという利点を活用することです。これは、静的メソッドと変数がトップレベルのクラス内で機能するのとまったく同じ方法です。
したがって、Javaは(ネストされたクラスの)内部クラスレベルで静的クラスをサポートします。
また、Javaは最上位クラスの静的クラスをサポートしていません。
これにより、Javaの静的クラスの基本を理解するための質問に対する簡単な解決策が得られることを願っています。
内部クラスでない限り、クラスで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();
}
}
静的メソッドは、パブリックとは異なり、クラスのオブジェクトを作成せずにアクセスできることを意味します。
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
}
}
すべての良い答えですが、静的ファクターメソッドに大量の静的内部クラスを使用する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);
}