2012-07-26 14 views
26
class Sub { 
    static int y; 
    public static void foo() { 
     this.y = 10; 
    } 
} 

Capisco che this rappresenta l'oggetto richiamando il metodo e che i metodi statici non sono vincolati ad alcun oggetto. Ma nel caso sopra citato, anche la variabile y è statica.Perché non possiamo usare 'questo' parola chiave in un metodo statico

Se possiamo invocare il metodo statico sull'oggetto classe, perché non possiamo consentire ai metodi statici di impostare le variabili statiche della classe.

Qual è lo scopo di questo ulteriore vincolo?

+0

Mi rendo conto che questa è una domanda antica ma voglio fare +1 su un punto piuttosto valido. Sebbene per i campi la risposta sia semplice (lascia fuori il qualificatore), per le classi interne statiche diventa rilevante ed è anche rilevante quando ciò che si desidera è un riferimento all'istanza di runtime della classe stessa. Ad esempio, posso digitare "MyClass.class" per ottenere la classe singleton , ma solo la "classe" di per sé non è valida e non esiste una soluzione alternativa simile. Questo porta al nome della classe che potrebbe essere ripetuto attraverso l'unità che non è molto ASCIUTTA. –

risposta

71

Perché this si riferisce all'istanza dell'oggetto. Non esiste un'istanza dell'oggetto in una chiamata di un metodo statico. Ma ovviamente puoi accedere al tuo campo statico (solo quelli statici!). Basta usare

class Sub { 
    static int y; 
    public static void foo() { 
     y = 10; 
    } 
} 

Se si vuole fare in modo di ottenere il campo statico y e non una variabile locale con lo stesso nome, utilizzare il nome della classe per specificare:

class Sub { 
    static int y; 
    public static void foo(int y) { 
     Sub.y = y; 
    } 
} 
+0

I downvoters potrebbero aver pensato che questo non risponde alla domanda, perché hai praticamente ripetuto quello che l'OP ha già conosciuto e ha fornito solo un soluzione verbosa. Se la classe si chiama 'ThisClassHasAQuiteLongName', non sarebbe più carino riferirsi alla classe come' this' in metodi statici? – xehpuk

+0

Non è proprio vero, però, ho fornito una spiegazione del perché 'this' non può essere usato in metodi statici (perché non c'è un'istanza della classe che si chiami' this') e ha mostrato due modi per accedere ai campi. Essere in grado di usare 'this' in un contesto statico come sostituzione del nome della classe sarebbe fuorviante e incoerente (almeno imho). Grazie per il tuo feedback, tuttavia, questo potrebbe essere stato il motivo dei downvotes. – brimborium

+1

La domanda, come ho capito e che voglio anche sapere, è perché Java non sovraccarica il significato di 'this' in un contesto statico per significare la classe, quindi invece di' Sub.y' si potrebbe digitare 'questo .y'. Sembrerebbe una scelta di design ovvia, perché elimina la necessità di menzionare esplicitamente il nome della classe, che potrebbe cambiare. In generale, quando qualcuno chiede "perché x è definito come y ma non anche z in un contesto diverso" non è soddisfacente, anzi è piuttosto tossico e condiscendente da rispondere "perché è definito come y". Mi ha fatto sentire stupido per chiedermi lo stesso, come lo sono ancora. –

2

per rendere il lavoro codice di scrivere in questo modo:

class Sub { 
    static int y; 
    public static void foo() { 
     Sub.y = 10; 
    } 
} 

È possibile impostare campi statici a metodi statici, ma non hanno accesso a this nel metodo statico perché this rappresenta l'istanza corrente del oggetto, e in un metodo statico non hai istanza.

+0

vorresti spiegare qual è il problema della mia risposta o della risposta di @ Peter? – tibtof

+0

Non c'è niente di sbagliato nella risposta. Upvoted di nuovo a 0. (che ti lascia con +8 ripetizioni complessive a causa del pessimo sistema di voto-rep) ^^) – brimborium

2

Questo significa "questo" oggetto ma non ce n'è uno. Nel tuo caso puoi usare il nome della classe come suggerisce @tibtof.

5

this fa riferimento a questa istanza dell'oggetto Sub. Poiché il metodo è static, non esiste un'istanza di Sub.

0

chiave di "questo" si riferisce all'oggetto con cui si sta operando. Nel tuo caso questo all'interno di qualsiasi metodo o costruttore non statico (se ne hai uno e se usi "this" all'interno di esso), allora "this" si riferisce a quella particolare istanza della classe Sub.So è applicabile solo quando l'oggetto è stato creato. Ma qualsiasi cosa nel contesto statico di una classe, è possibile utilizzare senza nemmeno creare l'oggetto per questo come viene risolto durante il caricamento della classe. "questo" si risolve solo quando viene creato l'oggetto (puoi persino dire dinamicamente per quale oggetto). Quindi "questo" ha senso nel contesto statico. Spero che sia d'aiuto. Che Dio vi benedica.

4

Il motivo principale per cui non possiamo usare "questo" in un contesto metodo statico: -

questo: - "questo" significa classe corrente OBJECT, per cui il suo chiaro che "questo" venire solo in l'immagine una volta intendevamo creare un oggetto di quella classe.

metodo statico: - non è necessario creare un oggetto per utilizzare il metodo statico. significa "istanza" o la creazione dell'oggetto non ha senso con "statico" come da regola Java.

Quindi ci sarebbe contraddizione, se usiamo entrambi insieme (statico e questo). Questo è il motivo per cui non possiamo usare "questo" nel metodo statico.

0

"questa" parola chiave è applicabile solo se viene creata un'istanza di un oggetto. E nel metodo statico non viene creata alcuna istanza perché il metodo statico appartiene all'area della classe.

0

Sono d'accordo con tutte le altre persone che hanno risposto prima di me. Fammi provare in modo diverso per rispondere a questo:

Immagino che il metodo di istanza/metodo non statico appartenga all'istanza di una classe (che significa prima o poi abbiamo bisogno di un riferimento di oggetto per accedervi) quindi questa parola chiave ha senso dentro blocco o metodo di istanza. Ma la parola chiave statica per ogni membro di una classe viene interpretata come risorsa diretta per la classe che un oggetto, se esistente, ha accesso ad essa. Quindi in contesto statico non è sicuro che l'oggetto sia esistente da qualche parte. Ecco perché l'utilizzo di questa area interna statica non è consentita in java.

Problemi correlati