问题背景
在java继承场景中,假如有父类Base,字类child, Child类中有和Base类中重名的静态或者非静态成员(字段,方法等)。假如Base类的引用指向了Child类的示例,则按照如下分析其引用的运行类型
1 动态绑定
需要等待运行时才能决定运行类型。动态绑定的情况只有一种
* 实例非静态方法
2 静态绑定
编译时期即可决定运行类型
* 实例变量 * 静态变量 * 静态方法 * private方法
实验代码
Base类
public class Base {
public static String s = "statis base";
public String m = "instance base";
public void method() {
System.out.println("method instance base");
}
public static void smethod() {
System.out.println("method statice base");
}
}
Child类
public class Child extends Base {
public static String s = "statis child";
public String m = "instance child";
public void method() {
System.out.println("method instance child");
}
public static void smethod() {
System.out.println("method statice child");
}
}
测试主程序
public class T {
public static void main(String[] args) {
Child c = new Child();
Base b = c;
System.out.println(c.m);
System.out.println(c.s);
c.method();
c.smethod();
System.out.println("#######################");
System.out.println(b.m);
System.out.println(b.s);
b.method();
b.smethod();
}
}
实验结果
instance child
statis child
method instance child
method statice child
#######################
instance base
statis base
method instance child
method statice base
结论
由实验结果可知,只有实例非静态方法走的动态绑定,其他都是静态绑定