c 問答篇 物件與引用變數 初學者的困惑

2022-09-13 19:27:09 字數 1712 閱讀 1527

從巨集觀的角度來看,物件是類的例項。比如:

//定義乙個名為someone的類,代表這麼一些人(通過指定年齡,性別,性格等基本資訊)

class

someone 

//......

//建立乙個someone類的物件,代表暱稱為nemo的乙個特定的人

someone nemo 

=new

someone();

這時,我們會象通常所說的那樣講到:我們建立了乙個名為nemo的someone類的物件(是的,這沒有錯,但它會和下文所講的一些內容產生些許理解上的困惑)。因為每當建立類的乙個例項(暱稱為nemo的某人),就建立該類的乙個物件(名為nemo的someone類的物件),而每個物件自身包含類中定義的所有例項變數(age,***,name等)的乙個拷貝,所以說物件nemo是someone類的例項。順便,我們再建立乙個名為andy的someone類的物件:

someone andy 

=new

someone();

物件nemo和物件andy是相同的嗎?他們僅僅是名字不同而已嗎?不——因為每個物件的變數的值不同!比如:

nemo ——>|age       20      |        andy ——> |age         40        |

|***        「男」   |                      |***    「男」   |

|name  「尼 莫」|                        |name  「劉德華」|

所以nemo和andy是兩個不同的物件,唯一相同的是它們都屬於同一種型別——someone類!

而從微觀的角度來看,我們前面所說的「物件nemo」真的是物件嗎?你可能會奇怪我怎麼會這麼問...

實際上,

someone nemo = new someone();

這一建立乙個someone類的物件的過程分為兩步:

//宣告乙個引用變數

someone nemo;

//建立乙個someone類的物件,new運算子使執行時為該物件動態的分配記憶體;

//然後返回該物件所在的記憶體位址,並賦於變數nemo,從而引用變數nemo指向該物件

nemo 

=new

someone();

此時,對於nemo的理解應該是:nemo是乙個引用新建立的someone類物件的變數(如同c語言的指標變數),它本身並不是乙個物件!

引用變數nemo             物件所在記憶體位址(設執行時為其分配起始位址為100號的連續記憶體單元)  

|          ——|————>100|     20     | age

|    「男」  | ***

| 「尼 莫」 | name

現在你理解了為什麼說類是引用型別了吧?——類物件通過引用來訪問呀!同時,也說明了為什麼上文說「nemo和andy是兩個不同的物件」——執行時為物件動態分配記憶體,所以兩個物件所在的記憶體位址不同,當然兩個物件是不同的咯!——等等,你剛剛不是說nemo是引用變數嗎?怎麼又說「nemo...是...物件」了呢?

筆者在初學時在理解上存在這樣的困惑!

但是,你可能注意到了,someone是乙個類,而nemo自然就是宣告為這個類的乙個變數;而類作為一種型別,它是屬於引用型別,所以nemo自然就是乙個引用型別的變數即引用變數了啊。

關鍵的一點是,我們可以從不同的角度來看這一問題:巨集觀上,nemo是物件;而微觀上,深層的理解,nemo是引用變數。

引用變數和物件 作為初學者的混淆

今天上網課老師在講string型 舉了這麼乙個例子 string物件是不可變的,字串一旦建立,內容不能再變 public class teste 我以前一直以為song就是物件,所以就很迷惑,不是說string物件不能改變嗎,那怎麼song tommorow 還是對的呢?後來我發現這種想法是不對的。...

C語言變數定義與資料溢位(初學者)

1 變數定義的一般形式為 型別說明符 變數名識別符號等 例 int a,b,c abc為整型變數 在書寫變數定義時應注意以下幾點 1 允許在乙個型別說明符後,定義多個相同型別的變數。各變數之間用 間隔。型別說明符與變數名之間用乙個空格間隔。2 最後乙個變數之後必須以 結尾。3 變數定義必須放在變數使...

一維陣列的定義與引用(初學者)

陣列 具有相同型別的資料組成的序列,且該序列是有序集合。陣列中的每乙個資料稱為資料元素 下標變數 陣列元素由其所在的位置序號 資料元素的下標 來區分。陣列名與下標的意義 可以用統一的方式來處理陣列中的所有元素,從而方便的實現處理一批具有相同性質資料的問題。注意 陣列元素的有序不是指元素大小順序。1 ...