2014-07-17 12 views
5

Poiché i metodi statici possono essere richiamati direttamente dalla classe (ad esempio ClassName.methodName), perché è necessario chiamare un metodo statico con l'oggetto della classe?Possiamo chiamare un metodo statico con un oggetto nullo in Java? Se é cosi, come?

Se qualcuno lo sa, elaborare con l'esempio.

public static void methodA(){ 

} 
+1

hai provato ancora ??? –

+1

Hai provato '((YourClass) null) .methodA()'? – Kayaman

+3

"... quindi perché è necessario chiamare il metodo statico con oggetto ..." - è ** non ** richiesto. –

risposta

11

Il codice seguente contiene un esempio, in cui un metodo statico viene chiamato tramite un riferimento null.

public class Test { 
    public static void main(String... args) { 
     Test test = null; 
     test.greeting(); // call with null reference 
    } 
    public static void greeting() { 
     System.out.println("Hello World"); 
    } 
} 

Poiché Test::greeting è un metodo statico, l'espressione test.greeting() è identico a Test.greeting(). Per questo motivo, non è stato generato lo NullPointerException in fase di runtime.

+0

signore, potrebbe spiegare perché NPE non sta lanciando? – LMK

+1

@LMK In allegato il motivo completo nel mio post che è spiegato nelle specifiche. Per favore guarda. –

+0

Questo è abbastanza autoesplicativo. La chiamata al saluto non sta utilizzando l'istanza (che è null), quindi non si verifica alcuna NPE. – JamesB

8

Non è necessaria un'istanza durante il richiamo di membro o metodo statici.

Poiché i membri statici appartengono alla classe anziché all'istanza.

Example 15.11.1-2. Receiver Variable Is Irrelevant For static Field Access

Il seguente programma illustra che riferimento null può essere utilizzato per accedere ad una variabile di classe (statica) senza causare un'eccezione:

L'esempio spec esso auto.

class Test3 { 
    static String mountain = "Chocorua"; 
    static Test3 favorite(){ 
     System.out.print("Mount "); 
     return null; 
    } 
    public static void main(String[] args) { 
     System.out.println(favorite().mountain); 
    } 
} 

E l'analisi del perché sta accadendo

Anche se il risultato del preferito() è nullo, un NullPointerException non viene generata. Quel "Monte" è stampato dimostra che l'espressione primaria è in effetti pienamente valutata in fase di esecuzione, nonostante il fatto che solo il suo tipo, non il suo valore, è usato per determinare quale campo accedere (perché la montagna del campo è statica).

+2

+1 per una grande spiegazione !!! –

+0

String s = null; System.out.println ("" + s.trim()); getta NPE perché? – LMK

+1

@LMK 'trim()' non è un metodo statico qui :) ha bisogno di un'istanza specifica per eseguire l'operazione di assetto. –

0

Sì, e questa è una situazione strana. Di seguito è riportato l'esempio.

public class Test{ 
    public static String foo(){ 
    System.out.println("foo"); 
    return ""; 
    } 

    public static void main(String args[]){ 
      Test t=null; 
      t.foo();//no error will be thrown 
    } 
} 

uscita: foo

Spiegazione: si prevede questa dovrebbe gettare un'eccezione di puntatore nullo, ma appena ti dà un avvertimento che "Il metodo foo statico() dal tipo di test dovrebbe essere accessibile in un modo statico ". Ma quando l'esecuzione funzionerà.

2

Molto bene è possibile chiamare un metodo statico con oggetto nullo.

Vedere l'esempio di seguito.

public class Hashing { 

    public static void Hash() { 
     System.out.println("hello"); 
    } 

    public static void main(String[] args) { 
     Hashing h = null; 
     h.Hash(); 
    } 
} 

Sopra frammento di codice stamperà ciao

Perché al momento della compilazione h.hash() verrà convertito in Hashing.hash() poiché hash() è un metodo statico.

Quando ho deselezionato il file .class ho ottenuto questo codice.

/* 
* Decompiled with CFR 0_114. 
*/ 
import java.io.PrintStream; 

public class Hashing { 
    public static void Hash() { 
     System.out.println("hello"); 
    } 

    public static void main(String[] args) { 
     Object h = null; 
     Hashing.Hash(); 
    } 
} 

Come si può vedere nel frammento sopra h.Hash(); viene convertito in Hashing.Hash();

HTH !!

Problemi correlati