Klassen wiederverwenden

morphi79

Erfahrenes Mitglied
Hallo, ich schon wieder. Ich bin ja gerade am erlernen von JAVA. Bis gestern war mir noch eigentlich das meiste klar, doch heute bin ich ein bisschen ratlos. Ich habe eine Aufgabe die ich im Moment nicht lösen kann. Sie lautet:


Es soll eine Applikation erstellt werden, die aus den Klassen Adresse, Kunde,

AuslandsKunde und KundenStarter besteht. Die Klassen Adresse und

KundenStarter existieren bereits. Die Klassen Kunde und AuslandsKunde sollen

von Ihnen implementiert werden.

Erstellen Sie eine Klasse Kunde, an die folgende Anforderungen gestellt werden:

• Die Klasse hat die Instanzvariablen kundennummer vom Typ int, name und

anrede vom Typ String und adresse vom Typ Adresse. Alle Variablen sollen

von außen nur über Methoden der Klasse les- und änderbar sein. Die

Kundennummer soll nicht veränderbar sein.

• Eine Klassenvariable count vom Typ int soll die Anzahl der bereits erzeugten

Instanzen der Klasse Kunde zählen.

• Der Konstruktor initialisiert die Instanzvariablen bis auf kundennummer durch die

Werte seiner Argumente. (Achten Sie dabei darauf, dass die Reihenfolge der

Parameter zu den Konstruktoraufrufen in der Klasse KundenStarter passt.)

Der Wert von kundennummer wird durch den aktuellen Wert von count

festgelegt. Dadurch bekommt jeder Kunde eine eindeutige Kundennummer.

• Die Klasse soll über eine Methode print() verfügen, die den aktuellen Wert

aller Instanzvariablen ausgibt.

Erstellen Sie eine weitere Klasse AuslandsKunde, an die folgende Anforderungen

gestellt werden:

• Die Klasse AuslandsKunde erbt von der Klasse Kunde.

• Die Klasse AuslandsKunde besitzt eine zusätzliche Instanzvariable land vom

Typ String. Auch diese Variable soll sich nur über Methoden der Klasse lesen

und ändern lassen.

• Der Konstruktor initialisiert sowohl die Basisklasse Kunde als auch die

zusätzliche Instanzvariable. (Auch hier soll der Konstruktor wieder zu den

Konstruktoraufrufen in der Klasse KundenStarter passen.)

• Die Methode print() wird überschrieben, um zusätzlich den Wert von land

auszugeben.

Testen Sie die Applikation indem Sie alle Klassen übersetzen und die Klasse

KundenTester starten.

Hier sind die zwei Dateien KundenStarter und Adresse

Code:
public class KundenStarter {
	public void start() {
		// Polymorphe Referenz
		Kunde kunde;
 
		Adresse adr1 = new Adresse("Musterstrasse", "12",
	 "88888", "Musterstadt");
		Adresse adr2 = new Adresse("PennyLane", "1", "X1234", "London");
 
		// kunde referenziert normalen Kunden
		kunde = new Kunde("Huber", "Herr", adr1);
		kunde.print(); // print() in Kunde
 
		System.out.println();
 
		// kunde referenziert nun einen AuslandKunden
		kunde = new AuslandsKunde("Graves", "Mister", adr2, "England");
		kunde.print(); // print() in AuslandKunde
	}
 
	public static void main(String[] args) {
		KundenStarter app = new KundenStarter();
		app.start();
	}
}

Code:
public class Adresse {
	// Instanzvariablen
	private String strasse;
	private String hausNr;
	private String postleitzahl;
	private String stadt;
 
	// Konstruktor
	public Adresse(String strasse, String hausNr,
	 String postleitzahl, String stadt) {
		this.strasse = strasse;
		this.hausNr = hausNr;
		this.postleitzahl = postleitzahl;
		this.stadt = stadt;
	}
 
	// Methoden
	public String getStrasse() {
		return strasse;
	}
 
	public String getHausNr() {
		return hausNr;
	}
 
	public String getPostleitzahl() {
		return postleitzahl;
	}
 
	public String getStadt() {
		return stadt;
	}
 
	public void setStrasse(String s) {
		strasse = s;
	}
 
	public void setHausNr(String s) {
		hausNr = s;
	}
 
	public void setPostleitzahl(String s) {
		postleitzahl = s;
	}
 
	public void setStadt(String s) {
		stadt = s;
	}
 
	public void print() {
		System.out.println("Strasse: " + strasse + " " + hausNr);
		System.out.println("Stadt: " + postleitzahl + " " + stadt);
	}
}
Kann mir jemand dabei helfen, diese zwei Dateien zu erstellen? Ich habe bis jetzt folgendes gemacht:

Code:
public class kunde {
 
 
 
//Klassenvariable
 
static int count = 0;
 
 
 
//Instanzvariable
 
private int kundennummer;
 
 
 
//Konstruktur für Anzahl der Instanzen
 
public kunde() {
 
			count++;		 
 
			kundennummer = count;
 
			
 
}
 
 
 
 
 
}

So, damit müsste die Kundennummer immer um eines hoch gesetzt werden, oder?
Die Instanzvariablen, die einen unterschiedlichen Typ haben, wie kann ich die einbringen. Wenn ich schreibe
Code:
 privat int kundennummer;
privat string name;

kommt ein Fehler.

Kann mir jemand erklären warum das so ist?
 
Zuletzt bearbeitet:
Hallo,

das ist eine interessante Aufgabe. Ich möchte dir nicht den Spass nehmen sie für dich zu lösen auch wenn es mich in den Fingern juckt. :)

Ok, diese Fehler, von denen du sprichst, können eigenlich nur durch eine Deklaration der Variablen an der falschen Stelle entstehen oder durch einen Tippfehler (string != String)

Evtl. hilft dir das ja schon weiter.

Grüsse TrueSun
 
Bei private fehlt ein e. Das könnte auch ein Fehler sein.

Je nach IDE sollte auch eine Warnung auftauchen, denn Klassennamen schreibt man in Java für gewöhnlich groß. So ist die Klasse Kunde auch in der KundenStarter-Klasse verwendet.

Statische Variablen sollte man über Klassenname.variablenname ansprechen, also Kunde.count++;. Das erhöht die Übersicht im Quelltext, da sofort erkennbar ist wo die Variable, die Du änderst, herkommt. Das sehen zwar nicht alle so, aber ich für meinen Teil habe es mir so angewöhnt.
 
ok, soweit sogut. Das mit den Instanzvariablen und dem Count funktioniert jetzt.



Code:
public class Kunde {
//Klassenvariable
static int count = 0;
//Instanzvariable
private int kundennummer;
private String name;
private String anrede;
private String adresse;
 
//Konstruktor für Anzahl der Instanzen
public Kunde() {
Kunde.count++; 
kundennummer = count;
 
}
 
//Konstruktor für Initialisierung der Instanzvariablen
public Kunde (String newName, String newAnrede, String newAdresse) {
name = newName;
anrede = newAnrede;
adresse = newAdresse;
}
//Methode Print 
public void zeigeAttribute() {
System.out.println("Kundennummer:" + kundennummer);
System.out.println("Name:" + name);
System.out.println("Anrede:" + anrede);
System.out.println("Adresse:" + adresse);
 
}
}

Ist das richtig bis jetzt? Ich wollte damit folgendes erreichen:

Die Klasse hat die Instanzvariablen kundennummer vom Typ int, name und

anrede vom Typ String und adresse vom Typ Adresse. Alle Variablen sollen

von außen nur über Methoden der Klasse les- und änderbar sein. Die

Kundennummer soll nicht veränderbar sein.

• Eine Klassenvariable count vom Typ int soll die Anzahl der bereits erzeugten

Instanzen der Klasse Kunde zählen.

• Der Konstruktor initialisiert die Instanzvariablen bis auf kundennummer durch die

Werte seiner Argumente. (Achten Sie dabei darauf, dass die Reihenfolge der

Parameter zu den Konstruktoraufrufen in der Klasse KundenStarter passt.)

Der Wert von kundennummer wird durch den aktuellen Wert von count

festgelegt. Dadurch bekommt jeder Kunde eine eindeutige Kundennummer.

• Die Klasse soll über eine Methode print() verfügen, die den aktuellen Wert

aller Instanzvariablen ausgibt.
 
Zuletzt bearbeitet:
Hallo,

diesen Punkt hast du noch nicht erfüllt:
Alle Variablen sollen
von außen nur über Methoden der Klasse les- und änderbar sein. Die
Kundennummer soll nicht veränderbar sein.
Dafür braucht du die sogenannten Getters und Setters.

Beispiel:
Code:
public String getName()
 {
 	return name;
 }
 
 public void setName(String name)
  {
  	this.name = name;
  }
 
Ist es so besser?


Code:
public class Kunde {
//Klassenvariable
static int count = 0;
//Instanzvariable
private int kundennummer;
private String name;
private String anrede;
private String adresse;
 
// Getters und Setters
 
public String getName() {
return name;
}
 
public void setName(String name) {
this.name = name;
}
public String getAnrede() {
return anrede;
}
 
public void setAnrede(String anrede) {
this.anrede = anrede;
}
 
public String getAdresse() {
return adresse;
}
 
public void setAdresse(String adresse) {
this.adresse = adresse;
}
//Konstruktor für Anzahl der Instanzen
public Kunde() {
Kunde.count++; 
kundennummer = count;
 
}
 
//Konstruktor für Initialisierung der Instanzvariablen
public Kunde (String newName, String newAnrede, String newAdresse) {
name = newName;
anrede = newAnrede;
adresse = newAdresse;
}
//Methode Print 
public void zeigeAttribute() {
System.out.println("Kundennummer:" + kundennummer);
System.out.println("Name:" + name);
System.out.println("Anrede:" + anrede);
System.out.println("Adresse:" + adresse);
 
}
}
 
So, die Klasse Kunde müsste jetzt eigentlich richtig funktionieren. Nun soll noch eine Klasse AuslandsKunde gemacht werden, mit folgenden Eigenschaften:

• Die Klasse AuslandsKunde erbt von der Klasse Kunde.

• Die Klasse AuslandsKunde besitzt eine zusätzliche Instanzvariable land vom

Typ String. Auch diese Variable soll sich nur über Methoden der Klasse lesen

und ändern lassen.

• Der Konstruktor initialisiert sowohl die Basisklasse Kunde als auch die

zusätzliche Instanzvariable. (Auch hier soll der Konstruktor wieder zu den

Konstruktoraufrufen in der Klasse KundenStarter passen.)

• Die Methode print() wird überschrieben, um zusätzlich den Wert von land

auszugeben.


Code:
//Klasse AuslandsKunde mit vererbten Eigenschaften von der Klasse Kunde
class AuslandsKunde extends Kunde {
 
// Alle Eigenschaften und Variablen von Kunde sind enthalten, eine Variable
// land muss noch eingefügt werden.
private String land;
//Getter und Setter (Auch diese Variable soll sich nur über Methoden der Klasse lesen
//und ändern lassen.)
public String getLand() {
return land;
}
public void setLand(String land) {
this.land = land;
}
//Konstruktor soll die Basisklasse Kunde initialsieren, als auch die Instanzvariable
//land. 
public AuslandsKunde (String newLand) {
super(NewName, NewAnrede, NewAdresse); // Initialisierung des Konstruktors der Klasse Kunde
this.land = newLand; // Initialisierung von der Instanzvariable land
}
}

Leider kommt beim ausführen ein Fehler?

javac AuslandsKunde.java
AuslandsKunde.java:2: cannot resolve symbol
symbol : class Kunde
location: class AuslandsKunde
public class AuslandsKunde extends Kunde {
 
Zuletzt bearbeitet:
Hi ohne jetzt genau reingeschaut zu haben:


hast du die .class datei im selben Verzeichnis?
Binde das Verzeichnis als CLASSPATH ein falls nicht.

Ist die Klasse mit einem package verknüpft, sprich ist es in einem package drin?
Dann musst du die Klasse erstmal importieren mit dem import kommando

Gruss
Torsten.
 
ja, die class datei ist im gleichen verzeichnis.


habe es auch schon so probiert:

hier die kunde.java

Code:
//Paketzuordnung
package Adressdatenbank;
public class Kunde {
   //Klassenvariable
   static int count = 0; //Grund: Eine Klassenvariable count vom Typ int soll die Anzahl der bereits erzeugten
   //Instanzen der Klasse Kunde zählen. 
   //Instanzvariable
   private int kundennummer;
   private String name;
   private String anrede;
   private String adresse;
  
   // Getters und Setters (Grund: Alle Variablen sollen von außen nur über Methoden der Klasse les- und änderbar sein. Die
	  //Kundennummer soll nicht veränderbar sein. 
   public String getName() {
  return name;
   }
   public void setName(String name)  {
   this.name = name;
   }
   public String getAnrede() {
  return anrede;
   }
   public void setAnrede(String anrede)  {
   this.anrede = anrede;
   }
   public String getAdresse() {
  return adresse;
   }
   public void setAdresse(String adresse)  {
   this.adresse = adresse;
   }
   //Konstruktor für Anzahl der Instanzen
   public Kunde() {
 Kunde.count++; 
 kundennummer = count;
 
   }
   
  //Konstruktor für Initialisierung der Instanzvariablen
  public Kunde (String name, String anrede, String adresse) {
 this.name = name;
 this.anrede = anrede;
 this.adresse = adresse;
  }
  //Methode Print 
  public void zeigeAttribute() {
 System.out.println("Kundennummer:" + kundennummer);
 System.out.println("Name:" + name);
 System.out.println("Anrede:" + anrede);
 System.out.println("Adresse:" + adresse);
 
  }
}
und hier die AuslandsKunde.java

Code:
//Paketzuordnung
package Adressdatenbank;
//Klasse AuslandsKunde mit vererbten Eigenschaften von der Klasse Kunde
class AuslandsKunde extends Kunde {
   
   // Alle Eigenschaften und Variablen von Kunde sind enthalten, eine Variable
   // land muss noch eingefügt werden.
   private String land;
   //Getter und Setter (Auch diese Variable soll sich nur über Methoden der Klasse lesen
  //und ändern lassen.)
   public String getLand() {
  return land;
   }
   public void setLand(String land)  {
   this.land = land;
   }/*
   //Konstruktor soll die Basisklasse Kunde initialsieren, als auch die Instanzvariable
   //land. 
   public AuslandsKunde (String newLand) {
 super(name, anrede, adresse); // Initialisierung des Konstruktors 
 this.land = newLand; 
   }*/
}
 
Hallo,

Code:
     public AuslandsKunde (String newLand) 
{
   super(name, anrede, adresse); // Initialisierung des Konstruktors 
   this.land = newLand; 
    }
Woher bekommst du denn name, anrede und adresse?
 

Neue Beiträge

Zurück