public class InterfaceDemo { public static void main(String[] args) { MatheUnterricht mu = new MatheUnterricht(); mu.printpi(); } } /** * Die Klasse MatheUnterricht implementiert mehrere Interfaces, die alle ein pi * vorgeben. Wie soll nun entschieden werden, welches effektiv verwendet werden * soll? Weil Java das nicht selber kann, muss das betreffende Interface * explizit angegeben werden. */ class MatheUnterricht implements PrimarschulMathe, ETHMathe { public void printpi() { System.out.println("Pi ist "+ETHMathe.pi); // Das Interface muss explizit angegeben werden } } /** * Dieses Interface sagt lediglich, dass das ein pi sein muss */ interface Mathe { public double pi = 0; } /** * Dieses Interface definiert pi als 3. Ausserdem gibt es in // ... noch mehr * Methoden vor (die kann man sich selsbt ausdenken). */ interface PrimarschulMathe extends Mathe { public double pi = 3; // ... } /** * Die ETHMathe ist etwas genauer und definiert pi sehr genau. Ausserdem kommt * noch mehr dazu, was ein ETH Student können muss. Das ist alles in //... * */ interface ETHMathe extends Mathe { public double pi = 3.141592653589793d; // ... } /** * Constanten könnten auch anders global exportiert werden. Diese Klasse ist * final, d.h. keine andere Klasse kann davon erben (Gilt z.B. auch für String). * Weil der Konstruktor private ist, kann niemand von aussen darauf zugreifen * und ein Objekt dieser Klasse erstellen. Der Wert Pi ist dann * - public, damit es für alle sichtbar ist. * - static, damit kein Objekt von Constants nötig ist um darauf zugreifen zu * können (Der Konstruktor wäre ja gar nicht sichtbar). * - final, damit niemand einen anderen Wert darauf speichern kann. * Verwendet wird Pi dann mittels "Constants.PI" */ final class Constants { // final macht, dass nicht geerbt werden kann private Constants() { } // Instanzierung nicht möglich public static final double PI = 3.14d; }