2016-04-07 2 views
1

Ich habe bin den folgenden CodeUnterschied zwischen 'Objekt obj = new Object()' und 'Objekt obj = null' in statische und nicht statische Funktion

public class Sample { 
    public static void display(){ 
     System.out.println("Hai Sample"); 
    } 
    public void displays(){ 
     System.out.println("Hai Sample"); 
    } 
} 

public class Sample2 { 
    public static void main(String[] args) { 
     Sample obj=null; 
     obj.display(); 
     obj.displays(); 
     } 
} 

Hier Wenn wir null verwenden zuweisen obj zur Probe Ich kann nur auf statische Methode zugreifen. Wenn ich einen neuen Operator wie Sample obj= new Sample(); verwende, kann ich sowohl auf statische als auch auf nicht statische Methode zugreifen.

Hier meine Frage, wie Objektinitialisierung geschieht hier und wie null Beispielobjekt statische Methoden bezieht und warum nicht nicht statische Methode

Antwort

1

Der Unterschied besteht darin, dass in einem Fall (new Sample()), eine Instanz haben. Im zweiten Fall (null), Sie nicht.

display ist eine statische Methode (bezogen auf die Klasse, keine Instanz); displays ist eine Instanz Methode (bezogen auf eine bestimmte Instanz). Es ist eine Eigenart der Java-Syntax, die Sie auf static Felder und Methoden durch etwas verweisen können, dass aussieht wie eine Instanz Referenz. Da die Instanz nicht tatsächlich verwendet wird, wird sie nicht dereferenziert, und so macht die Tatsache, dass sie null ist, keinen Ärger.

Ihr Code in main ist tatsächlich dies:

public static void main(String[] args) { 
    Sample obj=null; 
    Sample.display(); // `display` is static, no instance is used 
    obj.displays(); // `displays` is non-static, requires an instance 
} 

Wenn Sie scheinen display durch obj zu nennen, in der Tat alle der Compiler die obj Variable verwendet für sehen, was seine Art (in diesem ist Fall, Sample). Der Wert der Variablen (null oder eine Instanz, so oder so) wird überhaupt nicht verwendet, und es gibt keinen Fehler.

Im Gegensatz dazu wird displays die obj variable Aufruf sowohl für seinen Typ (Sample) und seinen Wert verwendet wird, weil, wenn die JVM displays braucht eine Referenz als this für den Anruf zu verwenden, ruft. Der Versuch, eine Instanzmethode mit einer null Referenz aufzurufen, ist ein Fehler.

1

Im Gegensatz zu einem Instanzmember benötigen Sie keine tatsächliche Instanz der Klasse, um auf ein static-Member zuzugreifen.

Also, wo Sie tun:

obj.display(); 

dies durch die JVM gelten als:

Sample.display(); 

und wird ohne Probleme ausgeführt werden.

Ein Instanzenmitglied hängt jedoch von (und für jede Instanz) der Instanz der Klasse ab. Es existiert nicht, bis die Instanz erstellt wurde.

obj.display(); 

ist Code, den Sie nie schreiben sollte: jemanden, der Ihren Code pflegen später könnte müssen, könnte es für eine Instanz Mitglied verwechseln, und gehen davon aus, dass die Auswirkungen dieser Methode aufrufen allein auf diese Instanz begrenzt ist, die es ist nicht.

Wie für die Schrauben und Muttern bei der Erstellung einer neuen Instanz, überprüfen Sie die Seite zu dem Thema in der official documentation.

1

Auf statische Methoden kann über die Klasse zugegriffen werden, eine Instanziierung ist nicht erforderlich. Sie müssen jedoch eine Instanz der Klasse abrufen, um auf keine statischen Methoden zugreifen zu können.

Sollte diese Frage gelöst anzuzeigen: What does the 'static' keyword do in a class?

1

hier meine Frage: Wie Objektinitialisierung hier geschieht und wie null bezieht sich Beispiel statische Methoden

Es ist Objekt nicht! null ist null.

Sie können statische Methoden immer aufrufen, ohne ein Objekt zu erstellen.

Außerdem sollten Sie statische Methoden in einer statischen Weise nennen:

Sample.display(); 

Eine gute IDE sollte Ihnen eine Warnung/Fehler, wie Sie die Methode zugreifen:

Die statische Methode Display() von dem Typ Probe sollte in einer statischen Art und Weise

1

Wenn zugegriffen werden -

Und Sie versuchen, den Zugriff,

public void display() { 
    System.out.println("Error"); 
} 

Es wird Fehler zeigen. Es benötigt eine Instanz. Aber man kann dies nennen -

public static void display(){ 
    System.out.println("Success"); 
} 

Wie es statisch ist, ist keine Instanz erforderlich.