了解多态性

时间:2015-03-15 22:47:54

标签: java polymorphism

为什么我无法从位于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");

}
}

4 个答案:

答案 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

你将陷入一个受伤的世界。