Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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"); ??????
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.
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.
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???
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????
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());
}
}
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.
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;
}}
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.
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.
"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. "
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.
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.