静的メソッドとインスタンスメソッドの違い


88

教科書に書かれている文章を読んでいたところ、何を言っているのかよくわかりません。基本的に、静的メソッドまたはクラスメソッドには「modifier」キーワードstaticが含まれていると言っています。しかし、それが何を意味するのか本当にわかりませんか?

誰かが静的メソッドまたはクラスメソッドとは何かを本当に簡単な言葉で説明してもらえますか?

また、インスタンスメソッドとは何かについて簡単に説明してもらえますか?

これは彼らが教科書で私に与えたものです:

静的修飾子の有無には、重要な実際的な影響があります。パブリッククラスメソッドは、Javaがそれが属するクラスの定義を処理するとすぐに呼び出され、実行される場合があります。これは、インスタンスメソッドには当てはまりません。パブリックインスタンスメソッドを呼び出して実行する前に、インスタンスが属するクラスのインスタンスを作成する必要があります。パブリッククラスメソッドを使用するには、クラスが必要です。一方、パブリックインスタンスメソッドを使用する前に、クラスのインスタンスが必要です。

別のメソッドの定義内で静的メソッドが呼び出される方法は、2つのメソッドが同じクラスに属しているかどうかによって異なります。上記の例では、factorialとmainはどちらもMainClassクラスのメソッドです。その結果、mainの定義での階乗の呼び出しは、単にメソッド名「階乗」を参照します。

回答:


161

Javaの基本的なパラダイムは、クラスを作成し、それらのクラスをインスタンス化することです。インスタンス化されたオブジェクト(クラスのインスタンス)には、それらの動作に影響を与える属性(メンバー変数)が関連付けられています。インスタンスでメソッドが実行されると、これらの変数が参照されます。

ただし、特定のタイプのすべてのオブジェクトは、メンバー変数にまったく依存しない動作をする可能性があります。これらのメソッドは静的にするのが最適です。静的であるため、メソッドを実行するためにクラスのインスタンスは必要ありません。

これを実行して、静的メソッドを実行できます。

MyClass.staticMethod();//Simply refers to the class's static code

ただし、非静的メソッドを実行するには、次のことを行う必要があります。

MyClass obj = new MyClass();//Create an instance
obj.nonstaticMethod();//Refer to the instance's class's code

より深いレベルでは、コンパイラーがクラスをまとめると、メソッドへのポインターがいくつか含まれます。これらのメソッドが実行されると、ポインターに従い、遠端でコードが実行されます。クラスがインスタンス化される場合、作成されたオブジェクトには、継承階層内のその特定のクラスに対して呼び出されるメソッドを指す「仮想メソッドテーブル」へのポインタが含まれます。ただし、メソッドが静的である場合、「仮想メソッドテーブル」は必要ありません。そのメソッドへのすべての呼び出しは、メモリ内のまったく同じ場所に移動して、まったく同じコードを実行します。そのため、高性能システムでは、インスタンス変数に依存しない場合は静的メソッドを使用することをお勧めします。


2
見覚えのあるコード例をありがとうございます。今は理解しています
Panthy 2012

4
@Rohanもう1つの良い見方は、何かstatic(クラス、メソッド、またはフィールド)は実際には何にも属していないということです。組織的な目的で、クラスにたむろしているだけです。
ゴベルナドール2012

1
さらに、静的フィールドはデータオブジェクトとして使用されます(データを保持しているため変更できませんが、内部のデータを操作できます)。静的メソッドは静的フィールドでのみ呼び出すことができ、以降は一定であるか変更されないという同じ概念を持ちます。またはインスタンス化しない!!
user2416728 2013

1
@ user2416728あなたのコメントは非常に混乱しています。静的フィールド変更できますが、そのスコープは実行環境に対してグローバルです。したがって、上記のフィールドにアクセスできるコードはすべて、同じデータにアクセスできます。これは、データが一定のままであることと同等ではありません(「final」修飾子が使用されていない限り)。
ナサニエルフォード

2
ええ、「変わらない」>>私はインスタンス化できないことを意味しました!!
user2416728 2013

19

静的として宣言されていないメソッドと変数は、インスタンスメソッドとインスタンス変数と呼ばれます。インスタンスのメソッドと変数を参照するには、最初にクラスをインスタンス化する必要があります。つまり、最初にそのクラスのオブジェクトを作成する必要があります。静的の場合、クラスをインスタンス化する必要はありません。uは、ピリオド記号を使用してクラス名でメソッドと変数にアクセスできます。 (。)にあります

例えば:

Person.staticMethod();           //accessing static method.

非静的メソッドの場合、クラスをインスタンス化する必要があります。

Person person1 = new Person();   //instantiating
person1.nonStaticMethod();       //accessing non-static method.

8

静的メソッド、変数は、オブジェクトインスタンスだけでなく、クラス全体に属します。静的メソッドである変数は、クラスの特定のインスタンスではなく、クラス全体に関連付けられています。各オブジェクトは、静的メソッド、変数の共通のコピーを共有します。クラスから作成されるオブジェクトの数に関係なく、クラスごとに1つのコピーしかありません。


8

静的メソッドとインスタンスメソッドの違い

  1. インスタンスメソッドは、呼び出す前にそのクラスのオブジェクトを作成する必要があるメソッドです。静的メソッドは、クラスのオブジェクトを作成せずに呼び出すことができるJavaのメソッドです。

  2. 静的メソッドはstaticキーワードで宣言されています。インスタンスメソッドにstaticキーワードがありません。

  3. 静的メソッドとは、クラスの単一のコピーとして存在することを意味します。ただし、インスタンスメソッドは、そのクラス用に作成されたインスタンスの数に応じて、複数のコピーとして存在します。

  4. 静的メソッドは、クラス参照を使用して呼び出すことができます。インスタンスまたは非静的メソッドは、オブジェクト参照を使用して呼び出されます。

  5. 静的メソッドは、インスタンスメソッドとインスタンス変数に直接アクセスできません。インスタンスメソッドは、静的変数と静的メソッドに直接アクセスできます。

参照:geeksforgeeks


4

インスタンスメソッド=>特定のクラスの特定のインスタンスで呼び出されます。メソッドは、呼び出されたクラスを知りたいと考えています。それが起こる方法には、「this」と呼ばれる目に見えないパラメータがあります。'this'の内部には、インスタンスクラスのメンバーがすでに値で設定されています。「これ」は変数ではありません。これは値であり、変更することはできません。値は呼び出しの受信者を参照します。 例:テレビ(実際の番組)を修理するために修理工(インスタンス方式)に電話します。彼はツール(「this」パラメーター)が付属しています。彼はテレビを修正するために必要な特定のツールが付属しており、他のものも修正することができます。

では静的メソッド=>「この」のようなものはありません。 例:同じ修理工(静的方法)。彼に電話するときは、どの修理工に電話するか(電気技師など)を指定する必要があります。そして彼は来てあなたのテレビだけを修理します。しかし、彼は他のものを修正するためのツールを持っていません( 'this'パラメーターはありません)。

静的メソッドは通常、クラスのインスタンス( 'this'から)からのデータを必要とせず、引数のみを使用して意図された目的を実行できる操作に役立ちます。


2

オブジェクトの動作は、そのクラスの変数とメソッドによって異なります。クラスを作成するときは、そのオブジェクトを作成します。静的メソッドの場合、静的メソッドはすべてのオブジェクトが同じコピーを持つことを意味するため、オブジェクトは必要ありません。例えば:

Myclass.get();

インスタンスメソッドでは、各オブジェクトの動作が異なるため、オブジェクトインスタンスを使用してメソッドを呼び出す必要があります。例えば:

Myclass x = new Myclass();
x.get();

1

メソッドの状態が変更されない、またはインスタンス変数を使用しない場合。

インスタンスなしでメソッドを呼び出したい。

提供された引数に対してのみ機能する場合。

ユーティリティ関数は静的メソッドの良い例です。つまり、math.pow()の場合、この関数はさまざまな値の状態を変更しません。したがって、静的です。


1

つまり、静的メソッドと静的変数はクラスレベルであり、インスタンスメソッドとインスタンス変数はインスタンスレベルまたはオブジェクトレベルです。

つまり、インスタンスまたはオブジェクト(new ClassName()を使用)が作成されるたびに、このオブジェクトはインスタンス変数の独自のコピーを保持します。同じクラスの5つの異なるオブジェクトがある場合、インスタンス変数の5つの異なるコピーがあります。ただし、静的変数とメソッドは、これら5つのオブジェクトすべてで同じになります。作成された各オブジェクトで使用される共通のものが必要な場合は、静的にします。オブジェクト固有のデータを必要としないメソッドが必要な場合は、静的にします。静的メソッドは静的変数でのみ機能するか、渡された引数に基づいてデータを返します。

class A {
    int a;
    int b;

    public void setParameters(int a, int b){
        this.a = a;
        this.b = b;
    }
    public int add(){
        return this.a + this.b;
   }

    public static returnSum(int s1, int s2){
        return (s1 + s2);
    }
}

上記の例では、add()を次のように呼び出すと次のようになります。

A objA = new A();
objA.setParameters(1,2); //since it is instance method, call it using object
objA.add(); // returns 3 

B objB = new B();
objB.setParameters(3,2);
objB.add(); // returns 5

//calling static method
// since it is a class level method, you can call it using class itself
A.returnSum(4,6); //returns 10

class B{
    int s=8;
    int t = 8;
    public addition(int s,int t){
       A.returnSum(s,t);//returns 16
    }
}

最初のクラスでは、add()は特定のオブジェクトによって渡されたデータの合計を返します。ただし、静的メソッドを使用して、特定のインスタンスまたはオブジェクトの場合、独立していない任意のクラスから合計を取得できます。したがって、動作するために引数のみを必要とするジェネリックメソッドの場合、すべてをDRYに保つために静的にすることができます。


0

インスタンスメソッドと静的メソッド

  1. インスタンスメソッドは、インスタンスメソッドとインスタンス変数に直接アクセスできます。

  2. インスタンスメソッドは、静的変数と静的メソッドに直接アクセスできます。

  3. 静的メソッドは、静的変数と静的メソッドに直接アクセスできます。

  4. 静的メソッドは、インスタンスメソッドとインスタンス変数に直接アクセスできません。オブジェクトへの参照を使用する必要があります。また、静的メソッドは、「this」が参照するインスタンスがないため、このキーワードを使用できません。


-2

関数の前に配置された静的修飾子は、その関数のコピーが1つだけ存在することを意味します。静的修飾子が関数の前に配置されていない場合、そのクラスのすべてのオブジェクトまたはインスタンスで、その関数の新しいコピーが作成されます。:)変数の場合も同じです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.