程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 在csdn上看到的怪問題

在csdn上看到的怪問題

編輯:關於JAVA

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()方法.

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