在csdn上看到的怪問題

來源:互聯網
上載者:User
問題
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()方法.


相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。