Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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
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 🙂
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
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.
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.
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.
ö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 🙂
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
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.
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.