2016-01-12 4 views
26

Dies ist eine Übung zum Verständnis der Funktionsweise von inneren Klassen in Java. Wie die Frage besagt, wie viele verschiedene Versionen von x in (*) zugänglich sind?Wie viele verschiedene Versionen von 'x' sind in (*) verfügbar?

class Outer { 
    int x; 

    class Inner extends Outer { 
     int x; 

     void f(int x) { 
      (*) 
     } 
    } 
} 

ich geneigt bin zu glauben, dass es 3, nämlich: this.x, super.x und x aber einige meiner Kollegen scheinen zu denken, dass es 4.

Wer von uns ist verwirrt? Und kannst du es erklären?

+16

Bleaaah, was für ein Durcheinander von Code. Aber ich lehne mich Richtung 4 ab und unterscheide "Outer.this.x" von "super.x", weil du "Outer" sowohl als Supertyp als auch als umschließenden Typ hast, und diese sind verschieden. –

+1

Korrigieren.Mit "Äußerer a = neuer Äußerer(); Inneres b = a.new Inneres(); da sind 4 von ihnen. –

+0

einige weitere syntaktische Formen - 'Inner.super.x',' ((Äußere) this) .x' – ZhongYu

Antwort

30

Es gibt 4, nämlich: x, this.x, super.x und Outer.this.x.

Beachten Sie Folgendes:

public class Outer { 

    int x; 

    public static void main(String[] args) { 
     Outer outer = new Outer(); 
     Outer.Inner inner = outer.new Inner(); 
     outer.x = 3; 
     inner.x = 2; 
     inner.f(1); 
    } 

    class Inner extends Outer { 
     int x; 

     void f(int x) { 
      System.out.println(super.x); 
      System.out.println(x); 
      System.out.println(this.x); 
      System.out.println(Outer.this.x); 
     } 
    } 

} 

Dieser Code

0 
1 
2 
3 

zeigt 4 verschiedene Werte gedruckt werden.

Was geschieht ist folgendes:

  1. Die Eltern der inner Instanz hat eine unitialized x Variable. Für einen int ist der Standardwert 0: das ist super.x. Die Methode f wird mit dem Argument 1 aufgerufen.
  2. Die Instanz inner wurde x auf 2 gesetzt mit inner.x = 2: dies ist this.x.
  3. Die outer Instanz, die Outer.this ist, wurde x Wert auf 3 gesetzt: das ist Outer.this.x.

Der hier Trick ist, dass Inner ist sowohl ein inner class (so hat es eine umschließende Outer Instanz) und eine subclass (so hat es eine übergeordnete Outer Beispiel), und diese beiden Outer Instanzen sind nicht die gleichen .

+0

Betreff: "a [Unterklasse] (https://docs.oracle.com/javase/specs/jls/se8 /html/jls-8.html#jls-8.1.4) (so hat es eine "Outer" -Instanz) ": Dies sollte" eine [Unterklasse] sein (https://docs.oracle.com/javase/specs /jls/se8/html/jls-8.html#jls-8.1.4) (also ist es selbst eine "Outer" -Instanz) ". (Oder besser gesagt: "eine [Unterklasse] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.1.4) (also sind ihre Instanzen selbst" Outer " 'Instanzen)".) – ruakh

10

Es gibt vier von ihnen:

  • Outer.this.x für die Outer Klasse Eigenschaft
  • this.x für die Inner Klasse Eigenschaft
  • super.x für die Super-Typen Outer Klasse Eigenschaft
  • x für das Verfahren Argument
Verwandte Themen