问:下面程序代码段的执行结果是什么?
public class Base {
public static String s = "static_base";
public String m = "base";
public static void staticTest() {
System.out.println("base static: " + s);
}
}
public class Child extends Base {
public static String s = "child_base";
public String m = "child";
public static void staticTest() {
System.out.println("child static: " + s);
}
}
public static void main (String[]args ){
Child c = new Child();
Base b = c;
System.out.println(b.s);
System.out.println(b.m);
b.staticTest();
System.out.println(c.s);
System.out.println(c.m);
c.staticTest();
}
答:输出结果如下。
static_base
base
base static: static_base
child_base
child
child static: child_base
可以看到,上面代码段当通过 b 访问时,访问的是 Base 的变量和方法,当通过 c 访问时,访问的是 Child 的变量和方法,这就是所谓的静态绑定,即访问绑定到变量的静态类型,静态绑定在程序编译阶段即可决定,而动态绑定则要等到程序运行时,实例变量、静态变量、静态方法、private 方法都是静态绑定。
继承重名是允许的,重名后实质有两个变量或者方法。(继承重名,比如说子类和父类都有一个 A 方法或者 B 变量。)
对于 private 变量和方法,他们只能在类内被访问,访问的也永远是当前类(即子类中访问子类的,父类中访问父类的),仅仅是名字相同而已,没有任何关系;
对于 public 变量和方法要看如何访问它,在类内部访问的是当前类的,单子类可以通过 super 明确指定访问父类的,在类外则要看访问变量的静态类型,静态类型是父类,则访问父类的变量和方法,静态类型是子类,则访问子类的变量和方法。