Domanda

Netbeans mi dice che è male accedere a un metodo statico da un metodo non statico. Perché è così male? " Accesso al metodo statico getInstance " è l'avvertimento:

import java.util.Calendar;

public class Clock
{
    // Instance fields
    private Calendar time;

    /**
     * Constructor. Starts the clock at the current operating system time
     */
    public Clock()
    {
        System.out.println(getSystemTime());
    }

    private String getSystemTime()
    {
        return this.time.getInstance().get(Calendar.HOUR)+":"+
                this.time.getInstance().get(Calendar.MINUTE);
   }

}

È stato utile?

Soluzione

Probabilmente stai accedendo al metodo statico da un'istanza anziché direttamente. Prova invece a utilizzare Calendar.getInstance () :

private String getSystemTime()
{
    return Calendar.getInstance().get(Calendar.HOUR)+":"+
           Calendar.getInstance().get(Calendar.MINUTE);
}

Altri suggerimenti

Cosa intendi con "restituire un metodo statico"? A mio avviso, va bene chiamare un metodo statico da un metodo di istanza, ovviamente a seconda delle circostanze. Potresti pubblicare del codice di cui si lamenta Netbeans?

Una cosa che potrei immaginare è se usi solo metodi statici da un metodo di istanza, senza usare nessuno dei dati dell'istanza. A volte è ciò che è necessario per implementare un'interfaccia o sovrascrivere un metodo da una classe base, ma se non si esegue l'override di nulla e non si utilizzano variabili di istanza, è utile rendere statico il metodo per dimostrare che in realtà non lo fa dipende da un'istanza particolare.

EDIT: con la domanda modificata, questo ha molto senso. L'IMO è una carenza di Java che lo consente in primo luogo. Può rendere il codice molto fuorviante. Il mio esempio preferito (il che significa che i vecchi potrebbero avermi visto postarlo prima :) è con Thread.sleep . Che aspetto ha come questo codice?

Thread t = new Thread(someRunnable);
t.start();
t.sleep(1000);

A mio avviso, sembra che al nuovo thread venga chiesto di dormire, in modo simile a una chiamata a sospendi . Ma no - puoi solo chiedere al thread attualmente in esecuzione di dormire, motivo per cui Thread.sleep è un metodo statico. Il codice sopra è Java legale e farà dormire il thread attualmente in esecuzione per un secondo mentre il thread appena creato (probabilmente) viene eseguito ... non è affatto come appare il codice a prima vista.

L'ordine è invertito? In tal caso, ha senso che non è possibile accedere a un metodo non statico da un metodo statico. In caso contrario, vorrei sapere perché anche questo è negativo!

Non è possibile fare riferimento a un metodo non statico da un contesto statico. I metodi statici possono essere referenziati da un contesto non statico.

È un errore o un avviso Netbeans? Puoi pubblicare il codice che lo sta causando?

È giusto chiamare time.getInstance () . Il compilatore esaminerà il tipo della variabile, Calendar in questo caso, e chiamerà lì il metodo. Finisce per essere compilato esattamente come Calendar.getInstance () . Si noti che il valore effettivo di time non contribuisce a questo, vale a dire può anche essere null e non importa.

È questa indiretta e differenza rispetto ai metodi normali che è disapprovata. È meglio esprimerlo direttamente come Calendar.getInstance () .

perché non spiegare semplicemente:

se chiami metodo non statico, 1) crei una nuova istanza con a = new Class (); 2) quindi chiama il metodo a.method;

se chiami metodo statico: 1) lo chiami Class.method;

Puoi farlo con il metodo statico solo perché è indipendente all'interno della sua classe e ha tutto il necessario per chiamare. Se dipende da altre informazioni (come costruttore) che non si dichiarano statiche, fallirà.

In Java tutte le variabili dei membri statici verranno prima caricate in memoria,   quindi verranno caricati tutti i membri statici,   dopo che le variabili non statiche e le funzioni membro verranno caricate in memoria,   dopo che il blocco principale statico verrà eseguito ....... quindi stava dando l'errore che non ..............

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top