---
title: 'Inselupdate: Vererbung und Überschattung von statischen Variablen'
url: 'https://www.tutego.de/blog/javainsel/2012/01/inselupdate-vererbung-und-berschattung-von-statischen-variablen'
markdown: 'https://www.tutego.de/blog/javainsel/2012/01/inselupdate-vererbung-und-berschattung-von-statischen-variablen.md'
date: '2012-01-08'
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. Als Basis unseres Beisp…'
taxonomy:
  category:
    - Insel
---

# Inselupdate: Vererbung und Überschattung von statischen Variablen

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

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

## Inselupdate: Vererbung und Überschattung von statischen Variablen

08.01.2012 · [Christian Ullenboom](https://www.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. Als Basis unseres Beispiels steht eine Schnittstelle `BaseColors` mit ein paar Deklarationen von Farben. Zwei Unterschnittstellen erweiterten BaseColor, einmal `CarColors` und `PlaneColors`, die für Farbdeklarationen für Autos und Flugzeuge stehen. Eine besondere Schnittstelle `FlyingCarColors` erweitert die beiden Schnittstelen `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 );//  The field FlyingCarColors.WHITE is ambiguous

    System.out.println( FlyingCarColors.GREY ); //  The 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` erbten die Farbe WHITE, BLACK und GREY aus `BaseColors`.
- Konstanten dürfen überschattet werden. `CarColors` vertauscht die Farbdeklarationen von WHITE und BLACK und gibt ihnen neue Werte. Wird jetzt der Wert `CarColors`.BLACK verlangt, liefert die Umgebung den Wert 0, während `CarColors`.BLACK 1 ergibt. Auch PlaneColor überdeckt die Konstanten WHITE und GREY obwohl sie Farbe mit dem gleichen Wert belegt sind.
- Erbt eine Schnittstelle von mehreren Oberschnittstellen, so ist es zulässig, wenn die Oberschnittstellen jeweils ein gleichlautendes Attribut haben. So erbt etwa `FlyingCarColors` von `CarColors` und `PlaneColors` den Eintrag WHITE, BLACK und GREY.
- Unterschnittstellen können aus zwei Oberschnittstellen die Attribute gleichen Namens übernehmen, auch wenn sie einen unterschiedlichen Wert haben. Das testet der Compiler nicht. `FlyingCarColors` bekommt aus `CarColors` ein WHITE mit 1 aber aus `PlaneColors` das Weiß mit 0. Daher ist auch der Zugriff `FlyingCarColors`.WHITE in dem Beispiel `Colors` auch nicht möglich und führt zu einem Compilerfehler. Bei der Benutzung muss ein unmissverständlicher qualifizierter Name verwendet werden, der deutlich macht, welches Attribut 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 BaseColor und auch bei der Überschattung in `PlaneColors` immer Zwei 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: [Insel](https://www.tutego.de/blog/javainsel/category/insel/)

## 1 Kommentare

**dieta** · [25.01.2012 14:58](#comment-4039)

http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u2-download-1377129.html . Der Blog-Eintrag http://blogs.oracle.com/darcy/entry/project\\\_coin\\\_7u2\\\_fixes gibt zwei Beispiele für Fehler aus den neuen Sprachfeatures, die gefixt sind.

Die bisherigen Kommentare wurden aus WordPress übernommen. Neue Kommentare sind derzeit geschlossen.

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

---

## Navigation

- Previous: [Google Guava: Delete all files in a directory (now deprecated)](https://www.tutego.de/blog/javainsel/2012/01/google-guava-delete-all-files-in-a-directory-now-deprecated.md)
- Next: [NetBeans 7.1 Code-Transformation nach Java 7](https://www.tutego.de/blog/javainsel/2012/01/netbeans-7-1-code-transformation-nach-java-7.md)
