Unterschied zwischen statischen Methoden und Instanzmethoden

87

Ich habe gerade den Text gelesen, der mir in meinem Lehrbuch gegeben wurde, und ich bin mir nicht sicher, ob ich verstehe, was er sagt. Es sagt mir im Grunde, dass statische Methoden oder Klassenmethoden das Schlüsselwort "modifier" static enthalten. Aber ich weiß nicht wirklich was das bedeutet?

Könnte mir bitte jemand in wirklich einfachen Worten erklären, was statische oder Klassenmethoden sind?

Könnte ich auch eine einfache Erklärung zu den Instanzmethoden erhalten?

Das geben sie mir im Lehrbuch:

Das Vorhandensein oder Fehlen des statischen Modifikators hat wichtige praktische Auswirkungen. Eine öffentliche Klassenmethode kann aufgerufen und ausgeführt werden, sobald Java die Definition der Klasse verarbeitet, zu der sie gehört. Dies ist bei einer Instanzmethode nicht der Fall. Bevor eine öffentliche Instanzmethode aufgerufen und ausgeführt werden kann, muss eine Instanz der Klasse erstellt werden, zu der sie gehört. Um eine öffentliche Klassenmethode zu verwenden, benötigen Sie nur die Klasse. Bevor Sie jedoch eine öffentliche Instanzmethode verwenden können, müssen Sie über eine Instanz der Klasse verfügen.

Die Art und Weise, wie eine statische Methode innerhalb der Definition einer anderen Methode aufgerufen wird, hängt davon ab, ob die beiden Methoden zur selben Klasse gehören oder nicht. Im obigen Beispiel sind Fakultät und Haupt beide Methoden der MainClass-Klasse. Infolgedessen verweist der Aufruf von Fakultät in der Definition von main einfach auf den Methodennamen "Fakultät".

Panthy
quelle

Antworten:

160

Das grundlegende Paradigma in Java ist, dass Sie Klassen schreiben und dass diese Klassen instanziiert werden. Instanziierten Objekten (einer Instanz einer Klasse) sind Attribute zugeordnet (Mitgliedsvariablen), die sich auf ihr Verhalten auswirken. Wenn die Methode der Instanz ausgeführt wird, verweist sie auf diese Variablen.

Alle Objekte eines bestimmten Typs können jedoch ein Verhalten aufweisen, das überhaupt nicht von Elementvariablen abhängig ist. Diese Methoden werden am besten statisch gemacht. Da es statisch ist, ist keine Instanz der Klasse erforderlich, um die Methode auszuführen.

Sie können dies tun, um eine statische Methode auszuführen:

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

Um eine nicht statische Methode auszuführen, müssen Sie jedoch Folgendes tun:

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

Auf einer tieferen Ebene enthält der Compiler, wenn er eine Klasse zusammenstellt, mehrere Zeiger auf Methoden. Wenn diese Methoden ausgeführt werden, folgt sie den Zeigern und führt den Code am anderen Ende aus. Wenn eine Klasse instanziiert wird, enthält das erstellte Objekt einen Zeiger auf die "virtuelle Methodentabelle", der auf die Methoden verweist, die für diese bestimmte Klasse in der Vererbungshierarchie aufgerufen werden sollen. Wenn die Methode jedoch statisch ist, wird keine "virtuelle Methodentabelle" benötigt: Alle Aufrufe dieser Methode werden an genau dieselbe Stelle im Speicher verschoben, um genau denselben Code auszuführen. Aus diesem Grund ist es in Hochleistungssystemen besser, eine statische Methode zu verwenden, wenn Sie nicht auf Instanzvariablen angewiesen sind.

Nathaniel Ford
quelle
2
Vielen Dank für die Codebeispiele, die ihnen bekannt vorkommen, damit ich sie jetzt verstehe
Panthy
4
@Rohan Eine andere gute Sichtweise ist, dass alles static(eine Klasse, eine Methode oder ein Feld) nicht wirklich zu irgendetwas gehört, sondern nur aus organisatorischen Gründen in der Klasse hängt.
Gobernador
1
Darüber hinaus werden statische Felder als Datenobjekte verwendet (eines, das die Daten enthält und sich daher nicht ändern kann, aber Sie können Daten darin bearbeiten.). Statische Methoden können nur für statische Felder aufgerufen werden und enthalten fortan den gleichen Begriff, konstant zu bleiben oder sich nicht zu ändern oder nicht instanziieren !!
user2416728
1
@ user2416728 Dein Kommentar ist sehr verwirrt. Statische Felder können geändert werden, ihr Gültigkeitsbereich ist jedoch global für die Ausführungsumgebung. Daher hat jeder Code, der Zugriff auf dieses Feld hat, Zugriff auf dieselben Daten. Dies ist nicht gleichbedeutend damit, dass die Daten konstant bleiben (es sei denn, ein "endgültiger" Modifikator wird verwendet).
Nathaniel Ford
2
ja, "nicht ändern" >> ich meinte kann nicht instanziiert werden !!
user2416728
18

Methoden und Variablen, die nicht als statisch deklariert sind, werden als Instanzmethoden und Instanzvariablen bezeichnet. Um auf Instanzmethoden und -variablen zu verweisen, müssen Sie zuerst die Klasse instanziieren. Dies bedeutet, dass Sie zuerst ein Objekt dieser Klasse erstellen müssen. Für statische Aufladung müssen Sie die Klasse nicht instanziieren. Sie können mit dem Punkt auf die Methoden und Variablen mit dem Klassennamen zugreifen welches ist in (.)

beispielsweise:

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

Für nicht statische Methoden müssen Sie die Klasse instanziieren.

Person person1 = new Person();   //instantiating
person1.nonStaticMethod();       //accessing non-static method.
Khalid Ahmed Khichi
quelle
8

Statische Methoden, Variablen gehören zur gesamten Klasse, nicht nur zu einer Objektinstanz. Eine statische Methode, Variable, ist der Klasse als Ganzes zugeordnet und nicht bestimmten Instanzen einer Klasse. Jedes Objekt teilt eine gemeinsame Kopie der statischen Methoden und Variablen. Es gibt nur eine Kopie pro Klasse, unabhängig davon, wie viele Objekte daraus erstellt werden.

Paulius Matulionis
quelle
7

Unterschied zwischen statischen Methoden und Instanzmethoden

  1. Instanzmethoden sind Methoden, bei denen ein Objekt seiner Klasse erstellt werden muss, bevor es aufgerufen werden kann. Statische Methoden sind die Methoden in Java, die aufgerufen werden können, ohne ein Klassenobjekt zu erstellen.

  2. Die statische Methode wird mit dem Schlüsselwort static deklariert. Die Instanzmethode enthält kein statisches Schlüsselwort.

  3. Statische Methode bedeutet, dass sie als einzelne Kopie für eine Klasse vorhanden ist. Instanzmethoden existieren jedoch als mehrere Kopien, abhängig von der Anzahl der für diese Klasse erstellten Instanzen.

  4. Statische Methoden können mithilfe der Klassenreferenz aufgerufen werden. Instanz- oder nicht statische Methoden werden mithilfe der Objektreferenz aufgerufen.

  5. Statische Methoden können nicht direkt auf Instanzmethoden und Instanzvariablen zugreifen. Die Instanzmethode kann direkt auf statische Variablen und statische Methoden zugreifen.

Referenz: geeksforgeeks

Hautausschläge
quelle
4

Instanzmethoden => auf bestimmte Instanz einer bestimmten Klasse aufgerufen. Die Methode möchte wissen, für welche Klasse sie aufgerufen wurde. So wie es passiert, gibt es einen unsichtbaren Parameter namens 'this'. Innerhalb von 'this' haben wir Mitglieder der Instanzklasse, die bereits mit Werten festgelegt wurden. 'Dies' ist keine Variable. Es ist ein Wert, den Sie nicht ändern können, und der Wert bezieht sich auf den Empfänger des Anrufs. Beispiel: Sie rufen Reparaturpersonal an (Instanzmethode), um Ihr Fernsehgerät (aktuelles Programm) zu reparieren. Er kommt mit Werkzeugen ('dieser' Parameter). Er wird mit speziellen Werkzeugen geliefert, die zum Reparieren des Fernsehgeräts benötigt werden, und er kann auch andere Dinge reparieren.

In statischen Methoden => gibt es kein "dies". Beispiel: Der gleiche Mechaniker (statische Methode). Wenn Sie ihn anrufen, müssen Sie angeben, welchen Mechaniker Sie anrufen möchten (z. B. Elektriker). Und er wird kommen und nur Ihren Fernseher reparieren. Aber er hat keine Werkzeuge, um andere Dinge zu reparieren (es gibt keinen 'this'-Parameter).

Statische Methoden sind normalerweise nützlich für Operationen, die keine Daten von einer Instanz der Klasse (von 'this') erfordern und ihren beabsichtigten Zweck ausschließlich mit ihren Argumenten erfüllen können.

Eldiyar Talantbek
quelle
2

Das Verhalten eines Objekts hängt von den Variablen und Methoden dieser Klasse ab. Wenn wir eine Klasse erstellen, erstellen wir ein Objekt dafür. Für statische Methoden benötigen wir sie nicht, da statische Methoden bedeuten, dass alle Objekte dieselbe Kopie haben, sodass kein Objekt erforderlich ist. z.B:

Myclass.get();

In der Instanzmethode hat jedes Objekt ein anderes Verhalten, sodass die Methode mithilfe der Objektinstanz aufgerufen werden muss. z.B:

Myclass x = new Myclass();
x.get();
Vishal Patil
quelle
1

Wenn der Status einer Methode nicht geändert werden soll oder keine Instanzvariablen verwendet werden.

Sie möchten die Methode ohne Instanz aufrufen.

Wenn es nur mit Argumenten funktioniert, die ihm zur Verfügung gestellt wurden.

Dienstprogrammfunktionen sind ein gutes Beispiel für statische Methoden. dh math.pow (), diese Funktion wird den Status für verschiedene Werte nicht ändern. Es ist also statisch.

suketup
quelle
1

Kurz gesagt, statische Methoden und statische Variablen sind Klassenebene, wobei Instanzmethoden und Instanzvariablen Instanz- oder Objektebene sind.

Dies bedeutet, dass jedes Objekt, wenn eine Instanz oder ein Objekt (unter Verwendung von new ClassName ()) erstellt wird, eine eigene Kopie der Instace-Variablen behält. Wenn Sie fünf verschiedene Objekte derselben Klasse haben, haben Sie fünf verschiedene Kopien der Instanzvariablen. Die statischen Variablen und Methoden sind jedoch für alle fünf Objekte gleich. Wenn Sie etwas Gemeinsames benötigen, das von jedem erstellten Objekt verwendet werden soll, machen Sie es statisch. Wenn Sie eine Methode benötigen, für deren Funktion keine objektspezifischen Daten erforderlich sind, machen Sie sie statisch. Die statische Methode funktioniert nur mit statischen Variablen oder gibt Daten auf der Grundlage übergebener Argumente zurück.

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

Wenn Sie im obigen Beispiel add () aufrufen als:

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

In der ersten Klasse gibt add () die Summe der von einem bestimmten Objekt übergebenen Daten zurück. Die statische Methode kann jedoch verwendet werden, um die Summe von jeder Klasse zu erhalten, die nicht unabhängig von einer bestimmten Instanz oder einem bestimmten Objekt ist. Daher können generische Methoden, für deren Funktion nur Argumente erforderlich sind, statisch gemacht werden, um alles trocken zu halten.

Prakash
quelle
0

Instanzmethode vs statische Methode

  1. Die Instanzmethode kann direkt auf die Instanzmethoden und Instanzvariablen zugreifen.

  2. Die Instanzmethode kann direkt auf statische Variablen und statische Methoden zugreifen.

  3. Statische Methoden können direkt auf die statischen Variablen und statischen Methoden zugreifen.

  4. Statische Methoden können nicht direkt auf Instanzmethoden und Instanzvariablen zugreifen. Sie müssen einen Verweis auf ein Objekt verwenden. Die statische Methode kann dieses Schlüsselwort nicht verwenden, da es keine Instanz gibt, auf die sich 'this' beziehen kann.

param
quelle
-2

Der statische Modifikator vor einer Funktion impliziert, dass nur eine Kopie dieser Funktion vorhanden ist. Wenn der statische Modifikator nicht vor der Funktion platziert wird, wird mit jedem Objekt oder jeder Instanz dieser Klasse eine neue Kopie dieser Funktion erstellt. :) Gleiches gilt für Variablen.

Prakhar Mohan Srivastava
quelle