überschreiben von methoden

Status
Nicht offen für weitere Antworten.

gruenerblob

Mitglied
hallo alle zusammen!
bin noch ein ziemlicher anfänger in java und hab mir dabei etz scho stundenlang den kopf zermartert. hoffe ihr könnt mir dabei weiterhelfen.

also ich machs gleich konkret:
ich habe eine methode innerhalb einer klasse A:
public String getGender(){return "?";}
die mir eben da ein ? zurückgibt.
jetzt möchte ich in einer Unterklasse diese Methode überschreiben. Sodass sie mir statt ? ein M zurückgibt.
habe die klasse auch erweitert
public class B extends B {
und dann
public String getGender() {return "M";}
geschrieben.
aber ich bekomm immer noch ein ? wenn ich des ausführ.
wie gesagt bin noch ein anfänger und weiß net ob das als info reicht. poste bei bedarf auch mehr.
Danke euch schonmal im vorraus
 
Hi,

ich wette Du hast ein Objekt vom Typ A erstellt und abgefragt. 😉
Außerdem, wenn es stimmt was da steht erbt B von B??

Erzeug ein Objekt der Klasse B, dann klappts auch.

greetz
SLi
 
ups sorry mein fehler
public class B extends A {

so isses richtig.

boah des ging ja wirklich flott mit der antwort 😉
ich probier noch mal n bissl rum vielleicht klappts ja irgendwann ;😉

gruß
 
Hi,

das ist immer am besten.
Je länger Du Dich mit einem fehler beschäftigst, desto höher ist der Lerneffekt.
Aber irgendwann sollte man Fragen, sonst wirds deprimierend 🙂

greetz
SLi
 
ja genauso gehts mir im moment...mittlerweile sinds 3 oder mehr stunden und ich komm einfach net drauf warum des net geht.
im eclipse zeigt er mir au an dass ich die methode überschreib aber irgendwie...macht ers net
 
Zuletzt bearbeitet:
Hi,

vergleich mal:
Java:
public class MainController {

    
    public static void main(String[] args) {
	
	Ding ding = new Ding("Hans");
	System.out.println(ding.getGender()); // Ausgabe ?
	
	
	DingsBums dingsbums = new DingsBums("Meiser");
	System.out.println(dingsbums.getGender()); // Ausgabe m
    }
    
}



Java:
public class Ding {

    private String name;
   
    
    public Ding(String name) {
	name = name;
    }
    
    public String getGender() {
	return ("?");
    }
}



Java:
public class DingsBums extends Ding {

    
    public DingsBums(String name) {
	super(name);
    }
    
    public String getGender() {
	return("m");
    }
}


Wie schon gesagt, ein Objekt von B erstellen.
Eine kleine Transferleistung überlasse ich Dir noch.

greetz
SLi
 
hiho nochmal ich!

ok ähm ich hoff ich find die richtigen worte bin wie gesagt noch net so firm und steh wahrscheinlich etz scho wieder komplett aufm schlauch. (werd glaub langsam wahnsinnig😉)

also
in deinem beispiel isses eigentlich klar, weil du ja eigentlich dann dingsbums ansprichst und dann M rauskommt.

bei mir isses so
im MainController wird nur ein objekt vom Typ A erstellt. mehr soll ich da auch nicht erstellen.

also und wenn ich des so ausführ kommt ein ?
und wenn ich dann in dingsbums die methode überschreib soll bei dem selben objekt stattdessen ein m hinkommen.

sorry wenn ich irgendwie stuss schrieb aber ich kann grad irgendwie überhaupt nimmer klar denken.
kann dir au den kompletten code per pm zukommen lassen. glaub wir reden aneinander vorbei. wie gesagt bin noch neu und kenn mich noch net so ganz aus, bzw tu mich noch a weng hart mit ner genauen problembeschreibung.
 
Zuletzt bearbeitet:
ich habs dir als pm geschickt. wollte des etz net öffentlich machen. werd dann aber hier noch n paar zeilen dazu schreiben wenn ich des problem gelöst hab.
 
Hi,

öffentlich ist der Sinn eines Forums.
Wenn es geht, poste es noch. Und schließ java code in java-Tags mit eckigen Klammern ein.

Zu Deinem Code.
Du hast doch ein Objekt vom Typ Female und Male. (evelin und ubk1)
Auf genau diesen Objekten musst Du auch getGender aufrufen. Wo auch sonst?
Die Klasse Human stellt alles bereit, was die Menschen gemeinsam haben. Also nicht als Wert, sondern als Eigenschaft. Ein Auto hat vier Reifen, auch wenn es die Größen 145/R13 oder 225/R18 sind. Ein Vogel hat einen Schnabel, auch wenn er rot, braun, gelb oder sonst was sein kann. Ein Mensch hat ein Geschlecht...

Du erstellst kein Objekt vom Typ Human, weil Human zu ungenau ist. Deshalb von den Spezialisierungen Female und Male. Und die Methoden hast Du richtig überschrieben. Aber ganz natürlich, wird immer die Methode aufgerufen, von dem Objekt, was Du erstellst. Welche auch sonst? Überschreibst Du getGender nicht, wird die der Oberklasse aufgerufen.

Warum macht man das?
Andernfalls müsstest Du sowohl in Female als auch in Male alle Eigenschaften auflisten, also zwemal das exakt selbe definieren. Das kann fehleranfällig sein. Dazu kommt noch, wenn plötzlich Polygamie erlaubt wird, musst Du die "Partner" Eigenschaft an beiden Stellen ändern. Das ist Aufwand und birgt zweimal Fehlerpotenzial.
Also, alle gemeinsamen Eigenschaften nur an eine Stelle und erben lassen, damit die Subklassen diese Eigenschaften automatisch auch haben...

Klar?
Sonst frag nochmal...zehn Minuten bin ich noch da 🙂

greetz
SLi
 
hey super danke für die super antwort werd mich da gleich noch ganz durchbeißen
aberbei (evelin und ubk1) darauf soll ich eigentlich noch nichst aufrufen.
die ausgabe soll hier erst

Albert (23 Jahre, M)
Minerva(22 Jahre, W)
Albert (23 Jahre, M); verheir,,,
Minerva(23 Jahre, W); verheiratet....
sein. wenn ich TestFamily.java ausführ
evelin und ubk1 kommen da eigentlich noch gar net vor.

und im moment hab ich statt M und W überall noch fragezeichen
 
Zuletzt bearbeitet:
Hi nochmal,

Java:
public static void main(String[] args){
Human minerva = new Human("Minerva", 22);
Human albert = new Human("Albert", 23);

System.out.println(albert);
System.out.println(minerva);
minerva.celebrateBirthday();

if (!minerva.marry(albert)){
System.out.println("Keine Heirat");
}

System.out.println(albert);
System.out.println(minerva);
System.out.println(albert.getGender());
}
}

Du wirst immer ein Fragezeichen bekommen, weil die Objekte vom Typ Human sind.
Punkt.

Wenn Du m und w haben willst, müssen minerva und albert Objekte von Female oder Male werden.

greetz
SLi
 
hier ist mal der Code also aufgabenstellungen sind folgende:
konstruktor der klasse human implementieren. das is soweit klar.
als nächstes getName() getAge() und celebrateBirthday() und die methode marry() implementieren.
soweit auch alles klar
die Ausfabe bei ausführung soll nun
Albert (23 Jahre, ?)
Minerva( 22 Jahre, ?)
Albert (23 Jahre, ?); verheiratet mit Minerva
Minerva (23 Jahre, ?); verheiratet mit Albert
sein. soweit is bei mir alles klar.
jetzt soll ich aber die beiden klassen male und female ergänzen, dass sie human erweitern. soweit auch noch klar, aber dann soll ich die Methode getGender() in Male und Female so überschreiben, dass ich bei Ausführung von TestFamily statt der ? jeweils entweder ein M oder ein W herbekomm.
hab leider keine ahnung wie ich das machen soll. hab die methode in male und female überschrieben mit
Code:
public String getGender() {
		return ("M");
aber bekomm immer noch fragezeichen.




Code:
import people.Human;
import people.Male;
import people.Female;
public class TestFamily{
	public static void main(String[] args){
		Human minerva = new Human("Minerva", 22);
		Human albert = new Human("Albert", 23);
		
		System.out.println(albert);
		System.out.println(minerva);
		minerva.celebrateBirthday();
		
		if (!minerva.marry(albert)){
			System.out.println("Keine Heirat");
		}
		
		System.out.println(albert);
		System.out.println(minerva);
	}
}


Code:
package people;

//Eine spezielform eines Menschen
public class Female{
	
}

Code:
package people;

//Eine weitere spezielform eines Menschen
public class Male{
	
}

Code:
package people;

import people.Human;

//Ein Mensch
public class Human{
	//Erzeugt einen neuen Menschen mit angegebenen Namen und Alter als Waise
	public Human(String name, int age){
		//ZU IMPLEMENTIEREN
	}	
	
	//Erzeugt einen neuen Menschen mit angegebenen Namen. Das Alter soll 0 sein. 
	//Die Eltern müssen in die entsprechenden Instanzvariablen geschrieben werden
	protected Human(String name, Human mother, Human father){
		//ZU IMPLEMENTIEREN
	}
	
	//gibt den Namen zurueck
	public String getName() { 
		//ZU IMPLEMENTIEREN 
		return "";
	}
	
	//gibt das Alter zurueck
	public int getAge() { 
		//ZU IMPLEMENTIEREN 
		return 0;
	}
	
	//Erhoeht das Alter um ein Jahr
	public void celebrateBirthday(){
		//ZU IMPLEMENTIEREN
	}
	
	//Traegt den angegebenen Menschen als Partner ein.
	//Beachten Sie dass man...
	//    ... nicht zweimal heiraten darf
	//    ... nicht sich selbst heiraten darf
	//    ... einen gueltigen Partner braucht (parameter!=null)
	//Die Methode soll nur dann true zurueckgeben falls 
	//eine Heirat stattfand
	public boolean marry(Human partner){
		//ZU IMPLEMENTIEREN
		return false;
	}
	
	//================================================================
	// AB HIER BITTE NICHTS VERAENDERN
	//================================================================
		
	//Name diese Menschen
	protected String name;
	
	//Aktuelles Alter
	protected int age;
	
	//Der Lebenspartner
	protected Human partner;
	
	//Vater diese Menschen
	protected Human father;
	
	//Mutter diese Menschen
	protected Human mother;
	
	//Gibt das Geschlecht des Mensch zurück
	public String getGender(){
		return "?";
	}
	
	public Human getPartner() { return partner; }
	public Human getFather() { return father; }
	public Human getMother() { return mother; }
	
	//Gibt eine Beschreibung diese Menschen aus
	public String toString(){
		String ret = name + " (" + getAge() + " Jahre, " + getGender() + ")";
		if (partner!=null)
			ret += "; verheiratet mit " + partner.getName();
			
		if (mother!=null) ret += "; Mutter " + mother.getName();
		if (father!=null) ret += "; Vater " + father.getName();
		return ret;
	}
	
	//Liefert einen zufälligen Wahrheitswert
	public static boolean randomBool(){
		return Math.random() < 0.5;
	}
}
 
naja meine versuche sind eher weniger von erfolg gekrönt. aber zumindest versteh ich etz n bissl was du meinst.
etz is eben nur noch des problem wie ich aus minerva und albert n male bzw female objekt mach wie du eben gesagt hast.
habs grad mit der methode:
Female female = (Female) minerva; probiert aber des wird so auch nix...
glaub ich hau mich in die falle hab die schnauze langsam voll.
nochmal vielen dank für deine mühe.
 
Hi,

Du erstellt ein Objekt vom Typ Female genauso wie von Human:
Java:
Female female = new Female("Minerva", 21);

greetz
SLi
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben