この質問にはすでに答えがあります。
私はウィキペディアでいくつかの定義を言われてきましたが、Javaの初心者として私はまだそれが何を意味するのかわかりません。誰もがJavaとばかに流暢?
staticは、そのようにマークされた変数またはメソッドがクラスレベルで利用可能であることを意味します。つまり、アクセスするためにクラスのインスタンスを作成する必要はありません。
public class Foo {
public static void doStuff(){
// does stuff
}
}
そのため、Fooのインスタンスを作成してから呼び出すのではなくdoStuff
このような:
Foo f = new Foo();
f.doStuff();
次のように、クラスに対して直接メソッドを呼び出すだけです。
Foo.doStuff();
public static
厳密にはインスタンス間で共有されているだけではなく、すべての人にとって単なる無料のものです。 - polygenelubricants
非常に素人の言葉では、クラスは金型であり、オブジェクトはその金型で作成されたコピーです。静的は型に属し、コピーを作成せずに直接アクセスできるため、上記の例
staticキーワードはJavaでいくつかの異なる方法で使用することができ、ほとんどの場合それはそれが変更していることを意味する修飾子です。包含オブジェクトインスタンスなしで使用可能。
Javaはオブジェクト指向言語です。デフォルトでは、あなたが書くほとんどのコードはオブジェクトのインスタンスを使用する必要があります。
public class SomeObject {
public int someField;
public void someMethod() { };
public Class SomeInnerClass { };
}
someField、someMethod、またはSomeInnerClassを使用するためまずSomeObjectのインスタンスを作成しなければなりません。
public class SomeOtherObject {
public void doSomeStuff() {
SomeObject anInstance = new SomeObject();
anInstance.someField = 7;
anInstance.someMethod();
//Non-static inner classes are usually not created outside of the
//class instance so you don't normally see this syntax
SomeInnerClass blah = anInstance.new SomeInnerClass();
}
}
それらを静的と宣言すれば、囲んでいるインスタンスを必要としない。
public class SomeObjectWithStaticStuff {
public static int someField;
public static void someMethod() { };
public static Class SomeInnerClass { };
}
public class SomeOtherObject {
public void doSomeStuff() {
SomeObjectWithStaticStuff.someField = 7;
SomeObjectWithStaticStuff.someMethod();
SomeObjectWithStaticStuff.SomeInnerClass blah = new SomeObjectWithStaticStuff.SomeInnerClass();
//Or you can also do this if your imports are correct
SomeInnerClass blah2 = new SomeInnerClass();
}
}
静的なものを宣言することにはいくつかの意味があります。
最初、アプリケーション全体を通じて、静的フィールドの値は1つだけです。。
public class SomeOtherObject {
public void doSomeStuff() {
//Two objects, two different values
SomeObject instanceOne = new SomeObject();
SomeObject instanceTwo = new SomeObject();
instanceOne.someField = 7;
instanceTwo.someField = 10;
//Static object, only ever one value
SomeObjectWithStaticStuff.someField = 7;
SomeObjectWithStaticStuff.someField = 10; //Redefines the above set
}
}
第二の問題は静的メソッドおよび内部クラスは、それを囲むオブジェクト内のフィールドにアクセスできません(ないので)。
public class SomeObjectWithStaticStuff {
private int nonStaticField;
private void nonStaticMethod() { };
public static void someStaticMethod() {
nonStaticField = 7; //Not allowed
this.nonStaticField = 7; //Not allowed, can never use *this* in static
nonStaticMethod(); //Not allowed
super.someSuperMethod(); //Not allowed, can never use *super* in static
}
public static class SomeStaticInnerClass {
public void doStuff() {
someStaticField = 7; //Not allowed
nonStaticMethod(); //Not allowed
someStaticMethod(); //This is ok
}
}
}
staticキーワードは、内部インタフェース、注釈、および列挙型にも適用できます。
public class SomeObject {
public static interface SomeInterface { };
public static @interface SomeAnnotation { };
public static enum SomeEnum { };
}
これらすべての場合において、キーワードは冗長であり効果がありません。インタフェース、アノテーション、およびenumは、内部クラスとの関係を持たないため、デフォルトでは静的です。
これは、キーワードが何をするのかを説明しているだけです。キーワードの使用が悪い考えであるかどうかについては説明しません。それについては、次のような他の質問でより詳細に説明することができます。多くの静的メソッドを使用するのは悪いことですか?
キーワードstaticの一般的ではない使い方もいくつかあります。静的な型(インターフェース、アノテーション、および静的に重複してマークされていない列挙型を含む)を修飾なしで使用できるようにする静的インポートがあります。
//SomeStaticThing.java
public class SomeStaticThing {
public static int StaticCounterOne = 0;
}
//SomeOtherStaticThing.java
public class SomeOtherStaticThing {
public static int StaticCounterTwo = 0;
}
//SomeOtherClass.java
import static some.package.SomeStaticThing.*;
import some.package.SomeOtherStaticThing.*;
public class SomeOtherClass {
public void doStuff() {
StaticCounterOne++; //Ok
StaticCounterTwo++; //Not ok
SomeOtherStaticThing.StaticCounterTwo++; //Ok
}
}
最後に、クラスが最初にロードされたときに実行されるコードのブロックである静的初期化子があります。通常クラスがアプリケーション内で初めてインスタンス化される直前)および(静的メソッドと同様に)非静的フィールドまたはメソッドにアクセスすることはできません。
public class SomeObject {
private static int x;
static {
x = 7;
}
}
静的属性の場合のもう1つの優れた例適用したい場合は、操作が使用されます。シングルトンデザインパターン。一言で言えば、シングルトンのデザインパターンは、特定のクラスの唯一のオブジェクトがシステムの寿命の間に構築されることを確実にします。 1つのオブジェクトのみが構築されるようにするために、Singletonパターンの一般的な実装では、許可された1つのオブジェクトインスタンスへの内部静的参照を保持し、そのインスタンスへのアクセスはstatic
操作
@inkedmnが指摘したことに加えて、静的メンバーはクラスレベルにあります。したがって、そのメンバは、そのクラスに対して1回JVMによってメモリにロードされます(クラスがロードされるとき)。つまり、ありませんnロードされた静的メンバーのインスタンスnそれが属するクラスのインスタンス。
上記の点は正しいので、Staticキーワードについてもう少し重要な点を追加したいと思います。
静的キーワードを使用しているときに内部的に何が起きるかは、それがに格納されるということです。永久記憶(それはヒープメモリ)、私達は彼らがある2種類の記憶があることを私達は知っているスタックメモリ(一時メモリ)ヒープメモリ静的なキーワードを使用していないのであれば、そのときにある一時的なメモリに格納されます。スタックメモリ(またはあなたはそれを揮発性メモリ)
だから、あなたはこの権利の使用が何であるかという疑問を得るでしょう?
例:static int a = 10;(1プログラム)
今、私はあなたのために静的キーワードを使用するかどうかを言った変数またはのために方法それはに格納されます永久記憶右。
だから私はキーワードで同じ変数を宣言した静的異なる値を持つ他のプログラムでは。
例:static int a = 20;(2プログラム)
変数 'a'は、によってヒープメモリに格納されます。プログラム1同じ静的変数 'a'がプログラム2その時それ10から20までのaの値を置き換えるのではなく、ヒープメモリにもう一度「a」変数を作成しないでください。。
一般にそれは作成しますもう一度'a'を静的変数として宣言しない場合は、スタックメモリ(一時メモリ)内の変数 'a'。
全体的に言って、静的キーワードを使用すれば、
1.weはメモリを節約できます
2.weは重複を避けることができます
あなたはそれにアクセスすることができますクラス名の助けを借りて静的変数にアクセスするためにオブジェクトを作成する必要はありません。