首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这是动态调度吗?

这是动态调度吗?
EN

Stack Overflow用户
提问于 2011-08-20 23:57:13
回答 4查看 2.7K关注 0票数 3

这是动态分派吗:

代码语言:javascript
复制
abstract class A{
    public method Meth1(){
    //somecode
    }
}

class B extends A{
}

class C extends A{
}

完全在另一个类中:

代码语言:javascript
复制
Some_Method(A a){
    a.Meth1();
}

我不确定这是否是动态分派,因为两个子类上的行为是相同的?

如果不是,如果行为是按子类定义的,那么它会是动态分派吗?

EN

回答 4

Stack Overflow用户

发布于 2011-08-21 00:27:34

我不确定您对您的特定问题所说的是什么(如果被调用的方法被静态地声明在一个类中,那么可能有一些特定于实现的优化将绕过运行时类型检查),但实际上,动态分派允许在运行时确定Meth1方法的实际实现。因此,即使现在BC都没有覆盖Meth1,以后如果被覆盖,动态分派将确保如果形式参数a的运行时类型为B,那么实际实现将是B上的类型。C的情况与此类似。

这与Java中的方法重载形成对比,在Java中,实际的方法是在编译时根据所用参数的声明类型确定的。

代码语言:javascript
复制
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));
  }
}
票数 1
EN

Stack Overflow用户

发布于 2014-07-12 01:10:13

它是动态分派的,因为在为调用类生成字节码时,编译器不能假设它知道类的全部。

字节码解释器或JIT编译器在运行时也不会,至少因为类可以动态加载。

在我看来,这使得java别无选择,只能使用动态分派,而不是“偷工减料”,即将调用优化为基类调用。

票数 0
EN

Stack Overflow用户

发布于 2016-05-07 21:51:47

是的,就是这样!

因为在Java中,默认情况下所有实例方法都是虚拟的。(Can you write virtual functions / methods in Java?)

然后解析a.Meth1()需要在运行时完成。请记住,您可以使用从A派生的类动态加载新的JAR,该类具有该方法的覆盖。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7132883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档