Tag 3: GeomObjects
1 Zwischenstop GeomObjects
package ch.bztf;
/**
* Hello world!
*
*/
public class App
{
public static void main( String[] args )
{
RechtWinkligesDreieck aDreieck = new RechtWinkligesDreieck(6, 3);
Kreis aKreis = new Kreis(3.5);
Viereck aViereck = new Viereck(2.5, 3.5);
System.out.println(aDreieck.vorstellen());
System.out.println(aKreis.vorstellen());
System.out.println(aViereck.vorstellen());
}
}
package ch.bztf;
public class GeomObject {
protected double flaeche, umfang;
public String vorstellen() {
String output = "Ich bin ein Geom-Object - Meine Flaeche ist " + flaeche + " und mein Umfang ist " + umfang + " und das als ";
return output;
}
}
package ch.bztf;
public class RechtWinkligesDreieck extends GeomObject {
private double seitea, seiteb, seitec;
public RechtWinkligesDreieck(double seitea, double seiteb) {
this.seitea = seitea;
this.seiteb = seiteb;
berechneUmfang();
berechneFlaeche();
}
public void berechneUmfang() {
seitec = Math.sqrt((Math.pow(seitea, 2)) + (Math.pow(seiteb, 2))); // pythagoras
umfang = seitea + seiteb + seitec;
}
public void berechneFlaeche() {
flaeche = (seitea * seiteb) / 2;
}
@Override
public String vorstellen() {
return super.vorstellen() + "Dreieck.";
}
}
package ch.bztf;
public class Kreis extends GeomObject {
private double radius;
public Kreis(double radius) {
this.radius = radius;
berechneUmfang();
berechneFlaeche();
}
public void berechneUmfang() {
umfang = 2 * radius * Math.PI;
}
public void berechneFlaeche() {
flaeche = Math.PI * Math.pow(radius, 2);
}
@Override
public String vorstellen() {
return super.vorstellen() + "Kreis.";
}
}
package ch.bztf;
public class Viereck extends GeomObject {
private double seitea, seiteb;
public Viereck(double seitea, double seiteb) {
this.seitea = seitea;
this.seiteb = seiteb;
berechneUmfang();
berechneFlaeche();
}
public void berechneUmfang() {
umfang = (seitea + seiteb) * 2;
}
public void berechneFlaeche() {
flaeche = seitea * seiteb;
}
@Override
public String vorstellen() {
return super.vorstellen() + "Viereck.";
}
}
In diesem Programm werden geometrische Objekte erstellt. Die Klasse GeomObject
ist die Superklasse von den Klassen RechtWinkligesDreieck
, Kreis
und Viereck
. In der Superklasse werden lediglich die Werte flaeche
und umfang
erfasst, denn diese werden in allen Subklassen verwendet. Auch wird in der Superklasse eine Methode vorstellen()
erstellt. Diese erstellt einen Output, in dem die Fläche und Umfang ausgegeben werden. Sie wird in den Subklassen noch erweitert. In allen Subklassen gibt es einen Konstruktor, um das Objekt zu erstellen. Auch gibt es immer die Methoden berechneUmfang()
und berechneFlaeche()
, die den Umfang und Fläche berechnen. Dazu wird die Methode vorstellen()
immer mit dem Namen des Objekts erweitert.
UML:
Source Code
2 Beispiele
2.1 BZT5
package ch.bztf;
/**
* Hello world!
*
*/
public class App
{
public static void main( String[] args )
{
Person pers1 = new Person("Muster");
Lernende lern1 = new Lernende("Moritz", 4711);
Lehrer lehr1 = new Lehrer("Lempel", 12345, "RitschRatschMühle");
Angestellte ange1 = new Angestellte("Verwalti", 54321, true);
Angestellte ange2 = new Angestellte("Schläffrig", 345, false);
System.out.println(pers1.vorstellen());
System.out.println(lern1.vorstellen());
System.out.println(lehr1.vorstellen());
System.out.println(ange1.vorstellen());
System.out.println(ange2.vorstellen());
}
}
package ch.bztf;
public class Person {
protected String nachname;
protected Person(String nachname) {
this.nachname = nachname;
}
public void setNachname(String nachname) {
this.nachname = nachname;
}
public String getNachname() {
return nachname;
}
public String vorstellen() {
String output = "Ich heisse " + getNachname() + "! Von der Klasse " + this.getClass() + ".";
return output;
}
}
package ch.bztf;
public class Mitarbeiter extends Person {
protected int personalNummer;
protected Mitarbeiter(String nachname, int personalNummer) {
super(nachname);
this.personalNummer = personalNummer;
}
protected Mitarbeiter(String nachname) {
super(nachname);
}
public void setPersonalNummer(int personalNummer) {
this.personalNummer = personalNummer;
}
public int getPersonalNummer() {
return personalNummer;
}
@Override
public String vorstellen() {
return super.vorstellen() + " Meine Personalnummer ist " + getPersonalNummer() + " und ich";
}
}
package ch.bztf;
public class Lernende extends Person {
private int nummer;
public Lernende(String nachname) {
super(nachname);
}
public Lernende(String nachname, int nummer) {
super(nachname);
this.nummer = nummer;
}
public void setNummer(int nummer) {
this.nummer = nummer;
}
public int getNummer() {
return nummer;
}
@Override
public String vorstellen() {
return super.vorstellen() + " Meine Nummer ist " + getNummer();
}
}
package ch.bztf;
public class Lehrer extends Mitarbeiter {
private String fachbereich;
public Lehrer(String nachname, int personalNummer, String fachbereich) {
super(nachname, personalNummer);
this.fachbereich = fachbereich;
}
public void setFachbereich(String fachbereich) {
this.fachbereich = fachbereich;
}
public String getFachbereich() {
return fachbereich;
}
@Override
public String vorstellen() {
return super.vorstellen() + " lehre " + getFachbereich();
}
}
package ch.bztf;
public class Angestellte extends Mitarbeiter {
private boolean schulleitung;
public Angestellte(String nachname) {
super(nachname);
}
public Angestellte(String nachname, int personalNummer) {
super(nachname, personalNummer);
}
public Angestellte(String nachname, int personalNummer, boolean schulleitung) {
super(nachname, personalNummer);
this.schulleitung = schulleitung;
}
public void setSchulleitung(boolean schulleitung) {
this.schulleitung = schulleitung;
}
public boolean isSchulleitung() {
return schulleitung;
}
@Override
public String vorstellen() {
if(isSchulleitung() == false) {
return super.vorstellen() + " bin einfacher Angestellter";
} else {
return super.vorstellen() + " bin Schulleitungsmitglied";
}
}
}
Was macht und passiert eigentlich mit der Methode vorstellen()
? Sie wird in der Superklasse erstellt und wird dann in den Subklassen überschrieben (@Override
). Das überschreiben, erlaubt einen Methodennamen mehrmals zu nutzen und immer eine andere Ausgabe zu erzeugen. Die Ausgabe der Methode vorstellen()
in der Klasse Lernender
ist somit eine andere als in der Klasse Lehrer
. Gibt es die Methode in der aufgerufenen Klasse nicht, wird die Methode in der Superklasse genutzt.
Somit gilt, Methoden und Attribute von Subklassen haben Vorrang von den Methoden und Attributen in der Superklasse.
Dieses Prinzip nennt man Late Binding. Es wird erst zur Laufzeit entschieden, welche Methoden und Attribute aufgerufen werden.
Die Annotation @Override
, hilft Java zu verstehen, dass diese Methode überschrieben wird, ist aber nicht dringend notwendig.
Um auf die Methode in der Superklasse zuzugreifen, kann das mit dem Prefix super
gemacht werden.
Unterschied Überschreiben und Überladen
Überschreiben -> Beim Überschreiben wird die gesamte Methode überschrieben und gibt eine andere Ausgabe aus, als in den anderen Klassen.
Überladen -> Beim Überladen wird die Ausgabe der Superklasse erweitert.
2.2 BZT6
package ch.bztf;
/**
* Hello world!
*
*/
public class App
{
public static void main( String[] args )
{
Person pers1 = new Person("Muster");
Lernende lern1 = new Lernende("Moritz", 4711);
Lehrer lehr1 = new Lehrer("Lempel", 12345, "RitschRatschMühle");
Angestellte ange1 = new Angestellte("Verwalti", 54321, true);
Angestellte ange2 = new Angestellte("Schläffrig", 345, false);
System.out.println(pers1.vorstellen());
System.out.println(lern1.vorstellen());
System.out.println(lehr1.vorstellen());
System.out.println(ange1.vorstellen());
System.out.println(ange2.vorstellen());
System.out.println("#-------------------------------------------------------------------------------------------------------------------------------------------------#");
ange1.heiraten(ange2);
lehr1.heiraten(lehr1);
ange2.heiraten(lehr1);
ange1.scheiden();
ange2.scheiden();
lehr1.scheiden();
}
}
package ch.bztf;
public class Person {
protected String nachname;
protected Person(String nachname) {
this.nachname = nachname;
}
public void setNachname(String nachname) {
this.nachname = nachname;
}
public String getNachname() {
return nachname;
}
public String vorstellen() {
String output = "Ich heisse " + getNachname() + "! Von der Klasse " + this.getClass() + ".";
return output;
}
private Person ehepartner = null; // Die Referenz auf den Ehepartner wird erstellt, aber auf null gesetzt
// einAngestellter.heiraten(eineAngestellte); Als Hinweis: Der Aufruf im main!
protected void heiraten(Person ehepartner) //
{
if (this != ehepartner) // überprüfung ob nicht selber
{
if(this.ehepartner == null && ehepartner.ehepartner == null) // wenn beide noch nicht verheiratet sind
{
this.ehepartner = ehepartner; // person auf ehepartner setzen
ehepartner.ehepartner = this; // ?
System.out.println(nachname + " und " + ehepartner.getNachname() + " haben geheiratet. ");
}
else // wenn mind. jemand bereits verheiratet ist
{
System.out.println(nachname + " und " + ehepartner.getNachname() + " können nicht heiraten, " + "weil mindestens einer bereits verheiratet ist! ");
}
}
else // wenn selber
{
System.out.println(nachname + " kann sich nicht selber heiraten!");
}
}
protected void scheiden() {
if (ehepartner != null) {
Person temp = ehepartner;
ehepartner.ehepartner = null;
this.ehepartner = null;
System.out.println(nachname + " und " + temp.getNachname() + " haben sich geschieden.");
} else {
System.out.println(nachname + " ist nicht verheiratet.");
}
}
}
package ch.bztf;
public class Mitarbeiter extends Person {
protected int personalNummer;
protected Mitarbeiter(String nachname, int personalNummer) {
super(nachname);
this.personalNummer = personalNummer;
}
protected Mitarbeiter(String nachname) {
super(nachname);
}
public void setPersonalNummer(int personalNummer) {
this.personalNummer = personalNummer;
}
public int getPersonalNummer() {
return personalNummer;
}
@Override
public String vorstellen() {
return super.vorstellen() + " Meine Personalnummer ist " + getPersonalNummer() + " und ich";
}
}
package ch.bztf;
public class Lernende extends Person {
private int nummer;
public Lernende(String nachname) {
super(nachname);
}
public Lernende(String nachname, int nummer) {
super(nachname);
this.nummer = nummer;
}
public void setNummer(int nummer) {
this.nummer = nummer;
}
public int getNummer() {
return nummer;
}
@Override
public String vorstellen() {
return super.vorstellen() + " Meine Nummer ist " + getNummer();
}
}
package ch.bztf;
public class Lehrer extends Mitarbeiter {
private String fachbereich;
public Lehrer(String nachname, int personalNummer, String fachbereich) {
super(nachname, personalNummer);
this.fachbereich = fachbereich;
}
public void setFachbereich(String fachbereich) {
this.fachbereich = fachbereich;
}
public String getFachbereich() {
return fachbereich;
}
@Override
public String vorstellen() {
return super.vorstellen() + " lehre " + getFachbereich();
}
}
package ch.bztf;
public class Angestellte extends Mitarbeiter {
private boolean schulleitung;
public Angestellte(String nachname) {
super(nachname);
}
public Angestellte(String nachname, int personalNummer) {
super(nachname, personalNummer);
}
public Angestellte(String nachname, int personalNummer, boolean schulleitung) {
super(nachname, personalNummer);
this.schulleitung = schulleitung;
}
public void setSchulleitung(boolean schulleitung) {
this.schulleitung = schulleitung;
}
public boolean isSchulleitung() {
return schulleitung;
}
@Override
public String vorstellen() {
if(isSchulleitung() == false) {
return super.vorstellen() + " bin einfacher Angestellter";
} else {
return super.vorstellen() + " bin Schulleitungsmitglied";
}
}
}
Im Beispiel BZT6 werden die zwei neuen Methoden heiraten()
und scheiden()
eingeführt. Die Methoden werden in der Klasse Person
implementiert.
Zuerst wird eine Referenz auf den Ehepartner erstellt, die auf NULL
gesetzt wird. Danach wird in der Methode heiraten()
als erstes überprüft, ob der übergebene Wert nicht die Person selbst ist. Danach wird überprüft, ob die Person selbst und der Ehepartner noch keinen Ehepartner haben. Treffen diese beiden Überprüfungen zu, wird die Referenz auf die Person gesetzt und die Person auf die Referenz.
Bei der Methode scheiden()
muss nur überprüft werden, ob die Person verheiratet ist. Trifft dies zu, wird die Referenz von der Person entfernt und die Person von der Referenz.
UML:
Source Code