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

Ich verstehe verwenden, dass this das Objekt darstellt, sind das Verfahren und dass statische Methoden Aufruf nicht auf ein beliebiges Objekt gebunden. Aber im oben erwähnten Fall ist die Variable y auch statisch.Warum können wir nicht ‚this‘ Schlüsselwort in einer statischen Methode

Wenn wir statische Methode auf Klassenobjekt aufrufen können, warum können wir statischen Methoden nicht erlauben, die statischen Variablen der Klasse festzulegen.

Was ist der Zweck dieser zusätzlichen Einschränkung?

+0

Ich weiß, das ist eine uralte Frage, aber ich möchte es als einen ziemlich gültigen Punkt +1 geben. Obwohl die Antwort für Felder einfach ist (lassen Sie das Qualifikationsmerkmal aus), wird sie für statische innere Klassen relevant und ist auch relevant, wenn Sie eine Referenz auf die Laufzeitinstanz der Klasse selbst haben möchten. Zum Beispiel kann ich "MyClass.class" eingeben, um die Singleton-Klasse zu erhalten, aber nur die Klasse selbst ist ungültig und es gibt keine ähnliche Problemumgehung. Dies führt dazu, dass der Klassenname möglicherweise durch die Einheit wiederholt wird, die nicht sehr DRY ist. –

Antwort

71

Da sich this auf die Objektinstanz bezieht. Es gibt keine Objektinstanz in einem Aufruf einer statischen Methode. Aber natürlich können Sie auf Ihr statisches Feld zugreifen (nur die statischen!). Verwenden Sie einfach

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

Wenn Sie die statische Feld y und nicht einige lokale Variable mit dem gleichen Namen erhalten, um sicherzustellen, möchten, verwenden Sie den Klassennamen angeben:

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

Die Downvoter mögen gedacht haben, dass dies die Frage nicht wirklich beantwortet, weil Sie im Grunde genommen was das OP bereits gewusst hat und nur ein gestellt hat ausführliche Problemumgehung. Wenn die Klasse 'ThisClassHasAQuiteLongName' heißt, wäre es nicht schöner, die Klasse in statischen Methoden als' this' zu bezeichnen? – xehpuk

+0

Das ist nicht wirklich wahr, ich habe eine Erklärung dafür gegeben, warum 'this' nicht in statischen Methoden verwendet werden kann (weil es keine Instanz der Klasse gibt, die' this' genannt wird) und zwei Arten des Zugriffs auf die Felder zeigt. Die Möglichkeit, 'this' in einem statischen Kontext als Ersatz für den Klassennamen zu verwenden, wäre irreführend und inkonsistent (zumindest imho). Vielen Dank für Ihr Feedback, das könnte auch der Grund für die Downvotes gewesen sein. – brimborium

+1

Die Frage, so wie ich sie verstanden habe und die ich auch wissen möchte, ist, warum Java die Bedeutung von 'this' nicht in einem statischen Kontext überlädt, um die Klasse zu bezeichnen, also anstelle von' Sub.y' könnte man 'this' eingeben .y'. Es scheint eine offensichtliche Design-Wahl zu sein, weil es die Notwendigkeit, den Klassennamen explizit zu erwähnen, eliminiert, was sich ändern könnte. Im Allgemeinen, wenn jemand fragt "Warum ist x als y definiert, aber nicht auch z in einem anderen Kontext", ist es nicht befriedigend und in der Tat ein bisschen giftig und herablassend zu antworten, "weil es als y definiert ist". Es machte mich dumm, mich genauso zu wundern, wie ich es immer noch bin. –

2

Um Ihren Code Arbeit schreibt es so zu machen:

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

Sie statische Felder in statischen Methoden setzen können, aber Sie haben keinen Zugriff auf this in statischer Methode, weil this die aktuelle Instanz des repräsentieren Objekt, und in einer statischen Methode haben Sie keine Instanz.

+0

Möchten Sie erklären, was das Problem meiner Antwort oder der Antwort von @ Peter ist? – tibtof

+0

Es ist nichts falsch mit Ihrer Antwort. Upvoted es wieder auf 0. (was Sie mit insgesamt +8 Wiederholungen wegen des beschissenen Abstimmungs-Rep-Systems übrig lässt ^^) – brimborium

2

Dies bedeutet "dieses" Objekt, aber es gibt keins. In Ihrem Fall können Sie den Klassennamen als @tibtof vorschlagen.

5

this bezieht sich auf diese Instanz des Objekts Sub. Da die Methode static ist, gibt es keine Instanz Sub.

0

Schlüsselwort „this“ bezieht sich zu dem Objekt, mit dem Sie arbeiten. In Ihrem Fall dies in allen nicht-statischen Methoden oder Konstruktor (wenn Sie eine und und wenn Sie "das" innerhalb dieser verwenden), dann bezieht sich "dies" auf diese bestimmte Instanz der Klasse Sub. So ist es nur anwendbar, wenn die Objekt wird erstellt. Aber alles im statischen Kontext einer Klasse kann verwendet werden, ohne dass dafür ein Objekt erstellt wird, da es während des Ladens der Klasse aufgelöst wird. "this" wurde nur aufgelöst, wenn ein Objekt erstellt wurde (Sie können sogar dynamisch für welches Objekt angeben). Also "das" macht im statischen Kontext Sinn. Ich hoffe es hilft. Gott segne.

4

Der Hauptgrund, warum wir nicht „die“ in statischer Methode Kontext verwenden können: -

dies: - „this“ bedeutet aktuelle Klasse OBJECT, so ist klar, dass „dies“ kommt nur in das Bild einmal Wir wollten ein Objekt dieser Klasse erstellen.

statische Methode: - Es muss kein Objekt erstellt werden, um die statische Methode zu verwenden. bedeutet "Instanz" oder Objekt-Erstellung hat keinen Sinn mit "statisch" wie Java-Regel.

So würde es Widerspruch geben, wenn wir beide zusammen verwenden (statisch und das). Das ist der Grund, warum wir "this" nicht in der statischen Methode verwenden können.

0

Das Schlüsselwort "this" ist nur anwendbar, wenn eine Instanz eines Objekts erstellt wird. Und in der statischen Methode wird keine Instanz erstellt, da die statische Methode zum Klassenbereich gehört.

0

Ich stimme mit allen anderen Menschen überein, die vor mir geantwortet haben. Lassen Sie mich es auf andere Weise versuchen, dies zu beantworten:

Ich denke, Instanz-Methode/nicht-statische Methode gehört zur Instanz einer Klasse (früher oder später müssen wir Objekt ref zugreifen), so dass dieses Schlüsselwort Sinn machen Instanz Block oder Methode. Ein statisches Schlüsselwort für ein beliebiges Mitglied einer Klasse wird jedoch als direktes Asset für die Klasse interpretiert, auf die ein Objekt, sofern es existiert, Zugriff hat. Im statischen Kontext ist es nicht sicher, ob das Objekt irgendwo existiert. Aus diesem Grund ist die Verwendung dieses statischen Bereichs in Java nicht erlaubt.

Verwandte Themen