假设我有这个类:
class B extends A
{
@Override
void foo () { ... }
}
现在,如果给我一个 B 类的对象,我可以从 A 类显式调用 foo 方法吗?我尝试向下转换对象,即
B b = new B();
((A)b).foo();
但这似乎不起作用。
那么有没有办法完成我想在 Java 中做的事情?
假设我有这个类:
class B extends A
{
@Override
void foo () { ... }
}
现在,如果给我一个 B 类的对象,我可以从 A 类显式调用 foo 方法吗?我尝试向下转换对象,即
B b = new B();
((A)b).foo();
但这似乎不起作用。
那么有没有办法完成我想在 Java 中做的事情?
在 Java 中,默认情况下所有函数/方法都是虚拟的。因此,在继承场景中,对子类型的方法调用总是调用子类型中该方法的版本,而不管引用类型是超类型/子类型,即
A a = new B();
a.foo();
B b = new B();
b.foo()
两者都只会调用foo()
in的版本B
。
如果您是来自 C++ 的人,其中函数必须显式声明为虚拟,并且这种行为只能通过指针观察到,那么在 java 中相同的行为需要以不同的方式理解。
object
由于多态性,总是方法调用将在类型上。
在这种情况下,即使您进行了强制转换, object 也是 type B
,因此将调用foo()
方法 from 。Class B
这个太阳教程可以帮助你。
就像这样.....
-最具体的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()
没有被覆盖,所以方法 fromclass 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
”
B b = new B();
((A)b).foo();
在第二行中,您正在使用对象“b”的引用。因此,您在其引用上调用的任何方法都将调用foo()
对象“b”的重写方法。从对象引用的角度思考将帮助您清楚地理解 Java 的 OOPS 概念。