uebungsblatt 2, java-aufgaben

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

uebungsblatt 2, java-aufgaben
hi,
falls es wen interessiert: hier mal meine programmierten sachen zu den verschiedenen aufgaben.

zu 5)

public abstract class Konto {
	protected double kontostand = 0;
	
	public void abheben (double betrag) {
		if (kontostand >= betrag) {
			this.kontostand = this.kontostand - betrag;
		} else {
			System.out.println ("Konto ist nicht gedeckt.");
		}
	}
	
	public void einzahlen (double betrag) {
		this.kontostand = this.kontostand + betrag;
	}
	
	public double kontostand () {
		return this.kontostand;
	}
	
}


public class Girokonto extends Konto {
	private double dispolimit = 0;
	// dispolimit soll immer positiv oder gleich null sein
	
	public void set_dispolimit (double dispolimit) {
		this.dispolimit = dispolimit;
	}
	
	public double get_dispolimit () {
		return this.dispolimit;
	}
	
	public void abheben (double betrag) {
		if ((this.kontostand + this.dispolimit) >= betrag) {
			this.kontostand = this.kontostand - betrag;
		} else {
			System.out.println ("Dispolimit reicht nicht aus.");
		}
	}
}


public class Sparkonto extends Konto {
	private double zinssatz = 0.01;
	
	public void set_zinssatz (double zinssatz) {
		this.zinssatz = zinssatz;
	}
	
	public double get_zinssatz () {
		return this.zinssatz;
	}
	
	public void zinsen_gutschreiben () {
		this.kontostand = this.kontostand + 
			(this.kontostand * this.zinssatz);
	}
}


public class KontoTester {
	public static void main (String args[]){
		Girokonto giro1 = new Girokonto ();
		Sparkonto spar1 = new Sparkonto ();
		System.out.println (giro1.kontostand ());
		giro1.einzahlen (1000);
		System.out.println (giro1.kontostand ());
		giro1.set_dispolimit (500);
		giro1.abheben (1000);
		System.out.println (giro1.kontostand ());
		giro1.abheben (1000);
		System.out.println (spar1.kontostand ());
		spar1.einzahlen (2000);
		spar1.zinsen_gutschreiben ();
		System.out.println (spar1.kontostand ());
	}
}

zu 2b)

public class MeineKlasse {
	private static int anzahl_instanzen = 0;
	
	public MeineKlasse () {
		anzahl_instanzen++;
	}
	
	public int get_anzahl_instanzen () {
		return this.anzahl_instanzen;
	}
}


public class MeineKlasseTester {
	public static void main (String args[]){
		MeineKlasse instanz1 = new MeineKlasse ();
		System.out.println (instanz1.get_anzahl_instanzen ());
		MeineKlasse instanz2 = new MeineKlasse ();
		System.out.println (instanz1.get_anzahl_instanzen ());
		MeineKlasse instanz3 = new MeineKlasse ();
		System.out.println (instanz1.get_anzahl_instanzen ());
		MeineKlasse instanz4 = new MeineKlasse ();
		System.out.println (instanz1.get_anzahl_instanzen ());
		MeineKlasse instanz5 = new MeineKlasse ();
		System.out.println (instanz1.get_anzahl_instanzen ());
		System.out.println (instanz2.get_anzahl_instanzen ());
		System.out.println (instanz3.get_anzahl_instanzen ());
		System.out.println (instanz4.get_anzahl_instanzen ());
		System.out.println (instanz5.get_anzahl_instanzen ());
	}
}

zu 3)

public abstract class GeomObject {
	protected String name = "";
	
	public GeomObject (String name) {
		this.name = name;
	}
	
	public String get_name () {
		return this.name;
	}
	
	public abstract double get_area ();
}


public class Circle extends GeomObject {
	private double radius = 0.0;
	
	public Circle (double radius) {
		super ("Circle");
		this.radius = radius;
	}
	
	public double get_area () {
		return (Math.PI * Math.PI * this.radius);
	}
}


public class Square extends GeomObject {
	private double seite = 0.0;
	
	public Square (double seite) {
		super ("Square");
		this.seite = seite;
	}
	
	public double get_area () {
		return (this.seite * this.seite);
	}
}


public class GeomObjectGenerator {
	private static GeomObject generate_object () {
		int objektart = (int) (Math.random() * 2);
		if (objektart == 1) {
			double radius = (Math.random() * 5);
			Circle temp = new Circle (radius);
			return temp;
		} else {
			double seite = (Math.random() * 10);
			Square temp = new Square (seite);
			return temp;
		}
	}
	
	public static void main (String args[]){
		GeomObject o1;
		GeomObject o2;
		GeomObject o3;
		GeomObject o4;
		o1 = generate_object ();
		o2 = generate_object ();
		o3 = generate_object ();
		o4 = generate_object ();
		System.out.println (o1.get_name ());
		System.out.println (o1.get_area ());
		System.out.println (o2.get_name ());
		System.out.println (o2.get_area ());
		System.out.println (o3.get_name ());
		System.out.println (o3.get_area ());
		System.out.println (o4.get_name ());
		System.out.println (o4.get_area ());
	}
}

kewl dass du das ins Netz hast… hab selber noch überhaupt keinen plan von diesem Ober- / Unterklassenzeugs… :-/

hab aber ne Frage: was meint der Befehl “super”?


Das super ruft im Konstruktor einer abgeleiteten Klasse den Konstruktor der Mutter/Vaterklasse auf.
Damit kannst du dann Argumente an den Konstruktor der Mutter/Vaterklasser übergeben.
Rufst du super nicht explizit auf, dann wird nur der Standardkonstruktor (der, dessen
Parameterliste leer ist) aufgerufen.

In der Klasse Square wird durch das super(“Square”) der Konstruktor der Mutter/Vaterklasse
GeomObj mit dem Argument “square” aufgerufen und der Konstruktor von GeomObj setzt dann
die Variable name auf “square”.
Würdest du super(“square”) nicht angeben, dann würde die Variable name nicht verändert
werden. (Standardkonstruktor gibt es immer, auch wenn man ihn nicht explizit im Quelltext angibt)

Im Prinzip könntest du auch die Variable name im Square-Konstruktor auf “Square” setzen,
da diese dank “protected” an Square vererbt wird, das wäre aber IMHO kein besonder guter
Stil, da es leicht zu Fehlern führen könnte.


ok hat sich geklärt…


hi void,

erstmal lob fuer die tolle erklaerung! muss bloss der korrektheit halber dazuschreiben, dass eine aussage von dir nicht so stimmt:

es gibt diesen standardkonstruktor mit dem leeren klammerpaar NUR, wenn man sonst keinen konstruktor selber explizit definiert. SOBALD man dies mit mindestens einem parameter tut, gibt es KEINEN parameterlosen standardkonstruktor mehr. wenn man dann so einen trotzdem haben will, muss man ihn trotzdem nochmal explizit definieren.

war mir damit auch nicht mehr ganz sicher, musste mich auch nochmal durch nachlesen vergewissern, dass es so stimmt.

gruesse,
-steppenwofl


von arrays und schleifen habt ihr auch noch nix gehört, oder? :wink:


noe, dafuer aber von copy & paste :)!

du meinst sicher die langen listen in den tester-klassen?! da war ich zu faul, was saubereres hinzuschreiben. ist ja, wie der name schon sagt, nur zum testen. ausserdem werden die meisten der so erzeugten objekte ja verschieden behandelt, z. b. werden bei den kontoobjekten verschiedene geldbetraege einbezahlt und abgehoben.


jojo, ich wollt nur meinen senf dazugeben :gun:


ich mag keinen senf :), lieber ketchup :).


OK, überzeugt. Ich war dem Irrglauben verfallen, der Standardkonstruktor existiere immer; macht aber auch Sinn, dass er nicht mehr zur Verfügung steht, wenn man explizit einen self-made-Konstruktor angibt.

Mal ne Frage…
Hi, hab die Lösung eigentlich ziemlich genauso wie Steppenwolf…
funktioniert auch prima, nur mache ich mir gedanken, ob wir die Aufgabe nicht missverstanden habe…

Annahme: Man/Frau implementiert in der Circle / Square Klasse noch spezielle Methoden…

Nun gibt man ja ein Cricle oder Square Objekt zurück… im “Hauptprogramm” wird diese Rückgabe aber als GeomObject interpretiert…

Die zusätzlichen Methoden sind dann weg, oder???
Oder hab ich da was nicht verstanden?

Danke für Eure Hilfe


Wenn du sowas meinst

GeomObject o1 = new Square(5);

dann ist das durchaus korrekt. Square ist eine abgeleitete Klasse von GeomObject und damit kann o1 auch eine Instanz von Square beherbergen. Die zusätzichen Methoden und Klassenvariablen von Square gehen dabei nicht verloren (Dafür sorgt der Compiler schon). Die Technik einer Variablen vom Typ Vater/Mutterklasse das Objekt einer Kind-Klasse zuzuweisen schimpft sich Polymorphismus.

Einer Variablen vom Typ Kind-Klasse das Objekt der Vaterklasse zuweisen geht allerdings nicht (durchaus verständlich).
Also bei

Square s1 = new GeomObjekt();

schepperts. Das geht nicht. So wie GeomObjekt im Quelltext definiert ist, ginge es schon zweimal nicht, da GeomObjekt abstract definiert ist und somit nicht instanziierbar ist.