doppelname nach schlüsselwort extends

janibee

Mitglied
Hallo an alle,
ich bin Java Neuling und habe bei einer Klassen-Definition etwas sehr seltenes gesehen:

public class klassenname extends name.weiterername

Es darf doch nur von einer Klasse vererbt werden, warum wird hier von einem zusammengesetzten namen extendet ?? Ist "weiterername" eine statische Variable ?
 
weiterername ist eine Innere Klasse von name

Beispiel:

Java:
public class Tier {

    public static class FaulesTier {

    }

}

und

Java:
public class Loewe extends Tier.FaulesTier {
   
}
 
Zuletzt bearbeitet:
Ich habe nun eine sehr ähnliche Frage, die ich hier posten will, unswar:
...habe ich ein Android-Buch worin steht:
new View.OnClickListener() {
@Override
public void onclick(View v) {...}
}
so werden innere Klassen initialisiert: new A.B();
Aber warum sagt die Android Doku das sei ein "public static interface View.OnClickListener". (Also "OnClickListener" sei ein Interface)
Was ist es nun ? Und wenn es ein Interface ist, seit wann werden die bei einer Objekt-Initialisierung mit angegeben ?
 
@janibee
Du kannst gern so viele neue Themen öffnen, wie du magst 🙂 Das hilft auch anderen Leuten, die die selbe Frage haben und danach suchen 🙂

Es ist beides:

Java:
class View {
  public interface OnClickListener() {
    public void onClick(View v);
  }
}

Die Magie passiert an dieser Stelle:

Java:
class MyActivity {
  public void onResume() {
    View.OnClickListener l = new View.OnClickListener() {
      @Override public void onClick(View v) {
        // code
      }
    };
  }
}

Die Syntax in der Activity erzeugt eine neue Klasse, welche das Interface implementiert und erstellt dann auchnoch eine Instanz dieser Klasse.

Wenn du dir den Output des Compilers ansiehst, verstehst du es besser: Es entsteht dann eine Klasse MyActivity (MyActivity.class) und eine Klasse MyActivity$1 (MyActivity$1.class). Wenn man die dann wieder decompiliert erhält man Sinngemäß dashier:

Java:
// MyActivity$1.class
class MyActivity$1 implements View.OnClickListener {
  @Override public void onClick(View v) {
    // code
  }
}

// MyActivity.class
class MyActivity {
  public void onResume() {
    View.OnClickListener l = new MyActivity$1();
  }
}

Hier das offizielle Tutorial von Oracle dazu: https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html
 

Zurück
Oben