public class test2 { public String user = "test2";
public test2() { }
public String getUser(){ System.out.println(this.user); //這裡打印的為什麼是"test2",而不是"test4" user = getPassword(); //這裡執行的為什麼是test3的方法,而不是本身定義的方法呢 return user; } public String getPassWord(){ System.out.println(this.user); return "hello test2"; }}
public class test3 extends test2{ public String user = "test3"; public test3() { }
public String getPassWord(){ System.out.println(this.user); return "hello test3"; }}
public class test4 extends test3{ public String user = "test4"; public test4() { } public static void main(String[] args){ test4 t4 = new test4(); t4.getUser(); }}
輸出結果是:test2,test3被給分人的解答是:
1.這是個作用域的問題!由於在繼承中,只是針對方法的覆蓋,對於屬性並沒有覆蓋的作用。
那樣來說,user這個屬性,在一個test4的對象裡面就有3份!
在test4的作用范圍內,他就是test4,test3的范圍內就是test3.
這個問題,可能比較難以讓人理解。但是你想一下類代碼的調用方式你就明白了!
如果你學過c的話,你肯定知道,全局變量帶來的副作用,哈哈,跟這個類似!
不過這個問題,好像還真不是個一般的問題,我用jb跟蹤執行的時候,那個user一直是test4,但是實際輸出的就不是了!
不知道jb的調試工具,對這個問題怎麼考慮的!2.this傳的是當前調用方法的對象的句柄,在本例中是test4,而它有三個user屬性,它們是有各自的屬性域的,即在test2中只顯示"test2",即在test3中只顯示"test3"(若在test3中也重寫一段getuser(),那就會顯示"test3",感覺就是三個屬性只在自己娘家才會顯現出對應的那個);對於方法,則只是調用最近一層父類的方法,所以調用test3的getpassWord()方法.