【发布时间】:2016-07-19 18:34:24
【问题描述】:
我对 Java 还很陌生,但仍在练习面向对象设计和编程的基础知识。我有几个关于继承、对象创建和 super() 调用的正确用法的问题。
请考虑以下几点:
超类,
package pet
public class Dog {
private String foodDogEats;
public Dog() {
this.foodDogEats;
}
public String getDogFood() {
return foodDogEats;
}
public void setDogFood() {
foodDogEats = "kibble";
}
}
子类,
package pet
public class Fido extends Dog {
public Fido() {
super();
Dog dog = New Dog();
this.whatDoesFidoEat();
}
public whatDoesFidoEat(Dog dog) {
System.out.println("Fido eats " + dog.getDogFood());
}
}
和控制器。
package pet
public class MyDogFido {
public void MyDogFido() {
Fido fido = new Fido();
}
}
本示例中的对象是,实例化一个新的Fido 对象,并在此过程中执行whatDoesFidoEat() 中的打印行为。我有几个问题-
因为我已经调用了一个新的Fido 对象(它是Dog 的扩展,如果我记得正确地继承了它的方法和变量),是Fido() 中一个新的Dog 对象的实例化构造函数多余?
super() 的使用怎么样?
哪种行为是正确的——在Fido() 中实例化Dog 对象,调用super(),或两者兼而有之?
我最初在控制类中使用两者编写了一些类似的代码。不过,写完这个问题后,我的直觉告诉我,我应该只打电话给super()。
请随意评论我的示例代码(特别是 Dog() 构造函数中的 this.foodDogEats; 行 - 也不确定那里的用法)。
谢谢!
【问题讨论】:
-
需要注意的是,如果超类使用
private数据成员,则只能使用超类的get/set 方法访问它们。您可以使用protected允许子类通过this直接访问数据成员。private通常仍用于在 get/set 方法中发生某些逻辑的情况下,这些逻辑是超类正常运行所需的。 -
这与问题并不完全相关,但最好避免从构造函数调用非最终方法(就像在
Fido()构造函数中所做的那样)。如果您继承Fido并覆盖getDogFood()方法,您最终可能会出现一些非常意外的行为。
标签: java oop inheritance constructor