Frage zu Interface

abcman

Mitglied
In einer Aufgabe musste ich alle Methoden in einem Interface zusammenfassen (siehe unten).
Allerdings sehe ich den Sinn dahinter nicht ganz. Man kann ja trotzdem direkt von der Main-Methode darauf zugreifen ohne zuerst übers interface gehen zu müssen.

Kann mir das jemand anhand eines einfachen Beispiels erklären?




Code:
public interface Queue {

    public void SuperKlasse(); 
                            

    public void SuperKlasse(int size);

    public void put(Object obj);

    public Object get();

    public Object peek(); 

    public void clear();

    public boolean isEmpty();

    public Object[] getqArray(); 
                                
    public void setOArray(Object[] qArray);

    public int getInitialSize();

    public void setInitialSize(int initialSize);

    public void showArraySize();

    public void showItems();

}

Code:
public class ArrayQueue implements Queue {
    Object[] qArray;
    protected int initialSize = 3;
    protected int pos;
    
    
    public void SuperKlasse() { //Konstruktor: Kein Grössenwert wird mitgeliefert, also erstellt es ein Array mit der Initialgrösse
        qArray = new Object[initialSize];
    }
 
    public void SuperKlasse(int size) {//Konstruktor: Hier wird ein Grössenwert mitgeliefert und ein Array mit dieser Grösse erstellt
        qArray = new Object[size];
    }
 
    
    public void put(Object obj){//platziert obj in der Queue
        qArray[pos] = obj; // obj in oA aufnehmen
        pos++; // pos erhöhen             
    }
    
    public Object get(){//liefert erstes Objekt zurück (mit Entfernen) (zz nur Pseudo Werte, muss noch programmiert werden)
        Object o = qArray[0];
        return qArray;
    }
    
    public Object peek() { //liefert erstes Objekt zurück (ohne Entfernen)
        return qArray[pos - 1]; // noch keine Ausnahmebehandlung
    }
    
    public void clear()//leert die Queue
    {}
        
    
    public boolean isEmpty()//testet, ob Queue leer ist
    {
        return false;
    }
    
    
    
    
    
    
    public Object[] getqArray() {// Hier wird das Objekt qArray weitergegeben mit protected
        return qArray;
    }
 
    public void setOArray(Object [] qArray) {
        this.qArray = qArray;
    }
 
    public int getInitialSize() {//Initialgrösse wird witergegeben (an SubKlasse)
        return initialSize;
    }
 
    public void setInitialSize(int initialSize) {//InitialSize Wert von dieser Klasse weitergegeben
        this.initialSize = initialSize;
    }
 
    public void showArraySize() {//Zeigt die Arraygrösse an
        System.out.println(qArray.length);
    }
 
    public void showItems() {//Zeigt den Intalt des Arrays
        for (Object object : qArray) {
            System.out.println(object.toString());
        }
    }
 
    
}
 

brunothg

Aktives Mitglied
Ich werde mal versuchen das kurz zu erklären. Dazu findest du an jeder Ecke Ausführungen ohne Ende.

Der Zweck von Interfaces steckt eigentlich schon im Name. Das Interface schafft eine Schnittstelle, die einmal definiert unabhängig von der Implementierung genutzt werden kann. Somit kann jeder deine Queue nutzen ohne zu wissen was sich dahinter abspielt. Auch die tatsächliche Implementierung kann ohne Auswirkungen auf die Funktionalität ausgetauscht werden.
Interfaces können sehr gut für Entkopplung genutzt werden.

Schau dir nur mal die Collection API der JRE an. Ein interface und einige Implementationen für unterschiedliche Situationen. Aber die Methoden bleiben gleich.

Schnittstelle (Objektorientierung) – Wikipedia
 

Major_Sauce

Bekanntes Mitglied
Um das oben zu vereinfachen:

Du kannst 10 verschiedene Klassen haben die 10 verschiedene Dinge machen, zum Bleistift Auto, Hund, Flugzeug, Mensch.
Diese dinge haben nun etwas gemeinsam, die Bewegung zum Beispiel. Da sich alle diese Objekte bewegen könntest du ein Interface erstellen das die Methode bewegen() hat, und dann allen zuweisen.
Im weiteren Code ist es nun vollkommen egal ob das Objekt das du gerade verwendest ein Hund oder ein Auto ist, alle haben mehr oder weniger die Selben Methoden.

Anwendungsbeispiel:

Du scheibst ein Spiel und hast eine Welt.class in der alle Objekte die du eben so verwendest.
Die objekte sind alle in einer Liste gespeichert und du willst nun alle Objekte bewegen.
Du könntest nun einfach jedes mal überprüfen ob es ein Auto ist, wenn ja dann musst du die fahren() Methode in der Auto-Klasse ausführen.
Wenn es kein Auto ist dann schaust du ob es ein Flugzeug ist, wenn ja dann fliegt es, wenn nicht dann musst du weite checken.
Wenn du nun 100 verschiedene Objekte hast ist das viel zu aufwändig, dann implementierst du einfach ein Interface "Bewegbar", mit welchem du das Objekt ganz einfach direkt in der Liste als "Bewegbar" abspeicherst oder castest, ist eine Frage des Geschmacks.
Nun legst du in der Klasse des Autos fest dass die bewegen() methode das auto fahren lässt, in der Flugzeug.class soll das flugzeug fliegen und der Mensch soll gehen.
Am ende loopst du einfach durch alle Objekte und sagst: objekt.bewegen(); --> Alle objekte bewegen sich.

Das klingt iwie kompliziert aber vielleicht hilft es dir ja.

mfg Major
 

Major_Sauce

Bekanntes Mitglied
Nabend,

compareTo wird wie der Name schon sagt zum vergleichen verwendet.
Wenn du Klassen hast, die das Interface implementieren, dann werden diese mit einander verglichen.
Was verglichen werden soll, kannst du auch selbst festlegen, indem du die Methode überschreibst und dann 1, 0 oder -1 zurückgibts.

So, nun zu deiner Frage:
Man kann compareTo auch auf integer oder ähnliches anwenden, bei einem Integer würde ganz einfach eine größer oder kleiner Abfrage passieren, da er schaut ob int a > int b und dann eben 1, 0, oder -1 zurückgibt.
Bei anderen Klassen, bei denen du diese Methoden anwenden kannst, wird wohl etwas ähnliches festgelegt, dadurch kannst du es bei denen dann auch nutzen.

Mit freundlichen Grüßen
Major
 

DeVolt

Mitglied
Wenn du Klassen hast, die das Interface implementieren, dann werden diese mit einander verglichen.

Aber ich kann compareTo auch einsetzen, wenn ich kein Interface implementiere.
Heißt also, dass die Methode durch Object zur Verfügung gestellt wird, oder?

Das Programm hier gibt mir 0 aus. Ich habe kein Interface implementiert.

Java:
public class Freund
{
private String nachname, vorname;
private int alter;

public Freund(String nachname, String vorname, int alter)
{
this.nachname = nachname;
this.vorname = vorname;
this.alter = alter;
}

public String getNachname()
{
    return this.nachname;
}

public int compareTo(Freund einFreund)
      throws ClassCastException
{
return
  (this.nachname.compareTo(einFreund.getNachname()));
}   

public static void main (String args[])
{
    Freund nocheinFreund = new Freund("Kersting","Hans",36);
    Freund einFreund = new Freund("Kersting","Wolfgang",52);
   
    System.out.println(einFreund.compareTo(nocheinFreund));
}

}
 

Major_Sauce

Bekanntes Mitglied
Davon gehe ich dann mal aus, bin blos gerade auf Arbeit, da sollte ich nicht all zu viel in Foren schlendern.
Kannst ja einfach mal die Java-docs öffnen und nach der Klasse Object suchen, da solltest du dann sehen welche Interfaces sie Implementiert.

mfg Major
 

Major_Sauce

Bekanntes Mitglied
Ahja, hab ich jetzt auch gesehen.
Da kannst du dann eben auch deine eigenen Abfragen einbauen, die dann die CompareTo methode ändern.

mfg Major
 

DeVolt

Mitglied
Okay. Ich glaube ich habe die Anwort.
Comparable stellt wirklich eine eigene Methode zur Verfügung, nämlich compareTo(T o)
(vermutlich arbeitet die Methode mit equals und compareTo(String string) usw.)

Ich wusste nur nicht, dass Interfaces auch Methoden zur Verfügung stellen.
Aber ist ja klar, dass nich alle Interfaces abstrakt sind.

Bei Balzert habe ich gefunden: "In Schnittstellen können nicht-abstrakte Methoden mit Implementierung definiert werden." Dazu werden sog. default-Methoden eingesetzt. Vermutlich ist compareTo(t o) eine solche.
 

Harry Kane

Top Contributor
Ohoh, da geht einiges durcheinander.
Ich werf mal ein paar Kommentare in den Ring:
1. Wenn die Klasse Freund eine Methode compareTo(Freund einFreund) definiert, dann kann diese Methode selbstverständlich genutzt (wobei "genutzt" wahrscheinlich "aufgerufen" heissen sollte) werden, unabhängig davon, welche interfaces die Klasse implementiert.
2. Was das Interface "Comparable" für Methoden "zur Verfügung stellt" (wobei "zur verfügung stellt" wahrscheinclih "deklariert" heissen sollte), ist vollkommen unerheblich, solange eine betrachtete Klasse dieses interface gar nicht implementiert.
3. Die Methode compareTo ist KEINE default Methode des Comparable interfaces.
Mit der o.g. Definition der Freund-Klasse kannst du zwar die compareTo-Methode aufrufen, du kannst die Freund-Klasse aber nicht als Comparable verwenden, weil die Freund-Klasse nicht das Comparable interface implementiert. Die Freund-Klasse hat zwar die dafür notwendige Methode, es fehlt aber das "implements Comparable<Freund>" nach "public class Freund".
 

Harry Kane

Top Contributor
Was meinst du mit "wer stellt die Methode"? Von welchem Code reden wir?
Wenn deine obige Freund-Klasse immer noch gültig ist, definiert sie eine compareTo-Methode, die, da sie public ist, von überall dort, wo eine Instanz von Freund verfügbar ist, aufgerufen werden kann.
 

DeVolt

Mitglied
Wie gesagt, mein Code oben ist natürlich sinnlos, da compareTo als Methode dort vorkommt.

Ursprung meines Problems war dieser Code:

Java:
import java.util.*;

public class GenerischSortieren
{
   
  public static <E extends Comparable<E>> void sortieren(ArrayList<E> liste)
  {
    int i, j;
    E merke;
   
    for (i = 1; i < liste.size(); i++)
    {
      merke = liste.get(i);
      for (j = i-1; j >= 0 && merke.compareTo(liste.get(j)) < 0; j--)
        liste.set(j+1,liste.get(j));
      liste.set(j+1,merke);
    }
  }

  public static void main (String args[])
  {
        ArrayList<String> eineListe = new ArrayList<>();
        eineListe.add("Eins");
        eineListe.add("Zwei");
        eineListe.add("Drei");
        eineListe.add("Vier");
        DemoSortGenerisch.sortieren(eineListe);
        for (String element : eineListe)
          System.out.println(element);
  }
}

Ich wusste nicht, warum der Compiler bei merke.compareTo nicht meckert.

Daher habe ich vermutet, dass Comparable die Methode stellt.
Aber offensichtlich sind es die Datentypen. Auf diesen ist die Methode vordefiniert.
 

Harry Kane

Top Contributor
In der sortieren-methode selber hat der Compiler eigentlich keinen Grund zu meckern. Die übergebene ArrayList enthält Comparables, und die müssen die compareTo-Methode implementieren.

Wenn du in der main-Methode eine ArrayList erstellt hättest, deren Elemente NICHT das Comparable-interface implementieren, hätte der Compiler bereits beim Aufruf der sortieren-methode gemeckert, weil er gemerkt hätte, dass die sortieren-Methode eine ArrayList mit Comparables erwartet und die in der main erzeugte Liste KEINE Comparables enthält.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Frage zu dem Thema interface Java Basics - Anfänger-Themen 5
O Frage zu Interface Java Basics - Anfänger-Themen 5
F Interface Interface Frage Java Basics - Anfänger-Themen 3
M Frage zum Interface Comparable Java Basics - Anfänger-Themen 3
Luk10 Frage zu Interface Java Basics - Anfänger-Themen 6
P Eine Frage begzl. Interface / Polymorphie Java Basics - Anfänger-Themen 11
D Interface-Frage Java Basics - Anfänger-Themen 6
N Frage zum Interface Java Basics - Anfänger-Themen 11
I Generelle Frage zu Interface Java Basics - Anfänger-Themen 3
M Frage zu Interface CodeBeispiel Java Basics - Anfänger-Themen 4
R Frage zum Cloneable-Interface Java Basics - Anfänger-Themen 9
Zrebna Frage zu Test-Driven Development (TDD) Java Basics - Anfänger-Themen 3
I Frage Thymeleaf -> Fehler ignorieren und mit "" ersetzen? Java Basics - Anfänger-Themen 15
I Frage Thymeleaf -> Prefix / Suffix ändern? Java Basics - Anfänger-Themen 11
D Rekursions Probleme / frage Java Basics - Anfänger-Themen 4
T Frage zu Parse Java Basics - Anfänger-Themen 2
H Frage an die Profis Java Basics - Anfänger-Themen 4
J Eine konzeptionelle Frage zu OOP Java Basics - Anfänger-Themen 3
P Frage zu Rekursion und Backtracking Java Basics - Anfänger-Themen 2
H Frage zur Ausgabe Java Basics - Anfänger-Themen 4
H Frage zu arithmetischen Operationen Java Basics - Anfänger-Themen 20
F Kurze Frage zu replace() Java Basics - Anfänger-Themen 19
JavaSchmecktLecker Polymorphie Frage zur Methodenüberschreibung Java Basics - Anfänger-Themen 21
J Frage zu einem "Taschenrechner" code Java Basics - Anfänger-Themen 9
B Erste Schritte Frage zu Instanzierung und Referenzen Java Basics - Anfänger-Themen 8
DoubleM Runtime.getRuntime().exec Frage Java Basics - Anfänger-Themen 2
J Eine theoretische Frage zur Praxis - JPanel oder Canvas Java Basics - Anfänger-Themen 5
O Frage: Formaler Typbezeichner? Java Basics - Anfänger-Themen 3
I BlueJ Queue Frage für Klausur Java Basics - Anfänger-Themen 2
N Verständnis Frage zu Variablen Java Basics - Anfänger-Themen 3
N Spezielle frage zum Comparator Java Basics - Anfänger-Themen 6
L Frage zum Array Java Basics - Anfänger-Themen 1
A Frage zum UML Design Java Basics - Anfänger-Themen 1
I Hilfe bei Klausur Frage Java Basics - Anfänger-Themen 8
izoards Drucken Frage zu FAQ Beitrag Java Basics - Anfänger-Themen 2
J Frage zu meinem Code (OOP) Java Basics - Anfänger-Themen 4
sserio Split() -> Regex Frage. Java Basics - Anfänger-Themen 7
A OCA Study Guide: 2. Frage aus Kapitel 3 Java Basics - Anfänger-Themen 9
sserio Date Library Frage Java Basics - Anfänger-Themen 9
Max246Sch Frage zu Währungsrechner Code Java Basics - Anfänger-Themen 2
sserio Frage zu HashMaps Java Basics - Anfänger-Themen 20
sserio Frage zu Threading - Multithreading Java Basics - Anfänger-Themen 2
sserio Frage zu Lambda Ausdrücken Java Basics - Anfänger-Themen 7
sserio Frage zu BigInteger Java Basics - Anfänger-Themen 1
D Frage bzgl. Enum-Handhabung Java Basics - Anfänger-Themen 16
xxx12 Frage Java Basics - Anfänger-Themen 2
I Generelle Frage zu Mikroservices (Spring Boot?), Docker... Java Basics - Anfänger-Themen 7
R Frage zu Methoden (Rückgabewert u. ohne.) Java Basics - Anfänger-Themen 2
A Frage zur programmierung Java Basics - Anfänger-Themen 12
M Frage zur Methode split der Klasse String Java Basics - Anfänger-Themen 32
R Input/Output Frage zu Java IO Java Basics - Anfänger-Themen 6
M Frage zu printWriter Java Basics - Anfänger-Themen 5
C Frage zu OLSMultipleLinearRegression Java Basics - Anfänger-Themen 31
KogoroMori21 Frage zum Euklidischen Algorithmus Java Basics - Anfänger-Themen 11
S Verständnis-Frage zu einer HÜ? Java Basics - Anfänger-Themen 1
F Frage betreff Programm mit dem man C++-Code in JAVA-Code übersetzen lassen kann Java Basics - Anfänger-Themen 2
L Frage zur Ticket Maschine Java Basics - Anfänger-Themen 1
J Frage zu OOP-Klassendiagramm Java Basics - Anfänger-Themen 8
OSchriever Frage zu Compiler Java Basics - Anfänger-Themen 8
H Frage zu Throw Exception Java Basics - Anfänger-Themen 2
TimoN11 Frage zu Java-Vererbung (Cast) Java Basics - Anfänger-Themen 5
Bademeister007 Hallo Leute ich hab eine Frage zur ArrayList Java Basics - Anfänger-Themen 8
F Frage betreff Programmierbücher zu Lagerverwaltung als Konsolenprogramm Java Basics - Anfänger-Themen 3
dieter000 Kurze Frage kann mir ejmand kurz diesen Code erklären, bzw wie man die zeilen erklärt und so Java Basics - Anfänger-Themen 1
I String.split regex Frage Java Basics - Anfänger-Themen 2
N Best Practice Frage zum MVC-Pattern Java Basics - Anfänger-Themen 2
dieter000 Frage zu einem Beispiel... Java Basics - Anfänger-Themen 5
J Frage zum Loggen Java Basics - Anfänger-Themen 18
J Methoden Frage: Array-Werte in anderer Methode ändern Java Basics - Anfänger-Themen 4
Zrebna Frage zum "Referenzen-konzept" in Java Java Basics - Anfänger-Themen 8
JD_1998 Array-Position aus einer Methode in einer anderen ausgeben (Kurze Frage) Java Basics - Anfänger-Themen 2
marcooooo Frage zu bestimmten Beispiel Java Basics - Anfänger-Themen 31
NeoLexx equals()-Methode Verständnis Frage anhand Code Beispiel Java Basics - Anfänger-Themen 22
N Input/Output Eine Frage über system.out.println. Java Basics - Anfänger-Themen 10
B Erste Schritte Learning Coding (!) Frage an erfahrene Programmierer. Java Basics - Anfänger-Themen 23
M konzeptuelle Frage: In welcher Klasse definiert man am Besten Methoden, die die Kommunikation mit dem User regeln? Java Basics - Anfänger-Themen 8
B Frage zum Code verständnis im Resultat Java Basics - Anfänger-Themen 10
C Exception-Frage Java Basics - Anfänger-Themen 3
J Eine Frage zur Schreibweise == ? : Java Basics - Anfänger-Themen 3
S Frage des Designs Java Basics - Anfänger-Themen 1
JavaTalksToMe Extends/Implements Frage Java Basics - Anfänger-Themen 3
pkm Frage zu Servletfunktion Java Basics - Anfänger-Themen 0
B Frage zur Währungsumrechnung Java Basics - Anfänger-Themen 3
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
Kirby.exe Frage zur Verwendung von Interfaces Java Basics - Anfänger-Themen 6
D Frage zu Strings einer Exception Java Basics - Anfänger-Themen 4
L Wie frage ich ab, ob in einem Array, Werte doppelt vorkommen? Java Basics - Anfänger-Themen 4
D Frage zur IDE IntelliJ IDEA Java Basics - Anfänger-Themen 6
H Frage zum 2d Array Java Basics - Anfänger-Themen 1
N Frage zum Newton-Fraktal Java Basics - Anfänger-Themen 1
H Frage zu interfaces Java Basics - Anfänger-Themen 1
J Frage dazu Variablen klassenübergreifend zu verändern Java Basics - Anfänger-Themen 22
I Frage zu SkipList Java Basics - Anfänger-Themen 4
G Frage zu JScrollPane Java Basics - Anfänger-Themen 12
Kirby.exe Allgemeine Frage Java Basics - Anfänger-Themen 3
W Frage zu anonymen Klassen Java Basics - Anfänger-Themen 4
J Kleine Frage zu OOP Java Basics - Anfänger-Themen 371
S Frage Klasse und Objekte Java Basics - Anfänger-Themen 2
F Frage zu Iteratoren Java Basics - Anfänger-Themen 2
C Erste Schritte Frage zur ArrayList Java Basics - Anfänger-Themen 15

Ähnliche Java Themen

Neue Themen


Oben