我正在 Coursera 上学习 Amazon Junior Dev 课程,并正在完成第一门课程的最终项目,该课程重点关注继承和多态性。
更广泛的任务是创建一个动物园。我目前正在研究的问题的结构是顶部有一个抽象类
Animal
,和两个子类Tiger
和Dolphin
。
这个任务是让我在调用父类的默认构造函数的同时构建子类,这样我就可以在实例化 Tiger 和 Dolphin 对象时通过 main 方法中的构造函数传递特定的字符串,并从抽象继承 getter 方法父类将该字符串返回为
nameOfAnimal
,或者在父类中实例化并通过构造函数通过子类继承的字符串属性。
在父类中,动物:
String nameOfAnimal;
// no argument constructor
public Animal() {
nameOfAnimal = "Unknown Animal";
}
// parametrized constructor
public Animal(String nameOfAnimal) {
this.nameOfAnimal = nameOfAnimal;
}
public String getNameOfAnimal() {
return nameOfAnimal;
}
public void setNameOfAnimal(String nameOfAnimal) {
this.nameOfAnimal = nameOfAnimal;
}
在子类中,调用超类的构造函数:
public Tiger(String nameOfAnimal){
super();
鉴于父类和子类中的上述代码,我在 main 方法中尝试了以下方法:
Tiger tigerObject = new Tiger("Tiger");
任务是使用 getter 方法返回动物的名称,这样
System.out.println("The animal which is chosen is : " + tigerObject.getNameOfAnimal());
将返回
The animal which is chosen is: Tiger
不幸的是,无论我尝试什么配置,它都会返回
The animal which is chosen is: Unknown Animal
,我认为如果我调用无参数构造函数而不是参数化构造函数,将会返回该值。
自从我实例化了该对象,特别是将“Tiger”作为 nameOfAnimal 传递,我一生都无法弄清楚我做错了什么。
谢谢!
您的
Tiger
构造函数应将 nameOfAnimal
参数委托给超类,如下所示:
public Tiger(String nameOfAnimal){
super(nameOfAnimal);
我什至不知道你是如何没有编译失败的(假设 Animal 中的构造函数是唯一的)。在上面的示例中,您使用子类中提供的参数调用 Animal 的构造函数,因此它将被设置为字段。