原題:
//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;
}
}