假设我有这门课程:
class B extends A
{
@Override
void foo () { ... }
}
现在如果给出B类对象,我可以从A类中显式调用foo方法吗? 我试图向下转换对象,即
B b = new B();
((A)b).foo();
但这似乎不起作用。
那么有没有办法在Java中完成我想做的事情?
答案 0 :(得分:1)
答案 1 :(得分:1)
在Java中,默认情况下所有函数/方法都是虚拟的。因此,在继承场景中,对子类型的方法调用总是在子类型中调用该方法的版本,而不管引用类型是超类型/子类型,即
A a = new B();
a.foo();
B b = new B();
b.foo()
两者都只会在foo()
中调用B
的版本。
如果你是来自C ++的人,其中函数必须被显式声明为虚拟,并且这种行为只能通过指针来观察,那么java中相同的行为需要以不同的方式理解。
答案 2 :(得分:0)
B b = new B();
((A)b).foo();
在第二行中,您使用的是对象&b;#的引用。因此,您在其引用上调用的任何方法都将调用对象' b'的重写方法foo()
。根据对象引用进行思考将有助于您清楚地理解OOPS的Java概念。
答案 3 :(得分:0)
就像这样......
- 调用method
class
的最具体版本。
<强>例如强>
public class A{
public void go(){
System.out.println("A");
}
}
class B extends A{
public static void main(String[] args){
B b = new B();
b.go();
}
}
在上面的class B
中,方法go()
未覆盖,因此将调用class A
中的方法。
现在,如果它如下所示,则会调用class B
方法go()
。
B类延伸A {
public void go(){
System.out.println("B");
}
public static void main(String[] args){
B b = new B();
b.go();
}
}
在上面的课程“The Most specific version of go() method is called
”