尽管使用了super关键字,为什么我的派生类方法不会从基类调用overriden方法?

时间:2016-07-08 11:39:13

标签: java inheritance super override

我有三个名为 Human.java Superhero.java Run.java 的类。超级英雄扩展了人类,并且在超级英雄中重写了方法 introduction(),并调用了父类的 introduction()。但是,当我创建一个超级英雄对象并调用介绍方法时,它不会打印基类方法的返回值。怎么了?提前谢谢。

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());
    }
}

3 个答案:

答案 0 :(得分:4)

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

SuperHero类的引入方法是将调用返回的String转储到基本方法&amp;而是返回"I am also known as " + alterEgo + "!"

您需要返回基类实现返回的String的连接结果+ SuperHero特定的字符串:

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

答案 1 :(得分:2)

您的方法无法打印从超类返回的内容的原因是您的重写方法会丢弃返回值。一般来说,这没关系,所以Java并没有就此提出警告。但是,在这种情况下,您希望使用返回值,因此不应忽略调用super.introduce()方法的结果。

您的方法应该使用该值,并附加到它,如下所示:

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

答案 2 :(得分:2)

1st:您正在调用 super.introduce(),它返回一个字符串但您没有对该字符串执行任何操作。您需要将其分配给变量并将其添加到return语句中以使其可见。

第二名:我建议您将 introduction()方法更改为 toString(),因为这样您就可以通过编写来获取字符串:

System.out.println(superhero);

您需要做的就是返回 &#34;嘿!我&#34; m&#34; +名称+&#34;而且我是&#34; +年龄+&#34;年岁。&#34; 部分:

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

我个人更喜欢实现像这样的 toString()方法。

@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;
}