这个问题对某些人来说可能听起来很愚蠢,但我需要在脑海中清楚地表达出来。
class J_SuperClass {
void mb_method() {
System.out.println("J_SuperClass::mb_method");
}
static void mb_methodStatic() {
System.out.println("J_SuperClass::mb_methodStatic");
}
}
public class J_Test extends J_SuperClass {
void mb_method() {
System.out.println("J_Test::mb_method");
}
static void mb_methodStatic() {
System.out.println("J_Test::mb_methodStatic");
}
public static void main(String[] args) {
J_SuperClass a = new J_Test();
a.mb_method();
a.mb_methodStatic();
J_Test b = new J_Test();
b.mb_method();
b.mb_methodStatic();
}
}
输出是:
J_Test::mb_method
J_SuperClass::mb_methodStatic
J_Test::mb_method
J_Test::mb_methodStatic
我知道动态绑定在运行时发生,静态绑定在编译时发生。此外,对于动态绑定,对象的实际类型确定调用哪个方法。所以我的问题是,在上面的代码中,单词“static”会导致静态绑定,因此对象的DECLARED类型决定了调用哪个方法?
答案 0 :(得分:1)
是的,static这个词确定静态绑定,因为在静态方法的情况下没有多态(因此需要动态绑定)。该方法绑定到名称,而不是类型,因为它是该类中唯一具有该名称的方法;它与任何对象无关,因为它是静态的。
答案 1 :(得分:0)
您可以尝试反编译J_Test类。在那里你会看到:
public static void main(String args[])
{
J_SuperClass a = new J_Test();
a.mb_method();
J_SuperClass.mb_methodStatic();
J_Test b = new J_Test();
b.mb_method();
mb_methodStatic();
}
因此,超类的静态方法是绑定的。