web-dev-qa-db-ja.com

静的メソッドと変数とは何ですか?

誰かが静的変数と静的メソッドの簡単に理解できる定義を与えることができますか?

これらは非静的変数やメソッドとどのように比較されますか?

9
WAMoz56

Javaでは、staticクラスメソッド およびクラス変数(インスタンスメソッドおよびインスタンス変数とは対照的)を示します。これらのメソッドと変数には、インスタンスが存在しなくてもアクセスできます。

これをインスタンスメソッドおよびインスタンス変数と比較してください。これらはオブジェクトを介してアクセスする必要があります。たとえば、length()はオブジェクトを操作します。

String a = "hello";
int len = a.length();

対照的に、valueOfはオブジェクトを操作できません。さらに、呼び出されると新しいオブジェクトが作成されます。

String x = String.valueOf(123.45);

インスタンスメソッドが<objectName>の後にドット.を使用して呼び出されるのに対し、静的メソッドは<className>の後にドット.を使用してアクセスされることに注意してください。

15
dasblinkenlight

言語によって少し違う意味があるので、答えるのは簡単ではないと思います。私がそれを最も一般的な言葉で言えば、おそらく人によって大きく異なります:

静的変数は、クラスのすべてのインスタンス間で共有される変数です。

静的メソッドは、クラスで呼び出すことができるメソッドであり、通常、クラスをインスタンス化する必要はありません。

繰り返しますが、3つの異なる言語を選択する場合、3つの異なる答えを出します。

ウィキペディアもこれらのことを定義するのに少し役立つかもしれません。

http://en.wikipedia.org/wiki/Method_(computer_programminghttp://en.wikipedia.org/wiki/Static_variable

7
Cory Loken

'static'キーワードは、それが発生したCでは複数の意味があるため、混乱を招く可能性があります。関数内で変数を宣言するために使用される場合、それは変数が関数外で存続期間を持つことを意味します。これは本質的に、関数専用のグローバルです。グローバル変数が静的である場合、それは本質的にそのソースファイルに対してプライベートです。どちらの場合も、変数にはグローバルと同じように単一のメモリ位置があります。コンパイラーが、関数またはコンパイル単位の外部からアクセスできないようにしているだけです。

関数が呼び出されたときのスタックの外観に応じてスタックのどこかにメモリ位置がある通常のローカル変数とは対照的に、静的変数の場所は変更されないため、「静的」という単語が使用されたと思います。 。

C++が作成されたとき、このキーワードはクラスレベルのプロパティとメソッドを参照するために再利用されました。静的メソッドまたはプロパティは、クラスにプライベートな一種のグローバルであると考えられていたと思います。これらがメモリ内でどのように配置されるかを考えると、静的プロパティはグローバル変数と同じように単一のアドレスを持つため、ある種の意味があります。唯一の違いは、コンパイラーではクラス外での使用が許可されていないことです。

Java(および他の言語)はC++に触発された構文を持っていたため、クラスのメソッドとプロパティを参照するために「static」を使用することもそこで使用されます。このキーワードの使用はほとんどないため、残念です。英語の意味との関係。

しかし、一般的に、それはそれを見る方法です。ほとんどの言語では、それが「静的」である場合、プログラム全体に1つしかありません。単一の固定メモリアドレスを持つものと考えてください。

6
Steven Burnap

静的変数は、クラスのすべてのインスタンスで使用される変数であり、通常の変数と同様に、変数は再び初期化されます。静的メソッドは、オブジェクトを作成せずに呼び出すことの重要性があります。

1
user3482117

静的メソッドを明確に理解するための例を示します。

キーボードからデータを入力する場合JavaはScannerクラスを使用します

例;スキャナーscn = new Scanner(System.in); int a = scn.nextInt();

つまり、nextInt()メソッドは静的ではないということです。

静的メソッドは、クラスをインスタンス化せずに使用できるメソッドです。

次の例を見てください。

public class Calculate {

    static void calculatePower(int num, int pow) {
        System.out.println(Math.pow(num, pow));
    }


}

静的メソッドの使用。

public static void main(String[] args) {
    Calculate.calculatePower(2,8);
}

そのため、Calculateクラスをインスタンス化せず、静的なcalculatePowerメソッドを使用しました。

1
user3108764