Methode aus Superklasse benutzen

Diskutiere Methode aus Superklasse benutzen im Java Basics - Anfänger-Themen Bereich.
Kirby_Sike

Kirby_Sike

Die Antwort auf meine Frage ist wahrscheinlich relativ simpel, nur ich bin gerade etwas verwirrt...Wenn ich eine Superklasse (Person) und eine erbende Klasse (Student) habe, wie benutze ich dann beispielsweise die "toString()" Methode aus Person in Student?

Edit: UniPerson erbt von Person ;)

Java:
public class Person {

    protected String prename;
    protected String surname;
    protected int age;
    protected Ort adress;
  
    public Person(String prename, String surname, int age, Ort adress) {
        this.prename = prename;
        this.surname = surname;
        this.age = age;
        this.adress = adress;
    }
  
    public void setPrename(String prename) {
        this.prename = prename;
    }
  
    public String getPrename() {
        return prename;
    }
  
    public void setSurname(String surname) {
        this.surname = surname;
    }
  
    public String getSurname() {
        return surname;
    }
  
    public void setAge(int age) {
        this.age = age;
    }
  
    public int getAge() {
        return age;
    }
  
    public String toString() {
        return "Vorname: " + prename + "\n" + "Nachname: " + surname + "\n" + "Alter: " + age + "\n" + "Wohnort: [" + adress.straße + " "
                + adress.hausnummer + ", " + adress.postleihzahl + "]";
    }
}
Java:
public class Student extends UniPerson{
  
    protected double zensurschnitt;
  
    public Student(String prename, String surname, int age, Ort adress, int matrikelnummer, double zensurschnitt) {
        super(prename, surname, age, adress, matrikelnummer);
        this.zensurschnitt = zensurschnitt;
    }
  
    public String toString() {
        return /* Hier möchte ich die Methode benutzen --> Person.toString() + "\n" +*/ "Matrikelnummer: " + matrikelnummer + "\n" + "Zensurschnitt: " + zensurschnitt;
    }
}
 
L

LimDul

Aber greift er dann wirklich auf die toString Methode aus Person zu, selbst wenn es in UniPerson auch eine toString Methode gibt?
Wenn die Ableitungshierarchie Person => UniPerson => Student ist und du rufst in Student super.toString() auf, dann wird die Methode aus UniPerson aufgerufen. Direkt die Methode aus Person aufzurufen geht nicht.
 
J

JustNobody

Ach - Du willst also auf die super super Klasse Zugreifen? Du hast also;
- Person mit toString()
- UniPerson extends Person mit toString()
- Student extends UniPerson und willst da auf die toString() von Person zugreifen?

Was ist das für eine Anforderung? Wozu brauchst Du dies genau? Das klingt von Design her sehr suspekt.

Wenn es in Person etwas gibt, das Du auch in Student brauchst, dann darf es von UniPerson nicht überschrieben werden. Sowas kann es ja geben, aber das muss dann zumindest in UniPerson bekannt sein. Bei dem toString sehe ich das so aber erst einmal nicht wirklich ... aber entweder gibt es dann sowas wie getPersonDescription() in Person und toString gibt halt den Aufruf einfach zurück ... Oder das ist etwas, das erst bei UniPerson wichtig ist, und dann hat man da etwas spezielles.

Also um da was zu konstruieren:
Person hat getAusweis() ==> Personalausweis (extends Ausweis) wird zurück gegeben.

Student überschreibt getAusweis() ==> Studentenausweis (extends Ausweis) wird zurück gegeben.
Aber natürlich kann man einen Studenten auch nach seinem Personalausweis fragen.... daher dann ein getPersonalausweis().
Das kann man dann z.B. in Person packen. Aber auch in Student.... Da ist dann die Frage, wie man das sieht ...

Aber Design ist zweifelhaft:
Wobei da ein Design besser wäre, bei dem eine Person generell mehrere Ausweise haben kann und dann gibt es ein getAusweis(Ausweisklasse...). Dann kann man speziell nach getAusweis(Personalausweis.class, Reisepass.class) fragen, wenn man ein solchen offiziellen Ausweis braucht und das Immatrikulationsamt fragt dann nach getAusweis(Studentenausweis.class) oder so.

Edit: Und angefangen zu schreiben hatte ich das, als da noch weniger Antworten waren ... aber ich denke, dass da noch ein gewisser Mehrwert drin ist ...
 
Kirby_Sike

Kirby_Sike

Ach - Du willst also auf die super super Klasse Zugreifen? Du hast also;
- Person mit toString()
- UniPerson extends Person mit toString()
- Student extends UniPerson und willst da auf die toString() von Person zugreifen?

Was ist das für eine Anforderung? Wozu brauchst Du dies genau? Das klingt von Design her sehr suspekt.

Wenn es in Person etwas gibt, das Du auch in Student brauchst, dann darf es von UniPerson nicht überschrieben werden. Sowas kann es ja geben, aber das muss dann zumindest in UniPerson bekannt sein. Bei dem toString sehe ich das so aber erst einmal nicht wirklich ... aber entweder gibt es dann sowas wie getPersonDescription() in Person und toString gibt halt den Aufruf einfach zurück ... Oder das ist etwas, das erst bei UniPerson wichtig ist, und dann hat man da etwas spezielles.

Also um da was zu konstruieren:
Person hat getAusweis() ==> Personalausweis (extends Ausweis) wird zurück gegeben.

Student überschreibt getAusweis() ==> Studentenausweis (extends Ausweis) wird zurück gegeben.
Aber natürlich kann man einen Studenten auch nach seinem Personalausweis fragen.... daher dann ein getPersonalausweis().
Das kann man dann z.B. in Person packen. Aber auch in Student.... Da ist dann die Frage, wie man das sieht ...

Aber Design ist zweifelhaft:
Wobei da ein Design besser wäre, bei dem eine Person generell mehrere Ausweise haben kann und dann gibt es ein getAusweis(Ausweisklasse...). Dann kann man speziell nach getAusweis(Personalausweis.class, Reisepass.class) fragen, wenn man ein solchen offiziellen Ausweis braucht und das Immatrikulationsamt fragt dann nach getAusweis(Studentenausweis.class) oder so.

Edit: Und angefangen zu schreiben hatte ich das, als da noch weniger Antworten waren ... aber ich denke, dass da noch ein gewisser Mehrwert drin ist ...
Ich würde es natürlich so nicht implementiere, denn UniPerson erbt ja alles was Person besitzt xD Hat mich nur interessiert ob es überhaupt geht mehr als eine Superklasse im "Erb"- Baum hochzuklettern :)
 
Kirby_Sike

Kirby_Sike

Ich fühle mich mal wieder verwirrt..xD Also ich möchte jetzt meine zuvor geschrieben List (Datenstruktur) in einer Testklasse benutze, welche im Package der Klasse Person liegt. Ich frage mich nur warum mein import Statement falsch ist... :)

Java:
import javaList.List;
12924
 
J

JustNobody

Also so wie es aussieht, sind das unterschiedliche Projekte. Hast Du denn da die Abhängigkeit richtig?

Nur weil du in javaK etwas geschrieben hast, kannst Du in einem anderen Projekt nicht drauf zugreifen.

Aber das ist mal wieder Kaffeesatzlesen ... Die Informationen sind mal wieder mehr als spärlich....
 
Kirby_Sike

Kirby_Sike

Also so wie es aussieht, sind das unterschiedliche Projekte. Hast Du denn da die Abhängigkeit richtig?

Nur weil du in javaK etwas geschrieben hast, kannst Du in einem anderen Projekt nicht drauf zugreifen.

Aber das ist mal wieder Kaffeesatzlesen ... Die Informationen sind mal wieder mehr als spärlich....
Welche Informationen wären dir den Hilfreich? :)
 
J

JustNobody

Was hast Du genau gemacht? Was ist der genaue Fehler? Was ist der genaue Code? Einfach mehr Details, so dass man verstehen kann, was Du da überhaupt machst. Und ist meine Vermutung korrekt, dass Du da unterschiedliche Projekte hast?
 
Kirby_Sike

Kirby_Sike

Was hast Du genau gemacht? Was ist der genaue Fehler? Was ist der genaue Code? Einfach mehr Details, so dass man verstehen kann, was Du da überhaupt machst. Und ist meine Vermutung korrekt, dass Du da unterschiedliche Projekte hast?
Also so viel habe ich nicht geändert. Ich habe meine Datenstruktur Liste in einem Package(javaList) und meine "Datenbank"(Die Klassen Person etc) im Package (javaPersonData).

Nun möchte ich gerne die Datenstruktur in eine Testklasse importieren welche ebenfalls im Package javaPersonData liegt.

Hier sind alle Dateien:

package javaList:

Java:
package javaList;

public class Node <T> {

    private T data;
    private Node <T> next;
    private Node <T> previous;
    
    public Node(T dataValue){
        this.data = dataValue;
        this.next = null;
        this.previous = null;
    }
    
    public void setNext(Node <T> next) {
        this.next = next;
    }
    
    public Node <T> getNext(){
        return next;
    }
    
    public void setPrevious(Node <T> previous) {
        this.previous = previous;
    }
    
    public Node<T> getPrevious(){
        return previous;
    }
    
    public T getData() {
        return data;
    }
    
    @Override
    public String toString() {
        return "[" + data + "] ";
    }
}
Java:
package javaList;

public class List <T> {

    private Node <T> front;
    private Node <T> rear;
    
    public List() {
        front = null;
        rear = null;
    }
    
    public void add() {
        
    }
    public void addAfterElement(Node <T> before, T data) throws InstantiationException, IllegalAccessException{
        if(before == null) {
            System.out.println("Du kannst nach einem null nichts einfügen!");
            return;
        }
        Node <T> newNode = new Node<T>(data);
        newNode.setNext(before.getNext()); //Setze den next der neuen Node auf den Nachfolger
        before.getNext().setPrevious(newNode); //Setze das previous der neuen Node auf die neue Node
        before.setNext(newNode);  //Setze die neue Node als Nachfolger der vorherigen Node
        newNode.setPrevious(before); //Setze den Vorgänger der neuen Node
        
    }
    
    public void addFront(T data) throws InstantiationException, IllegalAccessException{
        Node <T> newNode = new Node<T>(data);
        newNode.setNext(front);
        newNode.setPrevious(null);
        front = newNode;
        
    }
    
    public void addRear(T data) throws InstantiationException, IllegalAccessException{
        Node <T> newNode = new Node<T>(data);
        newNode.setPrevious(rear);
        newNode.setNext(null);
        rear = newNode;
    
    }
    
    public void printList() {
        for(Node<T> it = front; it != null; it=it.getNext()) {
            System.out.println(it.toString());
        }
    }
    
    public boolean isEmpty() {
        return front == null && rear == null;
    }
    
    public void setFront(Node <T> front){
        this.front = front;
    }
    
    public Node<T> getFront(){
        return this.front;
    }
    
    public void setRear(Node <T> rear){
        this.rear = rear;
    }
    
    public Node<T> getRear(){
        return this.rear;
    }
}

package javaPersonData:

Java:
package javaPersonData;

public class Person {

    protected String prename;
    protected String surname;
    protected int age;
    protected Ort adress;
    
    public Person(String prename, String surname, int age, Ort adress) {
        this.prename = prename;
        this.surname = surname;
        this.age = age;
        this.adress = adress;
    }
    
    public void setPrename(String prename) {
        this.prename = prename;
    }
    
    public String getPrename() {
        return prename;
    }
    
    public void setSurname(String surname) {
        this.surname = surname;
    }
    
    public String getSurname() {
        return surname;
    }
    
    public void setAge(int age) {
        this.age = age;
    }
    
    public int getAge() {
        return age;
    }
}
Java:
package javaPersonData;
public class Ort {

    protected String straße;
    protected int hausnummer;
    protected int postleihzahl;
    
    public Ort(String straße, int hausnummer, int postleihzahl) {
        this.straße = straße;
        this.hausnummer = hausnummer;
        this.postleihzahl = postleihzahl;
    }
    
    public void setNewAdress(Ort wohnort) {
        
    }
}
Java:
package javaPersonData;
public class UniPerson extends Person{
    
    protected int matrikelnummer;
    
    public UniPerson(String prename, String surname, int age, Ort adress, int matrikelnummer) {
        super(prename, surname, age, adress);
        this.matrikelnummer = matrikelnummer;
    }
    
    public String toString() {
        return "Vorname: " + prename + "\n" + "Nachname: " + surname + "\n" + "Alter: " + age + "\n" + "Wohnort: [" + adress.straße + " "
                + adress.hausnummer + ", " + adress.postleihzahl + "]" + "\n" + "Matrikelnummer: " + matrikelnummer;
    }
}
Java:
package javaPersonData;

public class Professor extends UniPerson{
    
    protected String institute;
    protected int salary;
    
    public Professor(String prename, String surname, int age, Ort adress, int matrikelnummer, int salary, String institute) {
        super(prename, surname, age, adress, matrikelnummer);
        this.institute = institute;
        this.salary = salary;
    }
    
    public String toString() {
        return super.toString() + "\n" + "Gehalt: " + salary + "\n" + "Institut: " + institute;
    }
}
Java:
package javaPersonData;

public class Student extends UniPerson{
    
    protected double zensurschnitt;
    
    public Student(String prename, String surname, int age, Ort adress, int matrikelnummer, double zensurschnitt) {
        super(prename, surname, age, adress, matrikelnummer);
        this.zensurschnitt = zensurschnitt;
    }
    
    public String toString() {
        return super.toString() + "\n" + "Zensurschnitt: " + zensurschnitt;
    }
}
Java:
package javaPersonData;

public class UniAngestellter extends UniPerson{
    
    protected int salary;
    protected String job;
    
    public UniAngestellter(String prename, String surname, int age, Ort adress, int matrikelnummer, int salary, String job) {
        super(prename, surname, age, adress, matrikelnummer);
        this.salary = salary;
        this.job = job;
    }
    
    public String toString() {
        return super.toString() + "\n" + "Gehalt: " + salary + "\n" + "Job: " + job;
    }

}
Java:
package javaPersonData;
// <---- Hier möchte ich gerne das Package der List importieren

public class MainTester {

    public static void main(String[] args) {
        
    }
}
 
J

JustNobody

Aus dem Bild in #9 geht aber doch hervor, dass es nicht nur in unterschiedlichen packages ist, denn auf dem Bild kann man den src Ordner erkennen und da ist nur ein package drin!
 
Kirby_Sike

Kirby_Sike

Wie könnte man denn eine Klasse aus einem komplett anderen Ordner mit anderer src importieren?
 
L

LimDul

Man könnte es in den gleichen Source Folder kopieren. Gibt es den einen Grund warum es zwei Projekte sind?

Ansonsten muss halt der andere Source Folder im Class-Path ergänzt werden, in Eclipse heißt entsprechend den Build Path in den Project Properties anzupassen und da das andere Projekt angeben.
 
Kirby_Sike

Kirby_Sike

Man könnte es in den gleichen Source Folder kopieren. Gibt es den einen Grund warum es zwei Projekte sind?

Ansonsten muss halt der andere Source Folder im Class-Path ergänzt werden, in Eclipse heißt entsprechend den Build Path in den Project Properties anzupassen und da das andere Projekt angeben.
Naja ich habe es so gemacht um einfach herauszufinden und zu lernen wie es überhaupt geht xD Learning by doing xD
 
Kirby_Sike

Kirby_Sike

Soo jetzt stellt sich mir die nächste Frage:

Ich habe jetzt 3 Instanzen zu meiner Liste erstellt, welche wie eine Art Datenbank fungieren sollen, jedoch frage ich mich was eine gute Methode ware einen Datentyp so in die Liste zu speichern, sodass ich nicht einen extra Wert als "data" wie in meiner Node Klasse zu übergeben.

Beispiel:

Ich habe jetzt die folgenden Listen:

Java:
List <Student> database_students = new List <Student>();
List <Professor> database_professors = new List <Professor>();
List <UniAngestellter> database_others = new List <UniAngestellter>();
Ich möchte jetzt gerne jedes neue gespeichert Element per Methode addRear() hinten an die Liste anfügen:

Java:
public void addRear(T data) throws InstantiationException, IllegalAccessException{
        Node <T> newNode = new Node<T>(data);
        newNode.setPrevious(rear);
        newNode.setNext(null);
        rear = newNode;
   
    }
Mein Datentyp in dem Beispiel ist jetzt Student. Ich habe bereits in meiner Test Klasse alle Attribute von Student gefüllt:

Java:
if(databaseMode.equals("Student")) {
                String prename = readString();
                String surname = readString();
                int age = readInteger();
                Ort adress = fillOrt();
                int matrikelnummer = readInteger();
                double zensurschnitt = readDouble();
                Student newStudent = new Student(prename, surname, age, adress, matrikelnummer, zensurschnitt);
                try {
                    database_students.addRear(newStudent);
                } catch (InstantiationException | IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
Ist diese Herangehensweise gut?

Edit: Ich habe während des Verfassens des Beitrags gemerkt wie inhaltslos meine Frage oben ist xD Dennoch interessiert mich ob mein einspeichern in die Liste korrekt ist :)
 
Thema: 

Methode aus Superklasse benutzen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben