web-dev-qa-db-ja.com

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

私は教科書で与えられたテキストを読んでいただけで、それが何を言っているのか理解していないのです。基本的に、静的メソッドまたはクラスメソッドに「modifier」キーワードstaticが含まれていることを教えてくれます。しかし、私はそれがどういう意味か本当に知りませんか?

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

また、インスタンスメソッドとは何かについて簡単な説明を得ることができますか?

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

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

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

75
Panthy

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

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

133
Nathaniel Ford

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

例:

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

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

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

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

7

インスタンスメソッド =>特定のクラスの特定のインスタンスで呼び出されます。メソッドは、どのクラスで呼び出されたかを知りたい。それが起こる方法は、「this」と呼ばれる目に見えないパラメーターです。 「this」の内部には、インスタンスクラスのメンバーが既に値で設定されています。 「これ」は変数ではありません。これは値であり、変更することはできず、値は呼び出しの受信者への参照です。 例: repairmen(instance method)を呼び出して、TV(実際のプログラム)を修正します。彼にはツール(「this」パラメーター)が付属しています。彼はテレビを修正するために必要な特定のツールを備えており、他のことも修正できます。

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

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

4

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

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

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

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

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

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

リファレンス: geeksforgeeks

4
rashedcs

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

Myclass.get();

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

Myclass x = new Myclass();
x.get();
2
Vishal Patil

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

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

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

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

1
suketup

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

これは、インスタンスまたはオブジェクト(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を維持するために静的にできます。

1
Prakash

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

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

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

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

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

0
param