美好的一天!
我正在复习 Java OO 概念。 并编写了以下代码:
public class Main {
public static void main(String[] args) {
Animal dog = new Dog();
dog.eat();
dog.sleep();
}
}
abstract public class Animal {
private int age;
public Animal (){
age = 1;
}
public Animal (int age){ //How can I call this constructor?
this.age = age;
}
public void eat(){
System.out.println("Eat");
}
abstract public void sleep();
}
abstract public class Canine extends Animal{
abstract public void roam();
}
public interface Pet {
public String petName = null; //i want the pets to have a variable petName.
public void trick();
}
public class Dog extends Canine implements Pet{
public void roam(){
System.out.println("roam");
};
public void sleep(){
System.out.println("sleep");
};
public void eat(){
System.out.println("Eat Dog");
};
public void trick(){
System.out.println("trick");
}
}
我有几个问题如下:
如何调用 Animal Overloaded 构造函数?
如何在 PET 界面中使用变量 petName?
我是否正确理解了 OO 的概念?我违反了哪些规则?
提前谢谢你。
最佳答案
- 子类将使用 super(...) 作为第一行从它们自己的构造函数中调用 super 构造函数!
- 接口(interface)不能有变量或状态 - 只有方法!
- 您的概念很好,但您的代码无法编译(由于上述第 2 项)。
一些解决方案:
public interface Pet {
String getName();
void trick();
}
现在 Dog 类(或任何实现 Pet 的类)必须实现 Pet.getName()。为 Dog 类提供一个名为“name”的 String 类型的字段,并从 Dog.getName() 返回它。
public abstract class Canine extends Animal {
public Canine(int age) {
super(age); // pass the age parameter up to Animal
}
...
}
public class Dog extends Canine implements Pet {
private final String name;
public Dog(String name,int age) {
super(age); // call the age constructor
this.name=name;
}
public String getName() { return name; }
... rest of class ...
}
每个子类(尤其是抽象子类)都需要为您要调用的所有 父类构造函数提供匹配的构造函数! (所以我将 age 参数添加到 Canine 构造函数中,以便 Dog 可以将 age 参数传递给它。
关于面向对象的概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5576249/