public class Abstrakte_Klassen_und_Interfaces { // Eine abstrakte Klasse // Kann als "Vorlage" dienen, aber es kann kein // Objekt gebildet werden! static abstract class A { void hello() { System.out.println("Hallo, Welt"); } // Eine abstrakte Funktion MUSS in der // erbenden KLasse implementiert werden. abstract void test(); } static class B extends A { int counter = 0; // hello() wird aus A geerbt // test() muss implementiert werden, // da abstract in der Basisklasse! void test() {} // Faule Variante ohne Funktion } // Interfaces können wie abstrakte Klassen // nur "vererbt" werden (mit "implements"), // auch mehrere !!!, aber dürfen selbst // keine ausprogrammierten Funktionen // enthalten, und sonst auch nur Konstanten interface I { /*** Verboten: Ausprogrammierte Funktion *** void hello() { System.out.println("Hello"); } ********************************************/ // Erlaubt: Funktions-Prototyp // Ohne Funktionsrumpf, nur mit Signatur void hello(); // ... und KONSTANTEN sind erlaubt. final int MAX = 100; } static class C implements I{ // Erzwungen durch das Interface I: public void hello() { System.out.println("Hello"); } } public static void main(String[] args) { // Hier wollen wir ein Objekt von Klasse A // erzeugen und die Funktion hello() aufrufen // Geht nicht, da A abstract: A a = new A(); // Geht, da Klasse B (Konstruktor) nicht abstract A a = new B(); a.hello(); // Man darf Interfaces auch als Datentyp für // Variablen verwenden (nur kein new auf den Konstruktor // aufrufen), da sie quasi "abstrakte Klassen mit abstrakten Funktionen" sind. I c = new C(); c.hello(); } }