原题: //file: MyMain.class class Base { int a=10; public void show() { System.out.println(a); } } class Ext extends Base { int a=200; public void show(String s) { System.out.println(s); } } public class MyMain { public static void main(String[] argv) { Ext obj=new Ext(); obj.show(); obj.show("OK"); } } 请问,执行上面程序,运行是什么? ======================== 关于这道题目,我给出了一个简单的原则,现在有空顺便说 清楚一点这个有趣的现象。 首先要说明,我认为,属性并非不可以override, 成员变量是可以override的,但是成员变量是在编译时解析的 (而方法是在运行时解析的) 这样一来,当子类要引用父类对象的属性时,实际上它会屏蔽 自己的同名属性,只去访问父类对象的属性,所以直接引用 变量名和通过方法来获取变量的效果是不一样的, 这里有个非常好的例子,有时间好好看看,想想 public class Shadow { public static void main(String s[]) { S1 s1 = new S1(); S2 s2 = new S2(); System.out.println(s1.s); // prints S1 System.out.println(s1.getS()); // prints S1 System.out.println(s2.s); // prints S2 System.out.println(s2.getS()); // prints S2 s1 = s2; System.out.println(s1.s); // prints S1, not S2 - // since variable is resolved at compile time System.out.println(s1.getS()); // prints S2 - // since method is resolved at run time } } class S1 { public String s = "S1"; public String getS() { return s; } } class S2 extends S1{ public String s = "S2"; public String getS() { return s; } }
|