Java中的静态分派

Java中的静态分派,java,class,inheritance,methods,Java,Class,Inheritance,Methods,这里的代码使用静态分派还是动态分派 public class Survey { public void DoSurvey() { System.out.println("DoSurvey is called"); } } Survey survey = new Survey(); survey.DoSurvey(); 因为Java对除private、final和static之外的所有方法都使用动态分派,所以要调用的方法仍然是在运行时决定的,这意味着在

这里的代码使用静态分派还是动态分派

public class Survey
{
    public void DoSurvey()
    {
        System.out.println("DoSurvey is called");
    }
}


Survey survey = new Survey();
survey.DoSurvey();
因为Java对除private、final和static之外的所有方法都使用动态分派,所以要调用的方法仍然是在运行时决定的,这意味着在运行时检查分配给参考调查的对象,并调用正确的方法。尽管如此,还是使用了早期绑定,这意味着编译器具有引用调查的类型,并且可以检查调用该函数是否合法。然后,在检查基础对象的性质时,在运行时动态调度该函数。我的理解正确吗?另外,使用静态分派的示例是什么?

这段丑陋的代码(静态方法通过变量调用)显示了一些静态分派:

public class Parent {
    public static void statictest(){System.out.println("Parent.statictest");}
    public void test(){System.out.println("Parent.test");}
}
public class Child extends Parent {
    public static void statictest(){System.out.println("Child.statictest");}
    public void test(){System.out.println("Child.test");}
}
public static void main(String[] args) {
    Child c=new Child();
    Parent p=c;
    c.test();
    p.test();
    c.statictest();
    p.statictest();
}
将导致

Child.test
Child.test
Child.statictest
Parent.statictest

然而,我不敢声称“这是静态分派,句号”,因为我没有考虑过过载情况下会发生什么,特别是当签名在参数类型上完全不同,并且彼此相关时(因此一个从另一个继承)。

上面的静态是什么?这是动态调度的一个例子。在public之后添加static关键字,并查看您的实现的魔力。顺便说一句,C!=我纠正了帖子,我的错误。现在看,这怎么不是纯粹的静态调度呢?调用的静态方法可以在编译时根据调用它的对象的类型来确定。这是静态调度。当调用test时,会发生动态调度,因为调用的方法的实现是在运行时决定的,这就是为什么在p上调用test会导致打印Child.test的原因(因为实际对象是Child,动态调度调用Child中提供的测试方法),我似乎不明白你的意思。谢谢。@LearningMath是的,这是静态调度。我的意思是我写的:我没有考虑继承、接口和重载的所有可能(ab)用法,这只是一个示例片段,甚至不是“好”代码。