这是动态分派吗:
abstract class A{
public method Meth1(){
//somecode
}
}
class B extends A{
}
class C extends A{
}完全在另一个类中:
Some_Method(A a){
a.Meth1();
}我不确定这是否是动态分派,因为两个子类上的行为是相同的?
如果不是,如果行为是按子类定义的,那么它会是动态分派吗?
发布于 2011-08-21 00:27:34
我不确定您对您的特定问题所说的是什么(如果被调用的方法被静态地声明在一个类中,那么可能有一些特定于实现的优化将绕过运行时类型检查),但实际上,动态分派允许在运行时确定Meth1方法的实际实现。因此,即使现在B和C都没有覆盖Meth1,以后如果被覆盖,动态分派将确保如果形式参数a的运行时类型为B,那么实际实现将是B上的类型。C的情况与此类似。
这与Java中的方法重载形成对比,在Java中,实际的方法是在编译时根据所用参数的声明类型确定的。
public class Overloading {
public static class User {}
public static class Admin extends User {}
public static String foo(User user) {
return "User specific method";
}
public static String foo(Admin admin) {
return "Admin specific method";
}
// This will print "User specific method" two times, because both
// user1 and user2 have same compile time type, i.e., User. Runtime
// type does not matter.
public static void main(String[] args) {
User user1 = new User();
System.out.println(foo(user1));
User user2 = new Admin();
System.out.println(foo(user2));
}
}发布于 2014-07-12 01:10:13
它是动态分派的,因为在为调用类生成字节码时,编译器不能假设它知道类的全部。
字节码解释器或JIT编译器在运行时也不会,至少因为类可以动态加载。
在我看来,这使得java别无选择,只能使用动态分派,而不是“偷工减料”,即将调用优化为基类调用。
发布于 2016-05-07 21:51:47
是的,就是这样!
因为在Java中,默认情况下所有实例方法都是虚拟的。(Can you write virtual functions / methods in Java?)
然后解析a.Meth1()需要在运行时完成。请记住,您可以使用从A派生的类动态加载新的JAR,该类具有该方法的覆盖。
https://stackoverflow.com/questions/7132883
复制相似问题