2016-07-08 25 views
2

Ich habe drei Klassen mit dem Namen Human.java, Superhero.java und Run.java. Der Superheld erweitert Human und die Methode Einführung() wird in Superhero mit Aufruf der übergeordneten Klasse Einführung() übersteuert. Aber wenn ich ein Superhelden-Objekt mache und die Methode introduce aufruft, wird der zurückgegebene Wert der Basisklassenmethode nicht ausgegeben. Was ist los mit dir? Danke im Voraus.Warum ruft meine abgeleitete Klassenmethode die Methode override nicht von der Basisklasse auf, obwohl das Schlüsselwort super verwendet wird?

Human.java

public class Human implements Comparable<Human> { 
     private int age; 
     private String name; 

     public Human(String givenName, int age) { 
      this.name = givenName; 
      this.age = age; 
     } 

     public String getName() { 
      return name; 
     } 

     public int getAge() { 
      return age; 
     } 

     public String introduce() { 
      return "Hey! I'm " + name + " and I'm " + age + " years old."; 
     } 

     @Override 
     public int compareTo(Human H1) { 
      if(this.getAge() > H1.getAge()) 
       return 1; 
      else if (this.getAge() < H1.getAge()) 
       return -1; 
      else 
       return 0; 
     } 
} 

Superhero.java

public class Superhero extends Human { 
    private String alterEgo; 
    private int age; 
    private String name; 

    public Superhero(String givenName, int age, String alterEgo) { 
     super(givenName, age); 
     this.alterEgo = alterEgo; 
    } 

    public String getAlterEgo() { 
     return alterEgo; 
    } 

    @Override 
    public String introduce(){ 
     super.introduce(); 
     return "I am also known as " + alterEgo + "!"; 
    } 
} 

Run.java

public class Run { 
    public static void main(String[] args) { 
     Superhero superhero = new Superhero("Bruce", 26, "Batman"); 
     System.out.println(superhero.introduce()); 
    } 
} 
+1

Abgesehen von dem beschriebenen Problem müssen Sie in abgeleiteten Klassenfeldern der Oberklasse ('age',' name') nicht neu definieren. Diese Felder werden als von denen im Superklassencode abweichend betrachtet, was zu großer Verwirrung führen kann. – Pshemo

Antwort

2

1. Platz: Sie rufen super.introduce() Das gibt eine Zeichenfolge zurück, aber Sie tun nichts mit dieser Zeichenfolge. Sie müssen es einer Variablen zuweisen und es Ihrer Return-Anweisung hinzufügen, damit es sichtbar ist.

2.: Ich empfehle Ihnen, die () Methode toString einführen ändern() seit dieser Art und Weise Sie die Zeichenfolge nur um das Schreiben zu bekommen:

System.out.println(superhero); 

Hier ist das, was Sie brauchen, um tun, um die "Hey! Ich bin" + name + "und ich bin" + Alter + "Jahre alt." auch Teil:

@Override 
public String toString(){ 
    return super.introduce() + "\n" + "I am also known as" + alterEgo +  "!"; 
} 

persönlich bevorzugen Umsetzung i mein toString() Methoden wie diese.

@Override 
public String toString(){ 
    String string = super.toString(); 
    string = string + "\n"; 
    string = string + "I am also known as"; 
    string = string + alterEgo; 
    string = string + "!"; 
    return string; 
} 
+0

Ich empfehle einen 'StringBuilder' für den Verkettungsteil. –

+0

@MohammedAoufZOUAG Beide funktionieren gut. Mir persönlich gefällt die __ * string = string + something; * __ schau auf __ * stringBuilder.append (something); * __ –

2

Der Grund Ihrer Methode Druckt nicht, was von der Oberklasse zurückgegeben wird, ist, dass Ihre übergeordnete Methode den Rückgabewert ablegt. Im Allgemeinen ist dies in Ordnung, deshalb warnt Java Sie nicht davor. In diesem Fall möchten Sie jedoch den Rückgabewert verwenden. Daher sollten Sie das Ergebnis des Aufrufs der Methode super.introduce() nicht ignorieren.

Ihre Methode sollte diesen Wert nehmen, und fügen Sie es, wie folgt aus:

@Override 
public String introduce(){ 
    return super.introduce() + "\n" 
    + "I am also known as " + alterEgo + "!"; 
} 
4
@Override 
public String introduce(){ 
    super.introduce(); 
    return "I am also known as " + alterEgo + "!"; 
} 

Die Einführung Methode der Superheld-Klasse wird der String Dumping durch den Aufruf der Basis-Methode zurück & Rückkehr "I am also known as " + alterEgo + "!" stattdessen.

Sie müssen das Ergebnis der Verkettung der von der Basisklasse Implementierung zurück String zurückzukehren + der SuperHero -spezifische string:

@Override 
public String introduce(){ 
    return super.introduce() + "I am also known as " + alterEgo + "!"; 
} 
+0

Wahrscheinlich willst du super.introduce() + "\ nIch bin auch bekannt als" + alterEgo + "!"; obwohl :) –

+0

Ohne jeden Zweifel. –