我有一个父类A和一个子类B,而B覆盖了A的方法f。
public class A
{
public String f()
{
return "A";
}
}
public class B extends A
{
...
public String f()
{
return "B";
}
public static void main(String[] args)
{
B b = new B();
A a = (A) b;
System.out.println(b.f()); //prints: B
}
}
我创建一个类型为B,b的对象,并将其强制转换为类型A,并将其分配给类型为a,a的变量,然后在a上调用方法f。现在,我希望可以调用父类的方法,因为我正在处理类型A的对象,但事实并非如此,它会调用方法的b版本(在程序中打印“
B”而不是“ A”下面的代码)。
为什么会这样呢?是设计决定还是技术限制?
它应该像那样工作。
根据 对象 的 实际类型(而 不是引用 对象的类型 )动态地调度(选择/调用)任何方法。
将对象转换为其他类型时,只需使用其他类型进行引用即可。对象的实际类型不变。(它永远不会改变)。
因此,您正在观察的行为是预期的,并且设计为是这种方式。绝对不是限制。
希望这可以帮助。
对API控制器的远程调用(通过RestTemboard)(从一侧返回已知对象的List([]),从远程侧返回未知类型的对象)返回
我在一个扩展的asynctask中得到了这个错误,但我确信Object[]是一个void[]。 这是我的自定义AsyncTask: 我是这样叫execute的:
在通用堆栈的实现中,使用了以下习惯用法,并且没有任何问题 但是,当我尝试以下操作时,它会导致ClassCastException 这个你怎么解释?
我有一种方法,可以按照班级团队中的国家对数据库中的数据进行排序。Hibernate在列表中返回我的数据 我的错误日志: 我的冠军联赛课程: 我的班级: }
例如:Date值为:“dateCollected”:fri Jul 07 00:00:00 IST 1989, 但它只服用星期五而不是整个日期。
假设我有一个继承链,其中每个类都通过添加一个新字段来扩展其超类,我希望该链的每个类都覆盖方法,如下所示: 如果我使用抽象基类,那么当继承链的一个类通过实现抽象方法变得具体时,从那时起的所有子类也通过继承已经实现的方法变得具体。 Java中有没有一种方法可以强制每个类重写(重新实现)抽象方法,即使它已经在继承链中实现得更高?