尽管使用了 super 关键字,为什么我的派生 class 方法没有从基础 class 调用重写方法?

Why isn't my derived class method calling the overriden method from base class despite using the super keyword?

我有三个 classes 名为 Human.javaSuperhero.javaRun.java。 Superhero 扩展了 Human,方法 introduce() 在 Superhero 中被调用父 class 的 introduce() 覆盖。但是,当我制作超级英雄对象并调用 introduce 方法时,它不会打印基本 class 方法的返回值。怎么了?提前致谢。

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

您的方法不打印超类的 return 内容的原因是您的覆盖方法删除了 return 值。通常,这是可以的,因此 Java 不会就此警告您。但是,在这种情况下您要使用 return 值,因此您不应忽略调用 super.introduce() 方法的结果。

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

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

SuperHero class 的 introduce 方法正在转储通过调用基本方法 return 编辑的字符串 & returning "I am also known as " + alterEgo + "!" 代替。

您需要 return String return 的串联结果 class 的实现 + SuperHero-具体字符串:

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

1st: 你正在调用 super.introduce() 其中 return 是一个字符串,但你没有这样做任何带有该字符串的东西。您需要将它分配给一个变量并将其添加到您的 return 语句中以使其可见。

2nd: 我建议您将 introduce() 方法更改为 toString()因为这样你就可以通过写得到字符串:

System.out.println(superhero);

这是你需要做的 return "Hey! I'm " + name + " 我是 " + age + " 岁。 " 部分也是:

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