Interfaces

Sandro95

Bekanntes Mitglied
Ein schönen guten Abend Leute ,
ich hatte eig gelernt , das man von einem Interface kein Objekt erzeugt werden kann .
Nun sehe ich in meiner VL zum bsp. das ein Objekt vom interface Runnable erzeugt wird

Runnable r1 = new Runnable();

Wie kann das möglich sein ?

danke für eure Hilfe :)
 

CSHW89

Bekanntes Mitglied
Es ist nicht möglich. Kann es sein, dass es vielleicht eher so etwas war:
Java:
Runnable r1 = new Runnable() {
    @Override
    public void run() {
        // some code
    }
};
Damit erstellt man eine anonyme Klasse, die Runnable implementiert.
 

Sandro95

Bekanntes Mitglied
Ja genau , aber warum kann ich davon ein Objekt erstellen ? Runnable ist ja ein funktionelles Interface ?
Von interfaces kann man doch eig keine Objekte erzeugen ?
 

CSHW89

Bekanntes Mitglied
Du erstellst kein Objekt von Runnable, sondern ein Objekt einer Klasse, die keinen Namen besitzt. Diese Klasse implementiert das Interface Runnable. Deshalb muss in den geschweiften Klammern (das ist der Klassenbody der namenlosen bzw. anonymen Klasse) die Methode run() definiert werden.
 

Sandro95

Bekanntes Mitglied
also in einer normalen klasse ( nicht aonymen) könnte ich kein Objekt vom Runnable erzeugen ? Dies ist nur möglich weil wir das in einer anonymen klasse machen ? Ich kanns noch nicht ganz nachvollziehen
 

CSHW89

Bekanntes Mitglied
Ok, ein ausführlicheres Beispiel. Die beiden Statements für r1 und r2 machen quasi das gleiche. Es gibt zwei Klassen, die Runnable implementieren, und von denen jeweils ein Objekt erstellt wird. Der einzige Unterschied ist, dass die Klasse für r1 einen Namen besitzt "MeineNormaleKlasse", die für r2 ist anonym. Anonyme Klassen sind kompakter, können aber nur an einer Stelle benutzt werden. "MeineNormaleKlasse" könnte ich jetzt noch an weiteren Stellen instantieren.
Java:
public class Test
    private static class MeineNormaleKlasse implements Runnable {
        @Override
        public void run() {
        }
    }
    public void main(String[] args) {
        Runnable r1 = new MeineNormaleKlasse();
        Runnable r2 = new Runnable() {
            @Override
            public void run() {
            }
        };
    }
}
 

Sandro95

Bekanntes Mitglied
ja , r1 kann ich erstellen weil die Klasse MeineNormaleKlasse ja das interface Runnable implementierrt. Hier wird ja auch ein Objekt von MeinerNormalenKlasse erzeugt .
Bei r2 kan nich mir das also so vorstellen , das diese Klasse eig auch einen namen besitzt wie r1 und es deswegen funktioniert ?

In einer Normalen klasse wäre aber Runnable r1 = new Runnable() ... nicht möglich oder ?
 

CSHW89

Bekanntes Mitglied
Bei r2 kan nich mir das also so vorstellen , das diese Klasse eig auch einen namen besitzt wie r1 und es deswegen funktioniert ?
Jep. In Wahrheit hat diese Klasse sogar einen Namen. In diesem Fall heißt sie "Test$1". Wenn man das Programm kompiliert, wird eine Datei "Test$1.class" erstellt. Es ist einfach eine kompaktere Schreibweise für eine Klasse, die nur einmal verwendet wird.

In einer Normalen klasse wäre aber Runnable r1 = new Runnable() ... nicht möglich oder ?
Was genau meinst du damit? "Runnable r1 = new Runnable();" ist nie möglich. "Runnable r1 = new Runnable() { ... }" ist immer möglich.
 

Sandro95

Bekanntes Mitglied
Damit meine ich , stände in einer normalen klasse wie zB in der Main Runnable r1 = new Runnable(); , wäre das nicht möglich da wir kein Objekt vom Interface erstellen können .
aber in einer anonymen Klasse wiederum schon .
 

httpdigest

Top Contributor
Es ist irrelevant, in welcher Klasse bzw. Methode du eine anonyme Klasse oder benamte Klasse erzeugst.
Der Ausdruck:
Java:
new T(args) { }
generiert immer eine neue anonyme Klasse zur Compilezeit, die das Interface T implementiert oder von T ableitet (falls T eine Klasse ist). Zur Laufzeit wird für ein Interface T der no-args Konstruktor der generierten anonymen Klasse ohne Argumente aufgerufen, bzw. für eine Klasse T der passende Konstruktor für das Argument (bzw. die Argumente) `args` (kann auch leer sein).

In deinem Fall ist T = java.lang.Runnable, also ein Interface, und der Ausdruck sieht so aus:
Java:
new Runnable() { }
 

Sandro95

Bekanntes Mitglied
Jep. In Wahrheit hat diese Klasse sogar einen Namen. In diesem Fall heißt sie "Test$1". Wenn man das Programm kompiliert, wird eine Datei "Test$1.class" erstellt. Es ist einfach eine kompaktere Schreibweise für eine Klasse, die nur einmal verwendet wird.

Was genau meinst du damit? "Runnable r1 = new Runnable();" ist nie möglich. "Runnable r1 = new Runnable() { ... }" ist immer möglich.
Es ist irrelevant, in welcher Klasse bzw. Methode du eine anonyme Klasse oder benamte Klasse erzeugst.
Der Ausdruck:
Java:
new T(args) { }
generiert immer eine neue anonyme Klasse zur Compilezeit, die das Interface T implementiert oder von T ableitet (falls T eine Klasse ist). Zur Laufzeit wird für ein Interface T der no-args Konstruktor der generierten anonymen Klasse ohne Argumente aufgerufen, bzw. für eine Klasse T der passende Konstruktor für das Argument (bzw. die Argumente) `args` (kann auch leer sein).

In deinem Fall ist T = java.lang.Runnable, also ein Interface, und der Ausdruck sieht so aus:
Java:
new Runnable() { }


Danke jetzt habe ich es verstanden :)!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Lesen von Interfaces (Programm Vervollständigen) Allgemeine Java-Themen 10
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
S Kann man Variablen oder Felder definieren deren Typ zwei Interfaces ist..? Allgemeine Java-Themen 9
J Problem beim Generischen Klassen und Interfaces Allgemeine Java-Themen 2
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
Stonie Prüfen von direkter Implementierung eines Interfaces Allgemeine Java-Themen 7
rentasad Design-Frage - Interfaces, Klassen, statische Methoden Allgemeine Java-Themen 3
J Generische Interfaces mehrfach einbinden Allgemeine Java-Themen 11
P Interfaces Allgemeine Java-Themen 1
K Wohin mit Interfaces? Allgemeine Java-Themen 2
J Interface Wofür Interfaces in Java verwenden? Allgemeine Java-Themen 3
F Namen des Interfaces ausgeben Allgemeine Java-Themen 1
P ClassCastException bei Verwendung eines Interfaces Allgemeine Java-Themen 7
F Sinn des Serializable Interfaces Allgemeine Java-Themen 8
G Interface Laden der Konfiguration über Interfaces sinnvoll? Allgemeine Java-Themen 28
X Generic muss zwei Klassen/Interfaces erfüllen Allgemeine Java-Themen 5
K Objekt einer konkreten Implementierung eines Interfaces durch übergebenen String Allgemeine Java-Themen 2
D Java Interfaces Allgemeine Java-Themen 3
sylo toString() Methode eines Interfaces überladen. Allgemeine Java-Themen 17
S statische Interfaces..? Allgemeine Java-Themen 6
M Frage zu Interfaces (Beispiel: Comparable) Allgemeine Java-Themen 13
I Interfaces und abstrakte Methoden Allgemeine Java-Themen 5
C Verständnis zur Strukturierung von Java-Projekten/Interfaces Allgemeine Java-Themen 2
M Methodenaufrufe sind über Interfaces langsamer. Allgemeine Java-Themen 43
J Verständnisfrage zu Casts auf Interfaces Allgemeine Java-Themen 5
J Statische Methoden in Interfaces? Allgemeine Java-Themen 10
J Immutable mit Interfaces möglich? Allgemeine Java-Themen 2
G verzweiflung pur mit java interfaces Allgemeine Java-Themen 5
M Bereits imlplementierte Interfaces nochmal bei "impleme Allgemeine Java-Themen 10
T Nochmal Frage zu Vererbung Interfaces etc. Allgemeine Java-Themen 10
F Implementierte Interfaces ermitteln Allgemeine Java-Themen 6
T JDBC: Unterschiede in Interfaces zwischen 2 Java-Versionen. Allgemeine Java-Themen 6
E Attribute in Interfaces möglich? Allgemeine Java-Themen 17
I Denkfehler bei Interfaces und Casts? Allgemeine Java-Themen 12
M 2 Java-Interfaces öffnen in Unix Allgemeine Java-Themen 4
B "Instantiieren" eines Objekts eines Interfaces Allgemeine Java-Themen 10
F Problem: mehrere Interfaces definieren equals() neu Allgemeine Java-Themen 24
F Probleme mit Interfaces Allgemeine Java-Themen 3
L Verschiedene Versionen eines Interfaces Allgemeine Java-Themen 12
S Methoden aus Interfaces mit unterschiedlichen Parametertypen Allgemeine Java-Themen 7
deetee Wie nennt man Interfaces wie Serializable? Allgemeine Java-Themen 8
B Elegantere Lösung bei der Implementierung eines Interfaces Allgemeine Java-Themen 2
N 2 Interfaces mit Methoden selber Signatur implementieren Allgemeine Java-Themen 5
D Implementierungen eines Interfaces finden Allgemeine Java-Themen 9

Ähnliche Java Themen

Neue Themen


Oben