2010-10-11 15 views
52

Siehe Code-Schnipsel unten:Was ist der Unterschied zwischen einer statischen Methode und einer nicht statischen Methode?

-Code 1

public class A { 
    static int add(int i, int j) { 
     return(i + j); 
    } 
} 

public class B extends A { 
    public static void main(String args[]) { 
     short s = 9; 
     System.out.println(add(s, 6)); 
    } 
} 

-Code 2

public class A { 
    int add(int i, int j) { 
     return(i + j); 
    } 
} 

public class B extends A { 
    public static void main(String args[]) { 
    A a = new A(); 
     short s = 9; 
     System.out.println(a.add(s, 6)); 
    } 
} 

Was ist der Unterschied zwischen diesem Code-Schnipsel? Beide geben 15 als Antwort aus.

Antwort

114

Eine statische Methode gehört die Klasse selbst und eine nicht-statische (auch bekannt als Beispiel) Verfahren auf jedes Objekt gehört, die aus dieser Klasse erzeugt wird. Wenn Ihre Methode etwas tut, das nicht von den individuellen Eigenschaften ihrer Klasse abhängt, machen Sie sie statisch (dadurch wird der Footprint des Programms kleiner). Andernfalls sollte es nicht statisch sein.

Beispiel:

class Foo { 
    int i; 

    public Foo(int i) { 
     this.i = i; 
    } 

    public static String method1() { 
     return "An example string that doesn't depend on i (an instance variable)"; 
    } 

    public int method2() { 
     return this.i + 1; // Depends on i 
    } 
} 

Sie können wie diese statische Methoden aufrufen: Foo.method1(). Wenn Sie das mit Methode 2 versuchen, wird es fehlschlagen.Aber das funktioniert: Foo bar = new Foo(1); bar.method2();

+0

Beeinflusst Access specifier (public) den Zugriff auf statische Methoden? Wie wird geschehen, wenn Ihr Methodenname statische Zeichenfolge method1() sein wird? –

+0

Wäre es auch möglich, diese statische Methode in eine UtililyClass zu übertragen? – karlihnos

7

Eine statische Methode gehört zur Klasse und eine nicht-statische Methode gehört zu einem Objekt einer Klasse. Das heißt, eine nicht statische Methode kann nur für ein Objekt einer Klasse aufgerufen werden, die es gehört. Eine statische Methode kann aber sowohl in der Klasse als auch als Objekt der Klasse genannt werden. Eine statische Methode kann nur auf statische Mitglieder zugreifen. Eine nicht statische Methode kann auf statische und nicht statische Member zugreifen, da zu der Zeit, als die statische Methode aufgerufen wird, die Klasse möglicherweise nicht instanziiert wird (wenn es die Klasse aufgerufen wird). Im anderen Fall kann eine nicht statische Methode nur aufgerufen werden, wenn die Klasse bereits instanziiert wurde. Eine statische Methode wird von allen Instanzen der Klasse gemeinsam genutzt. Dies sind einige der grundlegenden Unterschiede. Ich würde auch gerne in diesem Zusammenhang einen oft ignorierten Unterschied hinweisen. Wenn eine Methode in C++/Java/C# aufgerufen wird, ist ein implizites Argument (die 'diese' Referenz) zusammen mit/ohne die anderen Parameter übergeben. Im Falle einer statischen Methode Aufruf, die 'diese' Referenz ist nicht übergeben als statische Methoden gehören zu einer Klasse und haben daher nicht die 'this' Referenz.

Referenz: Static Vs Non-Static methods

1

Grund Unterschied ist nicht statisch Mitglieder aus erklärt werden mit dem Stichwort ‚static‘

Alle statischen Elemente (beide Variablen und Methoden) werden mit Hilfe von Klassennamen bezeichnet. Daher werden die statischen Mitglieder der Klasse auch als Klassenreferenzmitglieder oder Klassenmitglieder bezeichnet.

Um auf die nicht statischen Mitglieder einer Klasse zugreifen zu können, sollten wir eine Referenzvariable erstellen. Referenzvariable speichert ein Objekt ..

+0

Für weitere Informationen können Sie die folgenden Links lesen: http://stackoverflow.com/questions/1184701/static-vs-nnon-static-method http://stackoverflow.com/questions/1353309/java-static- vs-non-static-inner-class http://stackoverflow.com/questions/70324/java-inner-class-and-static-nested-class http://stackoverflow.com/questions/5241899/what- is-the-difference-zwischen-static-methods-in-non-static-class-and-static-m – Aamer

3

Eine statische Methode gehört zur Klasse und eine nicht statische Methode gehört zu einem Objekt einer Klasse. Ich gebe ein Beispiel, wie es Unterschiede zwischen den Ausgängen schafft.

public class DifferenceBetweenStaticAndNonStatic { 

    static int count = 0; 
    private int count1 = 0; 

    public DifferenceBetweenStaticAndNonStatic(){ 
    count1 = count1+1; 
    } 

    public int getCount1() { 
    return count1; 
    } 

    public void setCount1(int count1) { 
    this.count1 = count1; 
    } 

    public static int countStaticPosition() { 
    count = count+1; 
    return count; 
    /* 
    * one can not use non static variables in static method.so if we will 
    * return count1 it will give compilation error. return count1; 
    */ 
    } 
} 

public class StaticNonStaticCheck { 

    public static void main(String[] args){ 
    for(int i=0;i<4;i++) { 
     DifferenceBetweenStaticAndNonStatic p =new DifferenceBetweenStaticAndNonStatic(); 
     System.out.println("static count position is " +DifferenceBetweenStaticAndNonStatic.count); 
     System.out.println("static count position is " +p.getCount1()); 
     System.out.println("static count position is " +DifferenceBetweenStaticAndNonStatic.countStaticPosition()); 

     System.out.println("next case: "); 
     System.out.println(" "); 

    } 
} 

}

Jetzt wird ausgegeben :::

static count position is 0 
static count position is 1 
static count position is 1 
next case: 

static count position is 1 
static count position is 1 
static count position is 2 
next case: 

static count position is 2 
static count position is 1 
static count position is 3 
next case: 
22

Statische Methoden sind nützlich, wenn Sie nur eine Instanz (Situation Umstand), wohin du gehst, die Methode verwenden und Sie benötigen keine Mehrfachkopien (Objekte). Wenn Sie beispielsweise eine Methode schreiben, die sich auf nur einer Website anmeldet, die Wetterdaten herunterlädt und dann die Werte zurückgibt, könnten Sie sie als statisch schreiben, da Sie alle erforderlichen Daten innerhalb der Methode fest codieren können Du wirst nicht mehrere Instanzen oder Kopien haben. Anschließend können Sie die Methode statisch ein mit Zugriff auf die folgenden Möglichkeiten:

MyClass.myMethod(); 
this.myMethod(); 
myMethod(); 

Nicht-statische Methoden verwendet werden, wenn Sie vorhaben, Ihre Methode zu verwenden, um mehrere Kopien zu erstellen. Wenn Sie beispielsweise die Wetterdaten von Boston, Miami und Los Angeles herunterladen möchten und dies von Ihrer Methode aus tun können, ohne den Code für jeden einzelnen Standort individuell anpassen zu müssen, greifen Sie auf die Methode nicht statisch zu :

MyClass boston = new MyClassConstructor(); 
boston.myMethod("bostonURL"); 

MyClass miami = new MyClassConstructor(); 
miami.myMethod("miamiURL"); 

MyClass losAngeles = new MyClassConstructor(); 
losAngeles.myMethod("losAngelesURL"); 

In dem obigen Beispiel erzeugt Java drei separate Objekte und Speicherstellen aus der gleichen Methode, die Sie mit dem „boston“ einzeln zugreifen können, „Miami“ oder „losangeles“ Referenz. Sie können statisch auf keines der oben genannten Objekte zugreifen, da MyClass.myMethod(); ist ein generischer Verweis auf die Methode, nicht auf die einzelnen Objekte, die die nicht statische Referenz erstellt hat.

Wenn Sie in eine Situation geraten, in der die Art und Weise, wie Sie auf jeden Ort zugreifen, oder die Art, wie die Daten zurückgegeben werden, so unterschiedlich ist, dass Sie keine Einheitsgröße schreiben können, ohne durch viele Ringe zu springen Sie können Ihr Ziel besser erreichen, indem Sie drei separate statische Methoden schreiben, eine für jeden Standort.

5

Nun, technisch gesehen ist der Unterschied zwischen einer statischen Methode und einer virtuellen Methode die Art, wie sie miteinander verknüpft sind.

Eine traditionelle "statische" Methode wie in den meisten anderen OO-Sprachen wird zur Kompilierzeit "statisch" mit ihrer Implementierung verknüpft/verdrahtet. Das heißt, wenn Sie die Methode Y() in Programm A aufrufen und Ihr Programm A mit der Bibliothek X verknüpfen, die Y() implementiert, ist die Adresse von X.Y() fest mit A codiert, und Sie können das nicht ändern.

In OO-Sprachen wie JAVA werden "virtuelle" Methoden zur Laufzeit "spät" aufgelöst, und Sie müssen eine Instanz einer Klasse bereitstellen. Also, in Programm A, um die virtuelle Methode Y() aufzurufen, müssen Sie eine Instanz bereitstellen, zum Beispiel B.Y(). Zur Laufzeit jedes Mal, wenn A B anruft.Y() Die aufgerufene Implementierung hängt von der verwendeten Instanz ab, also B.Y(), C.Y() etc ... könnten alle möglichen Implementierungen von Y() zur Laufzeit bereitstellen.

Warum brauchen Sie das jemals? Auf diese Weise können Sie Ihren Code von den Abhängigkeiten entkoppeln. Beispiel: Programm A macht "draw()". Mit einer statischen Sprache, das ist es, aber mit OO werden Sie B.Draw() und die tatsächliche Zeichnung hängt von der Art des Objekts B ab, das zur Laufzeit in einen quadratischen Kreis usw. umwandeln kann. Auf diese Weise kann Ihr Code zeichnen Sie mehrere Dinge ohne Notwendigkeit zu ändern, auch wenn neue Arten von B zur Verfügung gestellt werden, nachdem der Code geschrieben wurde. Nifty -

8

Allgemeinen

statisch: keine Notwendigkeit Objekt erstellen wir direkt anrufen können

ClassName.methodname() 

Nicht Static mit: wir ein Objekt wie

ClassName obj=new ClassName() 
obj.methodname(); 
2
erstellen müssen

Wenn Ihre Methode mit den Eigenschaften des Objekts zusammenhängt, sollten Sie sie definieren als nicht statische Methode. Andernfalls können Sie Ihre Methode als statisch definieren und sie unabhängig vom Objekt verwenden.

1

Ein anderes Szenario für die statische Methode.

Ja, statische Methode gehört zur Klasse nicht des Objekts. Und wenn Sie nicht möchten, dass jemand das Objekt der Klasse initialisiert oder Sie nicht mehr als ein Objekt wollen, müssen Sie Private Konstruktor und so die statische Methode verwenden.

Hier haben wir privaten Konstruktor und mit statischen Methode erstellen wir ein Objekt.

Ex ::

public class Demo { 

     private static Demo obj = null;   
     private Demo() { 
     } 

     public static Demo createObj() { 

      if(obj == null) { 
       obj = new Demo(); 
      } 
      return obj; 
     } 
} 

Demo obj1 = Demo.createObj();

Hier wird nur 1 Instanz gleichzeitig aktiv sein.

-1

„Manchmal wollen Sie Variablen haben, die auf alle Objekte gemeinsam ist, ist dies mit dem statischen Modifikator erreicht

dh Klasse Mensch -.. Anzahl der Köpfe (1) statisch ist, für alle Menschen, jedoch ist die menschliche Haarfarbe für jeden Menschen variabel.

Beachten Sie, dass statische Vars können auch Informationen zu teilen in allen Fällen verwendet werden,

1

Statische Methode Beispiel

class StaticDemo 
{ 
public static void copyArg(String str1, String str2) 
{ 
    str2 = str1; 
    System.out.println("First String arg is: "+str1); 
    System.out.println("Second String arg is: "+str2); 
} 
public static void main(String agrs[]) 
{ 
    //StaticDemo.copyArg("XYZ", "ABC"); 
    copyArg("XYZ", "ABC"); 
} 
} 

Ausgang:

Erster String arg ist: XYZ

Zweiter String arg ist: XYZ

Wie Sie im obigen Beispiel sehen können, habe ich für den Aufruf der statischen Methode nicht einmal ein Objekt verwendet. Es kann direkt in einem Programm oder unter Verwendung des Klassennamens aufgerufen werden.

Nicht statische Methode Beispiel

class Test 
{ 
public void display() 
{ 
    System.out.println("I'm non-static method"); 
} 
public static void main(String agrs[]) 
{ 
    Test obj=new Test(); 
    obj.display(); 
} 
} 

Ausgang:

Ich bin nicht-statische Methode

Eine nicht-statische Methode wird immer unter Verwendung des Objekts der Klasse aufgerufen werden wie im obigen Beispiel gezeigt.

Die wichtigsten Punkte:

Wie statische Methoden aufrufen: direkt oder mit dem Klassennamen:

StaticDemo.copyArg (s1, s2); ODER copyArg (s1, s2);

Wie eine nicht-statische Methode aufzurufen: mit Objekt der Klasse:

-Test obj = new Test();

1

Einfach gesagt, aus der Sicht des Benutzers verwendet eine statische Methode entweder überhaupt keine Variablen oder alle Variablen, die sie verwendet, sind lokal zur Methode oder sie sind statische Felder. Das Definieren einer Methode als statisch bietet einen geringen Leistungsvorteil.

Verwandte Themen