Auf Thema antworten

Also eigentlich solltest Du doch inzwischen ein gewisses Basiswissen zu Java haben. Aber Dir scheinen ja die wichtigsten Grundlagen zu fehlen!


[CODE=java]SomeType variableName;[/CODE]

Dies deklariert eine Variable "variableName" vom Typ SomeType.

Wir gehen jetzt davon aus, dass SomeType ein Interface oder eine Klasse ist!

Nun kann man diese Variable nutzen.

Zuweisung: Man kann dieser Variablen nur Instanzen zugewiesen werden von einer Klasse, die entweder SomeType ist, SomeType implementiert (SomeType ist ein Interface) oder von SomeType erbt (SomeType ist eine Klasse). Umgangssprachlich sagt man dann, dass die Instanz ein SomeType ist. (Ausnahme: null kann auch zugewiesen werden!)


Zugriff auf Elemente von SomeType: Da nur Instanzen zugewiesen werden können, die SomeType sind, kann man in Java nun alle Elemente (Methoden, Felder, ...) direkt nutzen, so die Sichtbarkeit entsprechend gegeben ist.


Also ein kleiner Test:

[CODE=java]import java.io.*;


public class Test {

  

    public interface A {

        void a();

    }

  

    public class AImpl1 implements A {

        public void a() { System.out.println("AImpl1"); }

    }


    public class AImpl2 implements A {

        public void a() { System.out.println("AImpl2"); }

    }

  

    public void test() {

        A test; // Eine Variable vom Typ A.

        test = new AImpl1(); // Wir weisen eine neue Instanz von AImpl1 zu.

        test.a(); // AImpl1 wird natürlich ausgegeben.

        System.out.println(test.getClass().getName()); // Test$AImpl1

        test = new AImpl2(); // Wir weisen eine neue Instanz von AImpl2 zu.

        test.a(); // AImpl2 wird natürlich ausgegeben.

        System.out.println(test.getClass().getName()); // Test$AImpl2


        test = new A() {

            public void a() { System.out.println("Ohne Name"); }

        };

        test.a(); // Ohne Name

        System.out.println(test.getClass().getName()); // Test$1 weil 1. annonyme Klasse in Test

    }


    public static void main (String[] args) {

        new Test().test();

    }

}[/CODE]


Also hier sieht man: Auch wenn ich die neue Instanz von AImpl1 in die Variable vom Typ A stecke: Es ist immer noch eine AImpl1 Instanz!


Oder mal ganz einfach visuell für Dumme:

Du hast eine Tüte, da kannst Du nur Obst rein tun.

Und nun tust Du da einen Apfel rein. Apfel ist ja Obst.


Was hast Du jetzt in der Tüte? Doch immer noch einen Apfel. Und natürlich kannst Du den nun auch schälen. Obst selbst bietet das nicht an, den gewisse Obstsorten werden nun einmal nicht geschält. Das ist der Fall mit dem Cast:


Du packst also "Obst" aus der Tüte aus.

-> Ist es ist ein Apfel? Ja! Toll, nun behandel ich es wie ein Apfel und schäle den Apfel.


Reflection wäre etwas anderes:

-> Ich hole das Objekt aus der Tüte. Mir ist absolut egal, was es ist aber ich prüfe, ob es dieses Objekt "Schälen" anbietet. Wenn ja, dann wird das Objekt einfach geschält.

Klar, in der Tüte kann kein gekochtes Ei sein, aber dieser Reflection Code würde auch bei einem gekochten Ei funktionieren, einfach nur, weil es geschält werden kann.


Edit: Noch den Fall der Annonymen Klasse hinzugefügt!



Oben