5

重複の可能性:
メソッドはいつ静的である必要がありますか?

通常、クラスの静的メソッドを作成する場合、メソッドにはを使用してアクセスできますClassName.methodName。この簡単な例で「static」を使用する目的は何ですか。また、ここで使用すべき/すべきでないのはなぜですか。また、プライベートスタティックはスタティックを使用する目的を無効にしますか?

public class SimpleTest { 

   public static void main(String[] args) {
         System.out.println("Printing...");
         // Invoke the test1 method - no ClassName.methodName needed but works fine?
         test1(5);
   }

   public static void test1(int n1) {
         System.out.println("Number: " + n1.toString());
   }
   //versus
   public void test2(int n1) {
         System.out.println("Number: " + n1.toString());
   }
   //versus
   private static void test3(int n1) {
         System.out.println("Number: " + n1.toString());
   }
}

私はいくつかのチュートリアルを見ました。例: http: //docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

私の理解では、そのメソッドを使用するクラスのインスタンスを作成する代わりに、クラス名を使用するだけで済みます。特定の状況では、特定のメソッドを使用するたびにオブジェクトを作成しても意味がないため、メモリを節約できます。

4

8 に答える 8

4

キーワードの目的はstatic、クラスのインスタンスを作成せずにメンバーを使用できるようにすることです。

これがここで起こることです。すべてのメソッド(プライベートメソッドを含む)は、のインスタンスを作成せずに呼び出されますSimpleTest

于 2013-01-23T20:28:18.543 に答える
1

staticこれは、関数が呼び出されるクラスのインスタンスを必要としないことを意味します。それ以外の:

SimpleTest st = new SimpleTest();
st.test2(5);

あなたは呼び出すことができます:

SimpleTest.test1(5);

この記事で静的メソッドの詳細を読むことができます。

についての質問private staticすでにここで尋ねられています。取り除くべき重要な部分はこれです:

プライベート静的メソッド自体はOOP自体に違反しませんが、インスタンスフィールドにアクセスする必要がない(そしてアクセスできない*)クラスにこれらのメソッドが多数ある場合、オブジェクト指向プログラミングではありません。オブジェクト」は、一緒に定義された状態+その状態に対する操作を意味します。状態を必要としないのに、なぜこれらのメソッドをそのクラスに配置するのですか?-eljenso

于 2013-01-23T20:28:20.040 に答える
1

この例では、静的メソッドを使用してメソッドに直接アクセスします。プライベート静的メソッドは、「データの非表示」の目的を無効にします。

メインは静的であるため、test1メソッドを直接呼び出すことができ、通信するためにオブジェクトを必要としません。Mainメンバーを参照できないnon-staticか、他の非静的メンバーは静的メンバーを参照できません。

"non-static members cannot be referred from a static context"

静的メンバーの詳細については、このスレッドを参照してください。

于 2013-01-23T20:30:20.180 に答える
0

staticメソッドがクラスのインスタンスに関連付けられていないことを意味します。

これは、メソッドのアクセシビリティを決定する//にpublic直交しprotectedます。private

于 2013-01-23T20:28:31.850 に答える
0

クラスの特定のインスタンスに関連しないすべての計算を静的メソッドに入れます。

可視性についてはpublic static、機能をエクスポートする場合に使用されますがprivate static、インスタンスに依存しないが内部で使用することを目的としています。

たとえば、クラスの各インスタンスに一意の識別子を割り当てたいとします。次のIDを提供するカウンターは、特定のインスタンスとは関係がなく、外部コードで変更する必要もありません。したがって、次のようなことができます。

class Foo {
    private static int nextId = 0;

    private static int getNext () {
        return nextId ++;
    }

    public final int id;

    public Foo () {
        id = getNext();    // Equivalent: Foo.getNext()
    }
}

この場合、クラスの外部から作成されたインスタンスの数も知りたい場合は、次のメソッドを追加できます。

public static int getInstancesCount () {
    return nextId;
}

構文についてClassName.methodName:静的メソッドを提供するクラスの名前を指定するので便利です。クラス内からメソッドを呼び出す必要がある場合はmethodName、名前空間の点で名前が最も近いため、最初の部分は無視してかまいません。

于 2013-01-23T20:30:29.273 に答える
0

はと同じクラスの静的メソッドであるため、例のtest1fromの呼び出しはmain、クラス名を使用せずに機能します。から呼び出したい場合は、静的メソッドではないため、最初にそのクラスのオブジェクトをインスタンス化する必要があります。test1maintest2main

于 2013-01-23T20:33:29.513 に答える
0

静的メソッドが同じクラスにある場合、そのメソッドをクラス名で修飾する必要はありません。メソッドがプライベート(静的かどうか)であるということは、単に別のクラスからアクセスできないことを意味します。インスタンスメソッド(この例ではtest2)は、クラスのインスタンスでのみ呼び出すことができます。つまり、次のようになります。

new SimpleTest().test2(5);
于 2013-01-23T20:34:07.613 に答える
0

mainは静的メソッドであるため、インスタンス化せずにクラスのメソッドを呼び出したい場合は、それらのメソッドも静的にする必要があります。

プライベートメソッドを静的にすることに関しては、他のメソッドよりも読みやすさの特徴があります。ボンネットの後ろにはそれほど大きな違いはありません。

于 2013-01-23T20:36:28.773 に答える