Java初學者都必須理解的六大問題

2021-08-27 10:34:32 字數 1734 閱讀 1233

問題一:我宣告了什麼!

string s = "hello world!";   

許多人都做過這樣的事情,但是,我們到底宣告了什麼?回答通常是:乙個string,內容是「hello world!」。這樣模糊的回答通常

是概念不清的根源。如果要準確的回答,一半的人大概會回答錯誤。   

這個語句宣告的是乙個指向物件的引用,名為「s」,可以指向型別為string的任何物件,目前指向"hello world!"這個string型別

的物件。這就是真正發生的事情。我們並沒有宣告乙個string物件,我們只是宣告了乙個只能指向string物件的引用變數。所以,如

果在剛才那句語句後面,如果再執行一句:   

string string = s;   

我們是宣告了另外乙個只能指向string物件的引用,名為string,並沒有第二個物件產生,string還是指向原來那個物件,也就是,

和s指向同乙個物件。

問題二:"=="和equals方法究竟有什麼區別?

==操作符專門用來比較變數的值是否相等。

比較好理解的一點是:   

int a=10;   

int b=10;   

則a==b將是true。   

但不好理解的地方是:   

string a=new string("foo");   

string b=new string("foo");   

則a==b將返回false。   

根據前一帖說過,物件變數其實是乙個引用,它們的值是指向物件所在的記憶體位址,而不是物件本身。a和b都使用了new操作符,意

味著將在記憶體中產生兩個內容為"foo"的字串,既然是「兩個」,它們自然位於不同的記憶體位址。a和b的值其實是兩個不同的記憶體

位址的值,所以使用"=="操作符,結果會是false。誠然,a和b所指的物件,它們的內容都是"foo",應該是「相等」,但是==操作符

並不涉及到物件內容的比較。   

物件內容的比較,正是equals方法做的事。   

看一下object物件的equals方法是如何實現的:   

boolean equals(object o)

public class phonebill extends bill

public class gasbill extends bill

在處理程式裡有乙個方法,接受乙個bill型別的物件,計算金額。假設兩種賬單計算方法不同,而傳入的bill物件可能是兩種中

的任何一種,所以要用instanceof來判斷:

public double calculate(bill bill) {

if (bill instanceof phonebill) {

//計算**賬單

if (bill instanceof gasbill) {

//計算燃氣賬單

這樣就可以用乙個方法處理兩種子類。 然而,這種做法通常被認為是沒有好好利用物件導向中的多型性。其實上面的功能要求

用方法過載完全可以實現,這是物件導向變成應有的做法,避免回到結構化程式設計模式。只要提供兩個名字和返回值都相同,接受引數

型別不同的方法就可以了:

public double calculate(phonebill bill) {

//計算**賬單

public double calculate(gasbill bill) {

//計算燃氣賬單

Delphi初學者應小心的六大陷阱

原文 http develop.csai.cn delphi 200704301205181705.htm 初學delphii的人,由於各種原因,對delphii中的許多概念不能很好的理解,並由此帶來了許多的問題,或者是開發出的程式穩性不好,一會能執行,一會又不能執行 或者是遇到乙個問題久思不得其解...

symfony初學者必須掌握的知識

講解如何生成資料表及建立bunlde改為 模版 設定url 如果是圖片等靜態檔案 asset test path 不要已 開頭 如果是程式 controller path name name 可以是本bundle內controller 定義的。還可以是 routing.yml 檔案中定義 建立乙個 ...

Vue slot scope的理解(適合初學者)

先拋例程 少壯不努力,老大徒傷悲 光陰似箭,日月如梭 你好啊結尾 例程中也寫了普通插槽和具名插槽,這個我就不說,我就說一下作用域插槽。首先從 作用域插槽 這個名字說起,本來你父元件的模板是無法使用到子元件模板中的資料,官網中有一句特別強調的話 父元件模板的所有東西都會在父級作用域內編譯 子元件模板的...