---
title: 'Inselraus: Vererbung und Überschattung von statischen Variablen in Schnittstellen'
url: 'https://tutego.de/blog/javainsel/2021/05/inselraus-vererbung-und-ueberschattung-von-statischen-variablen-in-schnittstellen'
markdown: 'https://tutego.de/blog/javainsel/2021/05/inselraus-vererbung-und-ueberschattung-von-statischen-variablen-in-schnittstellen.md'
date: '2021-05-20'
description: 'Die Konstanten einer Schnittstelle können einer anderen Schnittstelle vererbt werden. Dabei gibt es einige kleine Einschränkungen. Wir wollen an einem Beispiel sehen, wie sich die Vererbung auswirkt, wenn gleiche Bezeichner in den Unterschnittstellen erneut verwendet werden. Die Basis unseres Beisp…'
taxonomy:
  category:
    - Allgemein
---

# Inselraus: Vererbung und Überschattung von statischen Variablen in Schnittstellen

![Illustration einer tropischen Insel mit Palmen und einem hohen Berg](https://tutego.de/blog/javainsel/user/themes/tutego/images/insel-cover.jpg)# Java Blog für Programmierer

[Java Blog für Programmierer](https://tutego.de/blog/javainsel/)

## Inselraus: Vererbung und Überschattung von statischen Variablen in Schnittstellen

20.05.2021 · [Christian Ullenboom](https://tutego.de/blog/javainsel/author/admin/)

Die Konstanten einer Schnittstelle können einer anderen Schnittstelle vererbt werden. Dabei gibt es einige kleine Einschränkungen. Wir wollen an einem Beispiel sehen, wie sich die Vererbung auswirkt, wenn gleiche Bezeichner in den Unterschnittstellen erneut verwendet werden. Die Basis unseres Beispiels ist die Schnittstelle `BaseColors` mit ein paar Deklarationen von Farben. Zwei Unterschnittstellen erweitern `BaseColors`, und zwar `CarColors` und `PlaneColors`, die für Farbdeklarationen für Autos und Flugzeuge stehen. Eine besondere Schnittstelle `FlyingCarColors` erweitert die beiden Schnittstellen `CarColors` und `PlaneColors`, denn es gibt auch fliegende Autos, die eine Farbe haben können.

```java
interface BaseColors {
  int WHITE   = 0;
  int BLACK   = 1;
  int GREY    = 2;
}
interface CarColors extends BaseColors {
  int WHITE   = 1;
  int BLACK   = 0;
}
interface PlaneColors extends BaseColors {
  int WHITE   = 0;
  int GREY    = 2;
}
interface FlyingCarColors extends CarColors, PlaneColors { }
public class Colors {
  public static void main( String[] args ) {
    System.out.println( BaseColors.GREY );      // 2
    System.out.println( CarColors.GREY );       // 2
    System.out.println( BaseColors.BLACK );     // 1
    System.out.println( CarColors.BLACK );      // 0
    System.out.println( PlaneColors.BLACK );    // 1
    System.out.println( FlyingCarColors.WHITE );
       //  field FlyingCarColors.WHITE is ambiguous
    System.out.println( FlyingCarColors.GREY );
       //  field FlyingCarColors.GREY is ambiguous
  }
}
```

Die erste wichtige Tatsache ist, dass unsere drei Schnittstellen ohne Fehler übersetzt werden können, aber nicht die Klasse `Colors`. Das Programm und der Compiler zeigen folgendes Verhalten:

- Schnittstellen vererben ihre Eigenschaften an die Unterschnittstellen. `CarColors` und auch `PlaneColors` erben die Farben WHITE, BLACK und GREY aus `BaseColors`.
- Konstanten dürfen überdeckt werden. `CarColors` vertauscht die Farbdeklarationen von WHITE und BLACK und gibt ihnen neue Werte. Wird jetzt der Wert BLACK verlangt, liefert die Umgebung den Wert 0, während `BaseColors`.BLACK 1 ergibt. Auch `PlaneColors` überdeckt die Konstanten WHITE und GREY, obwohl die Farben mit dem gleichen Wert belegt sind.
- Erbt eine Schnittstelle von mehreren Oberschnittstellen, so ist es zulässig, dass die Oberschnittstellen jeweils eine gleichlautende Objektvariable haben. So erbt etwa `FlyingCarColors` von `CarColors` und `PlaneColors` die Einträge WHITE, BLACK und GREY.
- Unterschnittstellen können aus zwei Oberschnittstellen die Objektvariablen gleichen Namens übernehmen, auch wenn die Konstanten einen unterschiedlichen Wert haben. Das testet der Compiler nicht. `FlyingCarColors` bekommt aus `CarColors` ein WHITE mit 1, aber aus `PlaneColors` das WHITE mit 0. Daher ist in dem Beispiel `Colors` auch der Zugriff WHITE nicht möglich und führt zu einem Compilerfehler. Bei der Benutzung muss ein unmissverständlich qualifizierter Name verwendet werden, der deutlich macht, welche Objektvariable gemeint ist, also zum Beispiel `CarColors`.WHITE oder `PlaneColors`.WHITE. Ähnliches gilt für die Farbe GREY. Obwohl Grau durch die ursprüngliche Deklaration bei `BaseColors` und auch bei der Überschattung in `PlaneColors` immer 2 ist, ist die Nutzung durch `FlyingCarColors`.GREY nicht zulässig. Das ist ein guter Schutz gegen Fehler, denn wenn der Compiler dies durchließe, könnte sich im Nachhinein die Belegung von GREY in `BaseColors` oder `PlaneColors` ohne Neuübersetzung aller Klassen ändern und zu Schwierigkeiten führen. Diesen Fehler – die Oberschnittstellen haben für eine Konstante unterschiedliche Werte – müsste die Laufzeitumgebung erkennen. Doch das ist nicht möglich, und in der Regel setzt der Compiler die Werte auch direkt in die Aufrufstelle ein, und ein Zugriff auf die Konstantenwerte der Schnittstelle findet nicht mehr statt.

Kategorien: [Allgemein](https://tutego.de/blog/javainsel/category/allgemein/)

[← Alle Beiträge](https://tutego.de/blog/javainsel/)
