87

この質問にはすでに答えがあります。

私はウィキペディアでいくつかの定義を言われてきましたが、Javaの初心者として私はまだそれが何を意味するのかわかりません。誰もがJavaとばかに流暢?


  • どの静的?たくさんの統計があります(例:非網羅的なリスト)mindprod.com/jgloss/static.html) - kennytm
  • @Philip Strong:staticはJavaの特質であり、陪審員はまだ「静的」かどうかを判断していません。オブジェクト指向言語にあるかどうかにかかわらず;) - SyntaxT3rr0r

6 답변


225

staticは、そのようにマークされた変数またはメソッドがクラスレベルで利用可能であることを意味します。つまり、アクセスするためにクラスのインスタンスを作成する必要はありません。

public class Foo {
    public static void doStuff(){
        // does stuff
    }
}

そのため、Fooのインスタンスを作成してから呼び出すのではなくdoStuffこのような:

Foo f = new Foo();
f.doStuff();

次のように、クラスに対して直接メソッドを呼び出すだけです。

Foo.doStuff();


  • それは理にかなっている!ありがとう。 - Philip Strong
  • また、静的フィールドはクラスのすべてのインスタンスで共有されているため、すべて同じ値になります。 - Péter Török
  • @Peter:「すべてのインスタンスで共有される」ことはあまりありません。それはクラスに属しているので、そのうちの1つだけがあります。何かpublic static厳密にはインスタンス間で共有されているだけではなく、すべての人にとって単なる無料のものです。 - polygenelubricants
  • と言っています - theJollySin
  • 静的メソッドは概念的にはPythonやC ++のような言語のいわゆるフリー関数に似ています。関数名がクラス名の内側になるようにスコープ指定されているだけです。 - seand

36

非常に素人の言葉では、クラスは金型であり、オブジェクトはその金型で作成されたコピーです。静的は型に属し、コピーを作成せずに直接アクセスできるため、上記の例


12

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;
    }
}


  • あなたは本当にもっと賛成票に値する。答えは最初から最後までのポイントです。 - s.dragos

6

静的属性の場合のもう1つの優れた例適用したい場合は、操作が使用されます。シングルトンデザインパターン。一言で言えば、シングルトンのデザインパターンは、特定のクラスの唯一のオブジェクトがシステムの寿命の間に構築されることを確実にします。 1つのオブジェクトのみが構築されるようにするために、Singletonパターンの一般的な実装では、許可された1つのオブジェクトインスタンスへの内部静的参照を保持し、そのインスタンスへのアクセスはstatic操作


3

@inkedmnが指摘したことに加えて、静的メンバーはクラスレベルにあります。したがって、そのメンバは、そのクラスに対して1回JVMによってメモリにロードされます(クラスがロードされるとき)。つまり、ありませんnロードされた静的メンバーのインスタンスnそれが属するクラスのインスタンス。


-4

上記の点は正しいので、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は重複を避けることができます

 あなたはそれにアクセスすることができますクラス名の助けを借りて静的変数にアクセスするためにオブジェクトを作成する必要はありません。


  • -1、質問は初心者用語で何かを探していました。恒久的で一時的で不安定なこの話は実際には初心者には理解されないでしょうし、とにかく実際には間違っています。 - Martin
  • 彼らは大きな言葉ではありません。彼らは、k.theyが実際の違いを知っている必要があるということを理解できます。 - sushanth
  • それらは大きな言葉ではありませんが、あなたが主張していることはJavaでは完全に誤っており、とにかく問題とは無関係です。 - Martin

リンクされた質問


関連する質問

最近の質問