程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 成員變量和方法的override的詳解

成員變量和方法的override的詳解

編輯:關於JAVA

原題:

//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;

}

}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved