尽管使用了 super 关键字,为什么我的派生 class 方法没有从基础 class 调用重写方法?
Why isn't my derived class method calling the overriden method from base class despite using the super keyword?
我有三个 classes 名为 Human.java、Superhero.java 和 Run.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;
}
我有三个 classes 名为 Human.java、Superhero.java 和 Run.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;
}