Wie verbinde ich Klassen in BlueJ?
Hallo, im Unterricht arbeiten wir zurzeit mit BlueJ. Nun habe ich drei Klassen erstellt. Von der Klasse A führen auch schon gestrichelte Pfeile zu den anderen beiden Klassen. Nun möchte ich in der Klasse A eine Methode haben, die eine Methode von Klasse B (mit der Klasse A ja irgendwie schon verbunden ist) aufruft. Dies haben wir in der Schule schon gemacht , ich konnte es mir allerdings nicht merken. Ich meine es hatte etwas mit "new" zu tun?! Ich bin totaler Neuanfänger in diesem Bereich, deshalb bin ich sehr dankbar für jede Hilfe. PS. dies ist keine Hausaufgabe!
2 Antworten
Klassen "verbindet" oder "koppelt" man, in dem man z.B. die eine Klasse in der andere Klasse verwendet.
(Voranmerkung: Klassen sind ja sozusagen Baupläne für konkrete Objekte)
Wenn du jetzt im Objekt a (der Klasse A) eine Objekt b (der Klasse B) mit new erzeugst, dann sind Klasse A und B miteinander "gekoppelt". Spricht du kannst in der Klasse A jetzt über a.methodenname() entsprechende Methoden aufrufen.
Wo wird denn die Klasse Autohaus erstellt? Und wann/wo wird getkunde1Name aufgerufen?
Momentan (von dem was du mir geschickt hast) wird der Name des Kunden nie gesetzt. Daher kann die Methode auch keinen Namen zurückliefern.
Bei dem fettgedruckten wird der Name gesetzt. Wenn ich dann bei einem Objekt dieser Klasse (also Kunde) getName ausführe, erhalte ich auch den Namen, aber wenn ich das über die Klasse Autohaus machen möchte, nicht.
public class Kunde
{
private int telefonnummer;
private String name;
public Kunde ()
{
}
public void setName(String pname)
{ this.name = pname;
}
public void setTelefonnummer(int ptelefonnummer)
{
this.telefonnummer = ptelefonnummer;
}
public String getName()
{
return name;
}
public int getTelefonnummer()
{
return telefonnummer;
}
}
Wie gesagt, um den Fehler zu finden müsste ich wissen, wann du was aufrufst und setzt.
Bei dem fettgedruckten wird der Name gesetzt.
Das ist klar. Aber wann/wo wird "setName" denn aufgerufen. Das ist eine der Fragen an dich.
Als erstes erstelle ich ein Objekt der Klasse Kunde, setze den Namen und rufe ihn dann über die Methode getName auf, zur Überprüfung. Dann erstelle ich ein Objekt der Klasse Auto und mache das gleiche.
Und dann erstelle ich ein Objekt der Klasse Autohaus, wo ich den Namen des Kunden über diese Methode erhalten möchte:
public String getkunde1Name()
{
return kunde1.getName();
}
Da kommt dann immer nur null raus. Was mir noch aufgefallen ist, ist dass ich wenn ich ein Objekt der Klasse Autohaus erstelle, nicht ein Objekt der Klasse Kunde und Auto anklicken muss.
Der Fehler liegt darin:
Klassen sind quasi Baupläne für Objekte. Aber in der Regel können von einer Klasse ein, zwei oder ganz viele Objekte erzeugt werden. Jedes dieser Objekte ist für sich eigenständig (technisch gesprochen: jedes Objekt hat seinen eigenen Speicherbereich).
Du erstellst jetzt erst mal ein Objekt von der Klasse Kunde und gibst diesen Kunden einen Namen.
Danach erstellst du das Autohaus. In der Erstellungsmethode (nennt man auch "Konstruktor") erzeugst du einen neuen Kunden. Dem seinen Namen rufst du dann später ab. Aber der hat natürlich keinen. Du hast ihn ja nie gesetzt.
Du hast also 2 Objekte vom Kunden. Und nur beim 1. Objekt hast du einen Namen gesetzt.
Okay, dankeschön :) Wenn ich nun keinen neuen Kunden erstellen möchte, sondern auf den alten zugreifen möchte. Wie mache ich das?
Dann muss du dem Autohaus den von dir erstellten Kunden übergeben.
Dafür braucht das Autohaus eine sogenannte "Setter-Methode":
public void setKunde( Kunde kunde ){
kunde1 = kunde;
}
Die Methode kannst du dann nach Erstellen des Autohauses aufrufen und dort deinen am Anfang erstellten Kunden dem Autohaus übergeben.
Sinnvoller wäre natürlich, du holst dir den Kunden, der schon im Autohaus ist (der wurde ja über den Konstruktor angelegt) und setzt darauf den Namen, statt vorher noch mal einen anzulegen.
Was verstehst du hier unter "verbunden"?
Es gibt keine Mechanic bei Java, nach der Klassen "verbunden" werden, wenn man nur Funktionen einer Klasse von einer anderen aufruft, werden die beiden in UML-Diagrammen in der Regel verbunden, aber zwischen UML und Java besteht keine enge Beziehung.
Einige verwenden einfach UML, um Java zu visualisieren.
okay, also ich meine wahrscheinlich ein solches UML-Diagramm.. :D Wie muss ich denn jetzt die Methode in Klasse A aufbauen, um mit ihr eine Methode einer anderen Klasse aufrufen zu können?
Methode muss für die andere Klasse sichtbar sein, wenn es keine statische Methode ist, muss eine Instanz der Klasse vorliegen.
ok, danke:)
Wenn das hier die "Hauptklasse" sein soll, was könnte der Fehler sein, dass ich nicht den Namen des Kunden erhalte, wenn ich die Methode getkunde1Name aufrufe?
public class Autohaus
{
private Auto auto1;
private Kunde kunde1;
public Autohaus ()
{
auto1 = new Auto();
kunde1 = new Kunde();
}
public String getkunde1Name()
{
return kunde1.getName();
}
}
Das hier ist die Klasse Kunde:
public class Kunde
{
private int telefonnummer;
private String name;
public Kunde ()
{
}
public void setName(String pname)
{ this.name = pname;
}
public void setTelefonnummer(int ptelefonnummer)
{
this.telefonnummer = ptelefonnummer;
}
public String getName()
{
return name;
}
public int getTelefonnummer()
{
return telefonnummer;
}
}
Was für eine Ausgabe erwartest du? Das sollte "null" ausgeben. Der Kunde hat ja keinen Namen.
Das stimmt. Und wenn ich den Namen vorher gesetzt habe, müsste dann nicht der neue Name angezeigt werden?
Erstmal dankeschön:)
Wenn das hier die "Hauptklasse" sein soll, was könnte der Fehler sein, dass ich nicht den Namen des Kunden erhalte, wenn ich die Methode getkunde1Name aufrufe?
Das hier ist die Klasse Kunde: