Polymorphie Aufgabe

Marczii

Mitglied
Hallo Leute,

Ich sitz schon etwas an der Aufgabe und hoffe ihr könnte mir beim Fehler helfen.
Fehler: Cannot resolve Method(Polymorphie.Person)

Code:
    public static void main(String[] args) {

            Person otto = new Person("Otto", "Mueller");
            Person karl = new Akademiker("Karl", "Schmidt");
            Person maria = new Akademiker("Maria", "Meier", "Dr.");
            otto.gruessen(karl);
            karl.gruessen(maria);
            maria.gruessen(otto);
        }
    }


Aufgabenstellung:

Implementieren Sie die beiden fehlenden Klassen Person und Akademiker, so dass sich die Klasse Gruss kompilieren lässt und beim Ausführen des Programms die obige Ausgabe erzeugt wird. Die Klasse Person speichert einen im Konstruktor übergebenen Vornamen und Nachnamen. Die Klasse Akademiker speichert neben Vorname und Nachname (Konstruktor mit zwei Parametern) zusätzlich unter Umständen noch einen Titel (Konstruktor mit drei Parametern). Attribute in den beiden Klassen sollen immer als private deklariert werden. Die Bildschirmausgabe soll nicht bereits im Konstruktor sondern in der Methode gruessen erfolgen (jeweils eine Zeile). Tipp: Definieren bzw. überschreiben Sie eine Hilfsmethode String getName(), die Sie bei der Implementierung der Methode gruessen dynamisch gebunden nutzen können. Die Methode getName soll dabei den vollständigen Namen einer Person liefern.


Mein Code:
Code:
class Person {

    private String vorname;
    private String nachname;

    public Person (String v, String n) {
        vorname = v;
        nachname = n;
    }

    public String getName() {
        return vorname + "" + nachname;
    }
}

class Akademiker extends Person {

    private String titel;

    public Akademiker (String v, String n) {
        super(v, n);
        titel = null;
    }

    public Akademiker (String v, String n, String t) {
        super(v, n);
        titel = t;
    }
    @Override
    public String getName() {
        String gruessen = super.getName();
        if (titel != null) {
            gruessen = gruessen + " gruesst " + titel;
        }
        return gruessen;
    }

}


Ausgabe:

Otto Mueller gruesst Karl Schmidt
Karl Schmidt gruesst Dr. Maria Meier
Dr. Maria Meier gruesst Otto Mueller
 

httpdigest

Top Contributor
Bei Fehlermeldungen bitte immer die komplette und vollständige Fehlermeldung hinschreiben und die Zeilennummer, bei der die Fehlermeldung generiert wird. Da steht garantiert nicht nur "Cannot resolve Method(Polymorphie.Person)".
Ich rate jetzt mal und vermute, dass die Methode `Person.gruessen(Person)` nicht gefunden wird. Die musst du selbstverständlich schreiben. Es ist aber falsch, dass Akademiker.getName() seinen Titel grüßt. getName() von Akademiker soll selbstverständlich nur den Namen plus optionalem Titel der Person/des Akademikers zurückliefern.
Der Witz bei der ganzen Polymorphie-Geschichte hier ist doch gerade, dass getName() überschrieben werden kann und gruessen(), welches du in Person implementieren sollst, eben nicht wissen muss, ob es sich bei `this` oder dem übergebenen `Person` Parameter um eine Person oder Akademiker handelt.
 

Marczii

Mitglied
Code:
package polymorphie;

public class Gruss {

    public static void main(String[] args) {

            Person otto = new Person("Otto", "Mueller");
            Person karl = new Akademiker("Karl", "Schmidt");
            Person maria = new Akademiker("Maria", "Meier", "Dr. ");
            otto.gruessen();
            karl.gruessen();
            maria.gruessen();
        }
    }

class Person {

    private String vorname;
    private String nachname;

    public Person (String v, String n) {

        this.vorname = v;
        this.nachname = n;

    }

    public String getName() {

        return vorname + "" + nachname;

    }
    public void gruessen(){
        System.out.println(vorname + " " + nachname);
    }

}

class Akademiker extends Person {

    private String titel;

    public Akademiker(String v, String n) {

        super(v, n);
        titel = null;

    }


    public Akademiker(String v, String n, String t) {

        super(v, n);
        this.titel = t;

    }

    @Override
    public String getName() {
        String name = super.getName();
        if (titel != null) {
            name = name + titel + " ";
        }
        return name;
    }
}


Jedenfalls hab ich so schonmal die Ausgabe von:

Otto Mueller
Karl Schmidt
Maria Meier


... Nun muss ja noch das Dr vor Maria Meier bekommen und den gruesst string hinzufügen .. mh
 

httpdigest

Top Contributor
Code:
    public static void main(String[] args) {

            Person otto = new Person("Otto", "Mueller");
            Person karl = new Akademiker("Karl", "Schmidt");
            Person maria = new Akademiker("Maria", "Meier", "Dr.");
            otto.gruessen(karl);
            karl.gruessen(maria);
            maria.gruessen(otto);
        }
    }
Also, wenn die Methode `gruessen` so aufgerufen wird: `otto.gruessen(karl)`, dann kann die Signatur der Methode doch nicht so sein: `public void gruessen()`.
Bei der Methode `gruessen` soll doch die Person, die durch `this` repräsentiert wird, die als Parameter übergebene Person grüßen.
Ist der Aufrufer-Code (also die main() Methode) vorgegeben? Falls ja, warum hast du sie angepasst (das Argument des `gruessen`-Aufrufes entfernt)?
 

httpdigest

Top Contributor
Du hast folgenden Code gegeben:
Java:
public static void main(String[] args) {
  Person otto = new Person("Otto", "Mueller");
  Person karl = new Akademiker("Karl", "Schmidt");
  Person maria = new Akademiker("Maria", "Meier", "Dr.");
  otto.gruessen(karl); // <- karl ist Argument für den Methodenaufruf
  karl.gruessen(maria); // <- maria ist hier Argument für den Methodenaufruf
  maria.gruessen(otto); // <- otto ist hier Argument für den Methodenaufruf
}
Hier wird ja eine noch nicht weiter bekannte Methode `gruessen` auf einer `Person` aufgerufen. Zusätzlich bekommt der Aufruf ein Argument (anscheinend vom Typ `Person`). Das heißt, wie muss jetzt die Signatur (erstmal nur Signatur, nicht tatsächliche Implementierung) der Methode `gruessen` aussehen? Weißt du eigentlich, was ein Methodenparameter ist und wie man eine Methode mit einem Parameter deklariert? Hattet ihr sowas schon?
 

Marczii

Mitglied
Wenn ich jetzt theoretisch ein Person Objekt übergebe kann ich den Code nun ausführen. Aber das übergebene Objekt wird ja noch nicht genutzt..

Meine Ausgabe erzeugt nun aber auch nicht mehr :

Otto Mueller
Karl Schmidt
Maria Meier

Ja, ich weiß was das ist... Ich bin gerade nur etwas verwirrt denk ich. :/
 

Marczii

Mitglied
Code:
package polymorphie;

public class Gruss {

    public static void main(String[] args) {

            Person otto = new Person("Otto", "Mueller");
            Person karl = new Akademiker("Karl", "Schmidt");
            Person maria = new Akademiker("Maria", "Meier", "Dr. ");
            otto.gruessen(karl);
            karl.gruessen(maria);
            maria.gruessen(otto);
        }
    }

class Person {

    private String vorname;
    private String nachname;

    public Person (String v, String n) {

        this.vorname = v;
        this.nachname = n;

    }

    public String getName() {

        return vorname + " " + nachname;

    }
    public void gruessen(Person anderePerson) {
      this.gruessen(anderePerson);
    }

}

class Akademiker extends Person {

    private String titel;

    public Akademiker(String v, String n) {

        super(v, n);
        titel = null;

    }


    public Akademiker(String v, String n, String t) {

        super(v, n);
        this.titel = t;

    }

    @Override
    public String getName() {
        String name = super.getName();
        if (titel != null) {
            name = name + titel + " ";
        }
        return name;
    }
}

Jetzt bekomm ich eine Exception

Exception in thread "main" java.lang.StackOverflowError
at polymorphie.Person.gruessen(Gruss.java:34)
at polymorphie.Person.gruessen(Gruss.java:34)
at polymorphie.Person.gruessen(Gruss.java:34)
at polymorphie.Person.gruessen(Gruss.java:34)
 

httpdigest

Top Contributor
Nein, nein, nein. Du sollst doch in `gruessen` nicht einfach rekursiv wieder dieselbe Methode mit denselben Argumenten nochmal aufrufen...
Die Methode `gruessen` soll jetzt tatsächlich jemanden grüßen. Also vermutlich durch Textausgabe auf der Konsole. Hierfür gibt es z.B. `System.out.println(...)`
 

Marczii

Mitglied
ohje ich glaub ich brauch gleich erstmal frische luft :D

Also aufjedenfall habe Ich jetzt die Methode so deklariert und unten auch nochmal den titel nach vorne geschrieben.. Sodass ich die Ausgabe bekomme:

Otto Mueller gruesst
Karl Schmidt gruesst
Dr. Maria Meier gruesst

Jetzt fehlt also noch die Personen die gegrüßt werden sollen
 

Marczii

Mitglied
Code:
    public void gruessen(Person anderePerson) {
      System.out.println(getName() + " gruesst " + anderePerson;
    }

Dann bekomm ich die ausgabe:

Otto Mueller gruesst polymorphie.Akademiker@1540e19d
Karl Schmidt gruesst polymorphie.Akademiker@677327b6
Dr. Maria Meier gruesst polymorphie.Person@14ae5a5

und das ist mir total neu gerade..
 

httpdigest

Top Contributor
Genauso wie du von `this` den Namen per `getName()` geholt hast, musst du selbstverständlich auch den Namen von `anderePerson` via dessen `getName()` verwenden.
Aktuell gibst du nicht den Namen von `anderePerson` aus, sondern du gibst `anderePerson` aus.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Unterschied: Polymorphie und Dynamisches Binden Allgemeine Java-Themen 8
G Polymorphie Allgemeine Java-Themen 1
L Klassen Polymorphie:2 Attribute gleichen Namens in einem Objekt Allgemeine Java-Themen 6
D Unterschied Vererbung und Polymorphie? Allgemeine Java-Themen 4
L Polymorphie - OO Problem Allgemeine Java-Themen 6
D Polymorphie Knobelspaß ;-) Allgemeine Java-Themen 15
R Problem mit Polymorphie... Allgemeine Java-Themen 7
T Objekt Array Aufgabe mit Busdatenbank Allgemeine Java-Themen 2
O Test schreiben mit Äquivalenzklassen (Aufgabe Prüfung) Allgemeine Java-Themen 9
OnDemand Erstellen von Quartz Jobs pro Aufgabe oder zusammenfassen Allgemeine Java-Themen 7
M Bräuchte Hilfe bei der Aufgabe Allgemeine Java-Themen 1
parrot Array Aufgabe Allgemeine Java-Themen 3
parrot Rekursion Aufgabe Allgemeine Java-Themen 12
S Aufgabe erwünscht Allgemeine Java-Themen 7
R Statistische Methoden (Mathematik) Aufgabe Allgemeine Java-Themen 9
H Stack mit bestimmter Aufgabe Allgemeine Java-Themen 62
E Java Aufgabe WaWi01 Allgemeine Java-Themen 7
D Methoden Java-Aufgabe Allgemeine Java-Themen 2
R Java-Code für folgene Aufgabe? Allgemeine Java-Themen 8
G Methoden BMI -Wert Aufgabe(Methoden) Allgemeine Java-Themen 4
G Erste Schritte Aufgabe - Geht das auch schneller ? Allgemeine Java-Themen 7
R Was los mit dieser Aufgabe? Arrays mit Schachbrettmustern? Allgemeine Java-Themen 10
vandread Kleine Generics Aufgabe aus einer Prüfung... wie ist das gemeint? Allgemeine Java-Themen 6
D Aufgabe: Schnittstelle und Proxy implementieren Allgemeine Java-Themen 2
D BlueJ - Aufgabe 12 namens Traktor Allgemeine Java-Themen 7
D OOP Mustererkennungs Aufgabe Allgemeine Java-Themen 9
pg1337 Firmen-aufgabe Allgemeine Java-Themen 10
B Konkrete Aufgabe Allgemeine Java-Themen 9
S Textverständnis einer Aufgabe Allgemeine Java-Themen 2
F Frage zu Aufgabe Allgemeine Java-Themen 5
P Java-Security-Aufgabe gesucht Allgemeine Java-Themen 2
M Brauche einen Tipp, bei einer Aufgabe ! Allgemeine Java-Themen 3
I Aufgabe: Aufwandsabschätzung Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben