Wie verbinde ich Klassen in BlueJ?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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.

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?

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;

}

}
0
@IchNeedeHelP

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.

0
@DreiGegengifts

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;

}

}
0
@IchNeedeHelP

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.

0
@DreiGegengifts

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.

0
@IchNeedeHelP

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.

1
@DreiGegengifts

Okay, dankeschön :) Wenn ich nun keinen neuen Kunden erstellen möchte, sondern auf den alten zugreifen möchte. Wie mache ich das?

0
@IchNeedeHelP

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.

1

Ein simples Beispiel, welches beide Möglichkeiten darstellt:

public class A {
  public void rechne(){
    int differenz = B.subtrahiere(2, 1);
    
B b = new B(); // erzeugt neue Instanz von Klasse B int summe = b.addiere(3, 4); } }
public class B { public static int subtrahiere(int minuend, int subtrahend){ return minuend - subtrahend; }
public int addiere(int summand1, int summand2) { return summand1 + summand2; } }

Entweder du verwendest objektgebundene oder objektungebundene (statische) Methoden. Erstere rufst du über die Instanz der Klasse auf, letztere über die Klasse selbst.

Statische Methoden verwendest du dann, wenn sie unabhängig zu einer konkreten Instanz arbeiten, wie in diesem Beispiel diese Berechnung.

Es gilt zu beachten, dass die Methoden nach außen hin für die Klasse A sichtbar sein müssen. Weiteres dazu kannst du hier nachlesen:

http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_05_002.htm#mjf5b3fff9748ae6323d1923016a906a8f

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?

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;
}

}
0
@IchNeedeHelP

Der erstellte Kunde hat noch keinen Namen. Den musst du ihm erst (via setName) zuweisen.

0

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?

0
@IchNeedeHelP

Methode muss für die andere Klasse sichtbar sein, wenn es keine statische Methode ist, muss eine Instanz der Klasse vorliegen.

0
@PerfectMuffin

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;

}

}
0
@IchNeedeHelP

Was für eine Ausgabe erwartest du? Das sollte "null" ausgeben. Der Kunde hat ja keinen Namen.

0
@PerfectMuffin

Das stimmt. Und wenn ich den Namen vorher gesetzt habe, müsste dann nicht der neue Name angezeigt werden?

0

Was möchtest Du wissen?