为什么我无法从位于Test类中的main访问Daily类中的方法。具体来说,happenOn()方法是我想从主要访问的方法。如果我创建一个最初类型为Daily的对象,那么它允许我访问happenOn()方法,但是如果我最初将它声明为一般约会,那么它就不会。
我试图教自己多态性btw。
public class Appointment{
private String description;
private String date;
public Appointment(){
this.description = "";
this.date = "";
}
public Appointment(String de, String da){
this.description = de;
this.date = da;
}
public void setDescription(String d){
this.description = d;
}
public String getDescription(){
return this.description;
}
public void setDate(String d){
this.date = d;
}
public String getDate(){
return this.date;
}
public String toString() {
return "Appointment [description=" + description + ", date=" + date + "]";
}
}
public class Daily extends Appointment{
public Daily(){
super();
}
public Daily(String de, String da){
super(de, da);
}
public boolean occursOn(int year, int month, int day){
return true;
}
public String toString(){
String str = "Daily " + super.toString();
return str;
}
}
public class Test {
public static void main(String [] args){
Appointment appt1;
appt1 = new Onetime("See doctor", "01/01/2015");
}
}
答案 0 :(得分:3)
这是因为子类继承父类的属性,而不是相反。虽然您可以将Daily的实例概括为约会,但是如果没有强制转换,您将无法在实例上调用Daily特定的方法。
如果要在Daily和Appointment中访问happenOn(),则需要在Appointment类中声明该方法,以便它的子类继承该方法。
答案 1 :(得分:2)
约会没有occursOn()
。
如果你有maleDuck extends duck
且你给我一个,但只告诉我它是鸭子,我可以把它quack()
,但我不知道它是layseggs()
。
Duck ladyDuck = new FemaleDuck();
ladyDuck.layseggs(); //WRONG, not a ducks lay eggs
FemaleDuck ladyDuck = new FemaleDuck();
ladyDuck.layseggs(); //CORRECT, it's clear we're dealing with female ducks
多态性的有趣之处在于我们overload
quack()
(伪代码:) ...
Duck[] ducks = { new MaleDuck(), new FemaleDuck() };
foreach (duck in ducks) { duck.quack() };
Assert("1 manish quack and 1 ladyish quack just happened");
...我们可以相同地对待它们并访问它们的独特行为。但是我们不能只是在该数组的成员上调用layegg()
,因为MaleDucks
会很困难。
查看一些关于多态性的tutorials。
我不知道为什么我没有把这个用于约会。但我觉得所有多态性的例子必须用汽车或动物来解释,这只是不成文的法律。 :D
答案 2 :(得分:1)
你的Appointment类需要一个方法generateOn,它不需要填充。 然后你可以在覆盖约会的类中覆盖它。
答案 3 :(得分:1)
如果您将Daily
声明为Appointment
,则必须将变量转发为正确的类型才能访问Daily
的{{1}}方法:
occursOn
如果类型声明为 Appointment appt1;
appt1 = new Daily("See Doctor", "01/01/2015");
((Daily) appt).occursOn();
,则编译器仅知道Appointment
方法,即使基础类型为Appointment
。 “向下转换”是将引用类型细化为其派生类之一的过程。请注意,当底层类实际上是派生类型时,您只能向下转换为派生类型,例如,如果您尝试这样做:
Daily
你将陷入一个受伤的世界。