Collections List über Interface zugreifen

coldstone

Bekanntes Mitglied
Hallo,

habe folgendes Problem.

Java:
public class TelephoneList implements TelephoneListSpec {

    public List<TelephoneEntry> entries = new ArrayList<>();
    
    public void add(String name, String nummer) {
        entries.add(new TelephoneEntry(name, nummer));
        }
}

Wie kann ich die add Methode in meiner anderen Klasse verwenden?

Java:
public class telephoneTester {

    public static void main(String args[]) {
        
        add("Felix", "fsfdsf");
        }
}

Mache ich mir das zu einfach mit add("Felix", "fsfdsf"); ??????
 

coldstone

Bekanntes Mitglied
Ok, zugegebenermasen kam mir das
Code:
add("Felix", "fsfdsf");
auch zu einfach vor.

Aber wieso gibt mir der compiler in meiner main methode hier einen fehler bei entries???

Java:
public class telephoneTester {
   
    public static void main(String args[]) {
        entries.add("Felix", "0160555463");
    }
}

Fehlermeldung: entries cannot be resolved

Java:
public void add(String name, String nummer) {
entries.add(new TelephoneEntry(name, nummer));
}

Er müsste doch sich auf die "entries" Beschreibung in der methode beziehen.
 

httpdigest

Top Contributor
Also, du hast eine Datei TelephoneList.java mit der Klasse TelephoneList und du hast eine Datei telephoneTester.java mit einer Klasse telephoneTester.
Die Klasse telephoneTester weiß nichts von der Existenz von TelephoneList. Außerdem ist entries in der Klasse TelephoneList eine Instanzvariable und die static void main Methode in telephoneTester ist statisch. Nochmals: Du benötigst eine Instanz von TelephoneList, um auf Instanzvariablen einer TelephoneList zugreifen zu können.
 

coldstone

Bekanntes Mitglied
Java:
public static void main(String args[]) {
        
        TelephoneList entries = new TelephoneList();
        entries.add("Steffan", "543535463");
        entries.add("Max", "017657689");
    }

So in etwa????
 

mihe7

Top Contributor
Ja, wobei zur Klarstellung dazugesagt werden muss, dass die Variable dort nicht entries heißen muss. Du kannst sie auch phoneList nennen und dann phoneList.add(...) aufrufen.
 

coldstone

Bekanntes Mitglied
Ich versuche das Array mittels toStrong auszugeben, nur klappt es nicht.

public String toString() {

for (TelephoneEntry entry : entries) {
??????
}}
Was muss ich in die for schleife reinbringen, damit ich in meiner Tester Klasse die toString benutzen kann???
 

mihe7

Top Contributor
Java:
public class TelephoneList implements TelephoneListSpec {

...
    @Override
    public String toString() {
        StringJoiner j = new StringJoiner("\n");
        for (TelephoneEntry entry : entries) {
            j.add(entry.toString());
        }
        return j.toString();
    }
...
 

coldstone

Bekanntes Mitglied
Dieser StringJoiner ist was ganz neues oder?

Java:
    String b = phoneList.toString();
        System.out.println(b);

Damit kann ich die toString methode on meinem tester nicht aufrufen oder?
 

coldstone

Bekanntes Mitglied
Also mit nicht aufrufen können meinte ich, das dieser code:

Java:
import java.io.*;
import java.util.*;

public class telephoneTester {
    
    public static void main(String args[]) {
        
        TelephoneList phoneList = new TelephoneList();
        String b = phoneList.toString();   
        phoneList.add("Felix", "0160555463");
        phoneList.add("Max", "01604589");

        System.out.println(b);
    }
}
zwar keine Fehlermeldung gibt, aber auch nichts in der Konsole ausgibt. Es bleibt leer.
 

coldstone

Bekanntes Mitglied
Die for schleife durchläuft meine ArrayList entries durch.
Die ist aber Leer, wenn ich das richtig verstehe.
Nur wie übergebe ich meine phoneList in meinen ArrayList entries????
 

mihe7

Top Contributor
Die for schleife durchläuft meine ArrayList entries durch.
Die ist aber Leer, wenn ich das richtig verstehe.
Richtig.

Nur wie übergebe ich meine phoneList in meinen ArrayList entries????
Du scheinst immer noch ein Verständnisproblem zu haben. Mal im Zusammenhang:
Java:
public class TelephoneList implements TelephoneListSpec {

    public List<TelephoneEntry> entries = new ArrayList<>();
    
    public void add(String name, String nummer) {
        entries.add(new TelephoneEntry(name, nummer));
    }

    @Override
    public String toString() {
        StringJoiner j = new StringJoiner("\n");
        for (TelephoneEntry entry : entries) {
            j.add(entry.toString());
        }
        return j.toString();
    }
}

Mit der Klasse TelephoneList definierst Du einen neuen Typ, von dem Du Instanzen (hier: Objekte) erzeugen kannst. Die Klasse gibt an, welche Attribute und welche Methoden ein solches Objekt zur Verfügung stellt.

Konkret sagst Du mir der Klasse, dass jedes TelephoneList-Objekt je ein ArrayList-Objekt besitzt, auf das mit der Variablen entries Bezug genommen wird. Außerdem besitzt jedes TelephoneList-Objekt einer add-Methode, die der ArrayList "entries" einen Entrag hinzufügt. Darüber hinaus gibt es die Methode toString(), die eine Darstellung der Einträge aus der ArrayList "entries" als Zeichenkette (String) liefert.

Um mit einem TelephoneList-Objekt arbeiten zu können, musst Du erst einmal eines erzeugen. Das machst Du in Deinem telepohoneTester (übrigens schreibt man Klassennamen in Java in UpperCamelCase):
Java:
public class telephoneTester {
    
    public static void main(String args[]) {
        
        TelephoneList phoneList = new TelephoneList();
        String b = phoneList.toString();   
        phoneList.add("Felix", "0160555463");
        phoneList.add("Max", "01604589");

        System.out.println(b);
    }
}
Mit TelephoneList phoneList deklarierst Du eine Variable phoneList vom Typ TelephoneList. Mit new TelephoneList() erzeugst Du eine neue Instanz (Objekt) der Klasse TelephoneList. Durch die Zuweisung (=) an phoneList ermöglichst Du es Dir, auf das erzeugte Objekt über die Variable phoneList zuzugreifen.

Wenn Du jetzt phoneList.add("Felix", "0160555463"); aufrufst, wird die add-Methode des zuvor erzeugten TelephoneList-Objekts aufgerufen. Diese Methode erzeugt ihrerseits einen neuen Eintrag (TelephoneEntry-Objekt) und ruft anschließend die add-Methode des ArrayList-Objekts, auf das Du mit entries Bezug nimmst - mit dem Ergebnis, dass Du den erzeugten Eintrag der Liste hinzufügst.

Rufst Du davor allerdings phoneList.toString() auf, ist die Liste natürlich noch leer. Das Ergebnis steht zu diesem Zeitpunkt fest. Wann Du das Ergebnis ausgibst, spielt keine Rolle.

Beispiel:

Java:
public class telephoneTester {
    
    public static void main(String args[]) {      
        TelephoneList phoneList = new TelephoneList();
        System.out.println("Vor Felix: " + phoneList.toString());
        phoneList.add("Felix", "0160555463");
        System.out.println("Vor Max: " + phoneList.toString());
        phoneList.add("Max", "01604589");
        System.out.println("Am Ende: " + phoneList.toString());
    }
}
 

coldstone

Bekanntes Mitglied
Ok. erstmal vielen dank für die ausführliche Erklärung. Hat wirklich geholfen.
Nur verstehe ich diese blöde toString() methode immer noch nicht. Es wird trotzdem in der konsole nicht ein String ausgegeben.
 

coldstone

Bekanntes Mitglied
Java:
public class TelephoneEntry {

public String name;
public String nummer;

public TelephoneEntry(String name, String nummer) {
this.name = name;
this.nummer = nummer;
}

public String getName() {
    // TODO Auto-generated method stub
    return name;
}}
 

coldstone

Bekanntes Mitglied
Es wird schon was ausgegeben, aber nicht als String.
Java:
Vor Felix:
Vor Max: TelephoneEntry@15db9742
Am Ende: TelephoneEntry@15db9742
TelephoneEntry@6d06d69c
 

mihe7

Top Contributor
Das ist ein String, aber nicht der, den Du gerne hättest :)

Aktuell wird in TelephoneList#toString() für die Ausgabe eines TelephoneEntry-Objekts dessen toString()-Methode verwendet. Diese Methode ist in Klasse Object (von der alle Klassen automatisch abgeleitet sind) derart definiert, dass ein kryptischer String (Klassenname@Hash) ausgegeben wird.

Du hast jetzt zwei Möglichkeiten:
1. Du überschreibst die toString()-Methode in TelephoneEntry, so dass ein sinnvoller String zurückgegeben wird:

Java:
public class TelephoneEntry {
...
    @Override
    public String toString() {
        return name + " " + nummer;
    }
}

2. Du änderst die toString()-Methode in TelephoneList, so dass nicht mehr toString() sondern z. B. getName() verwendet wird.

Java:
    @Override
    public String toString() {
        StringJoiner j = new StringJoiner("\n");
        for (TelephoneEntry entry : entries) {
            j.add(entry.getName() + " " + entry.getNummer());
        }
        return j.toString();
    }

Natürlich müssen dann in TelephoneEntry die Methoden getName() und getNummer() auch existieren.
 

coldstone

Bekanntes Mitglied
Ok, du bist mein Held. :)
Es funktioniert zumindest jetzt mit
Java:
public class TelephoneEntry {
...
    @Override
    public String toString() {
        return name + " " + nummer;
    }
}

Ich verstehe zwar immer noch nicht die logische ablaufweise zwischen diesen dreien:

Java:
public class telephoneTester {
.
.
.
System.out.println("Vor Max: " + phoneList.toString());
.
.
.
Java:
public String toString() {
    StringJoiner j = new StringJoiner("\n");
    for (TelephoneEntry entry : entries) {
        j.add(entry.toString());
    }
    return j.toString();
}

Java:
public String toString() {
    return name + " " + nummer;
}
Vielen vielen dank für die Zeit und mühe.
Werde mal ein bischen damit weiterbasteln. Vielelicht leuchtet es ja dann ein. :)
 

temi

Top Contributor
Aber wir können ja mal mit dem einfachsten anfangen:
Java:
System.out.println("Vor Max: " + phoneList.toString());

// wir reduzieren mal auf das nötigste:

System.out.println(phoneList.toString()); // hier wird die Methode toString() von phoneList aufgerufen.

System.out.println(phoneList); // das hier geht ebenfalls, weil println() intern auch toString() aufruft.
 

coldstone

Bekanntes Mitglied
Das heist es gibt eine vordefinierte methode toString() in der Java Bibliothek.
Diese überschreiben wir mit unserer eigenen Methode:
Java:
public String toString() {
    StringJoiner j = new StringJoiner("\n");
    for (TelephoneEntry entry : entries) {
        j.add(entry.toString());
    }
    return j.toString();
}

und diese wird wiederum durch diese methode überschrieben:

Java:
public String toString() {
    return name + " " + nummer;
}

Verstehe ich das richtig?

Mir ist nicht ganz schlüssig wie dieser code :

Java:
  System.out.println(phoneList.toString());

zuerst weis, auf welche toString() methode zuerst greift und warum?

Erste toString() Methode:
Java:
public String toString() {
    StringJoiner j = new StringJoiner("\n");
    for (TelephoneEntry entry : entries) {
        j.add(entry.toString());
    }
    return j.toString();
}

Zweite toString() Methode

Java:
public String toString() {
    return name + " " + nummer;
}
 

lennero

Bekanntes Mitglied
Das heist es gibt eine vordefinierte methode toString() in der Java Bibliothek.
Diese überschreiben wir mit unserer eigenen Methode:
Java:
public String toString() {
    StringJoiner j = new StringJoiner("\n");
    for (TelephoneEntry entry : entries) {
        j.add(entry.toString());
    }
    return j.toString();
}


"Class Object is the root of the class hierarchy. Every class has Object as a superclass. All objects, including arrays, implement the methods of this class. "
 

mihe7

Top Contributor
Das heist es gibt eine vordefinierte methode toString() in der Java Bibliothek.
Diese überschreiben wir mit unserer eigenen Methode:
Richtig.
und diese wird wiederum durch diese methode überschrieben:
Nein, die Klassen sind nicht in einer Hierarchie. Beide überschreiben die Methode, die sie von Object geerbt haben.

Ein
Java:
class X {
}
ist gleichbedeutend mit
Java:
class X extends Object {
}

Es folgt:

Java:
class A {
    // überschreibt Object#toString()
    String toString() { return "A"; }
}
class B {
    // überschreibt Object#toString()
    String toString() { return "B"; }
}
class C extends A {
    // überschreibt A#toString()
    String toString() { return "B"; }
}
 

mihe7

Top Contributor
Oops vergessen:

zuerst weis, auf welche toString() methode zuerst greift und warum?
Du gibst ja beim Methodenaufruf das Objekt an: phoneList.toString() -> es wird die toString()-Methode von phoneList verwendet. Das phoneList vom Typ TelephoneList ist, wird die dort definierte toString()-Methode aufgerufen.

Innerhalb dieses Aufrufs wird nun entry.toString() aufgerufen. Da entry vom Typ TelephoneEntry ist, wird an dieser Stelle die dort definierte toString()-Methode aufgerufen.
 

coldstone

Bekanntes Mitglied
Erstmals vielen dank für die Erklärung.

Wenn ich jetzt einen namen entfernen will, verwende ich eine remove() methode?
Einfach add() mit remove() verändern funktioniert nicht oder?
Zumindest klappt es bei mir nicht.
 

temi

Top Contributor
Naja ich meine das funktioniert nicht.
Java:
phoneList.remove("Hans", "0160512583");

Aus der Doku:

remove(int index)
Removes the element at the specified position in this list (optional operation).

Das heißt du musst den Index des zu löschenden Elements angeben.

Edit: ODER

remove(Object o)
Removes the first occurrence of the specified element from this list, if it is present (optional operation).

Du musst das zu löschenden Objekt angeben, in deinem Fall also ein Objekt vom Typ TelephoneEntry. Dafür kann es allerdings noch notwendig sein, dass du auch equals() (und hashCode()) überschreiben musst. Siehe dazu: https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)

Die Doku ist dein Freund!!!
 
Zuletzt bearbeitet:

coldstone

Bekanntes Mitglied
Kann mir bitte einer sagen warum ich hier eine checkstyle fehlermeldung bekomme:

Java:
public class MyArrayList<E> implements MyArrayListInterface<E> {
     /**initialisierung.
     * @param customArray
     * @param idx
     * @param intCap
     * @param newCap
     */
    private E[] customArray;
    /** id.*/
    private int idx;
    /**interne kapazität.*/
    private int intCap;
    /**neue kapazität.*/
    private int newCap;
    .
    .
    .

Folgende fehlermeldung erscheint:

Code:
[WARN] MyArrayList.java:1: Type Javadoc comment is missing @param tag. [JavadocType]

Die Parameter sind doch alle angebeben?

Ich denke es liegt hieran:
Code:
* @param customArray

Nur warum?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Frage über List Java Basics - Anfänger-Themen 3
D Array List mit Objekten sortieren Java Basics - Anfänger-Themen 2
J Array.list vergleichen Java Basics - Anfänger-Themen 1
B Vektor vs List Java Basics - Anfänger-Themen 4
volcanos Addition -> List<Integer> mit Arrays.asList() versus List<Integer>ArrayList<>() Java Basics - Anfänger-Themen 14
H Interface Wieso "List<String> list = new ArrayList<>[…]" Java Basics - Anfänger-Themen 4
T Linked List set-Methode Java Basics - Anfänger-Themen 2
volcanos List & ArrayList nach Familiennamen abfragen Java Basics - Anfänger-Themen 57
berserkerdq2 Ich gebe eine ArrayList als List zurück per MEthode, wie kann ich nun aber die ArrayList speichern? Java Basics - Anfänger-Themen 46
L Datentypen Array List Java Basics - Anfänger-Themen 9
J Java List, Bitte um Hilfe Java Basics - Anfänger-Themen 15
J Java List, bitte um Hilfe Java Basics - Anfänger-Themen 3
F GSON file mit einer List erstellen Java Basics - Anfänger-Themen 2
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
O Collections.sort und List.sort mit Lambda Verwirrung Java Basics - Anfänger-Themen 5
J String Array zu Map<Character, List<Character>> mit Streams Java Basics - Anfänger-Themen 1
G Linked list, Methode zum Vertauschen von Elementen Java Basics - Anfänger-Themen 14
I csv auslesen, mittels List Java Basics - Anfänger-Themen 18
I Methoden List.contains() beim 2. Element = true Java Basics - Anfänger-Themen 1
N HashMap in List good practice? Java Basics - Anfänger-Themen 2
B SWAP List; Liste neu anordnen Java Basics - Anfänger-Themen 4
W Stream Array List - Frage Java Basics - Anfänger-Themen 5
E Interface List nicht als Collection an erkannt. Java Basics - Anfänger-Themen 14
X Array List geordnet ausgeben. (JSF und JAVA) Java Basics - Anfänger-Themen 1
D new arraylist (List) dynamisch erstellen Java Basics - Anfänger-Themen 1
Yjuq Generic Methode - Wie muss die List Definition aussehen? Java Basics - Anfänger-Themen 3
M List<String> auswählen Java Basics - Anfänger-Themen 42
F In List Rekursiv suchen Java Basics - Anfänger-Themen 12
B Unterschied zwischen (List<T> a) und (T[] a) Java Basics - Anfänger-Themen 7
T HashSet in List-Object Java Basics - Anfänger-Themen 5
B ENUM to List<String> konvertieren Java Basics - Anfänger-Themen 2
E Array-list mit einer bestimmten Länge Java Basics - Anfänger-Themen 17
B Sorting List und Remove Java Basics - Anfänger-Themen 2
B String: suche nach Wörter und in List<String> speichern Java Basics - Anfänger-Themen 3
M Methode überladen - Array List Java Basics - Anfänger-Themen 5
L LIST.ADD Java Basics - Anfänger-Themen 2
M XWPF - Bullet Point list erstellen Java Basics - Anfänger-Themen 1
I <List> sortieren Java Basics - Anfänger-Themen 2
N Klassen List-Art Java Basics - Anfänger-Themen 5
S List<T<X,Y> sortieren Java Basics - Anfänger-Themen 5
Salo Datentypen "Doppelt" List(e) ("gesucht") Java Basics - Anfänger-Themen 6
F .csv Export aus einer list Java Basics - Anfänger-Themen 25
T KlausurÜbung- Förderband-Linked List Java Basics - Anfänger-Themen 53
D Komischer Fehler nach <Integer> List Java Basics - Anfänger-Themen 2
B in einem abstrakten Set ,Elemente einer einfache verkettete List epeichern Java Basics - Anfänger-Themen 13
T List und ArrayList Java Basics - Anfänger-Themen 3
UnityFriday method getPrevious in class List<ContentType> cannot be applied to given types Java Basics - Anfänger-Themen 29
hooked Verkettete Liste / linked list Java Basics - Anfänger-Themen 2
T Datentypen InputStream to list of Int (or similar) Java Basics - Anfänger-Themen 4
D Input/Output CSV Parser list unvollständig Java Basics - Anfänger-Themen 25
V Erste Schritte Dateinamen aus einer FIle[] in eine List Java Basics - Anfänger-Themen 11
S Methoden Linked List Methoden können nicht aufgerufen werden Java Basics - Anfänger-Themen 1
U JAXB - List wird nicht ausgefüllt Java Basics - Anfänger-Themen 1
L Linked List - Array List Java Basics - Anfänger-Themen 2
J Einfach verkettet List: Ausgabe ohne null Java Basics - Anfänger-Themen 11
D Bestimmten Wert aus Array List ausgeben Java Basics - Anfänger-Themen 7
V Personenverwaltung mit List<>, falsche Ausgaben Java Basics - Anfänger-Themen 5
M List befüllen Java Basics - Anfänger-Themen 3
S Datentypen List.toString wirft NullPointerException Java Basics - Anfänger-Themen 5
P Anlegen und Abfragen von Array List Java Basics - Anfänger-Themen 4
S Element von List<E> in String umwandeln Java Basics - Anfänger-Themen 3
A Wie nutze ich List<List<String>> Java Basics - Anfänger-Themen 4
M Endlos schleife in List Java Basics - Anfänger-Themen 5
P Zufallszahlen ohne zahlen einer List Java Basics - Anfänger-Themen 21
C Array List mit String vergleichen und Fehlermeldung ausgeben Java Basics - Anfänger-Themen 6
S Probleme bei Ausgabe von rekursiver Methode (List) Java Basics - Anfänger-Themen 16
T Tabstopp in AWT-List? Java Basics - Anfänger-Themen 8
P Doppelte Einträge in eine List Java Basics - Anfänger-Themen 5
M Wozu Upcasting? Am Beispiel List = ArrayList Java Basics - Anfänger-Themen 2
A List mit integern füllen Java Basics - Anfänger-Themen 4
D sortieren von List<> Java Basics - Anfänger-Themen 2
B List - Drag&Drop Java Basics - Anfänger-Themen 8
SexyPenny90 Implementierung einer doubly linked list Java Basics - Anfänger-Themen 5
G Linked List Programm add Problem Java Basics - Anfänger-Themen 5
C List Abfragenproblem Java Basics - Anfänger-Themen 3
J List als anonyme Klasse Java Basics - Anfänger-Themen 9
H Collections List in List<SpecificType> als stat. generische Methode zurückgeben Java Basics - Anfänger-Themen 4
F Wozu braucht man array list? Java Basics - Anfänger-Themen 29
T Collections Wie funktioniert List() ? Java Basics - Anfänger-Themen 7
Kenan89 Java Date List Java Basics - Anfänger-Themen 4
tux20 Problem beim Schreiben von List to File Java Basics - Anfänger-Themen 2
K Frage Set List Java Basics - Anfänger-Themen 3
M Array List ausgeben Java Basics - Anfänger-Themen 13
C Typen aus List<Object[]> ändern Java Basics - Anfänger-Themen 7
S Gute List Implementation Java Basics - Anfänger-Themen 5
S Synchronisieren einer Linked List Java Basics - Anfänger-Themen 16
A List Array - wie instanzieren Java Basics - Anfänger-Themen 7
T List mit mehreren gleichen Strings bereinigen Java Basics - Anfänger-Themen 4
R List to BinaryTree Java Basics - Anfänger-Themen 13
P Set mit List vergleichen Java Basics - Anfänger-Themen 8
Binary.Coder List bzw. ArrayList als String ausgeben Java Basics - Anfänger-Themen 2
J Datentypen List - gleiche Einträge bei neuen Objekten Java Basics - Anfänger-Themen 31
T List.add(Object) führt zu NullPointerException Java Basics - Anfänger-Themen 14
M Collections Cast bei ArrayList (List) Java Basics - Anfänger-Themen 2
B List list - anstatt ArrayList list = new ArrayList Java Basics - Anfänger-Themen 10
H Remove Methode von List Java Basics - Anfänger-Themen 6
T Datentypen List<?> Java Basics - Anfänger-Themen 5
E Linked List generisch Java Basics - Anfänger-Themen 5
S Einen neuen String ohne Array oder List erzeugen??? Java Basics - Anfänger-Themen 13
S List angaben in textfelder Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben