日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

成员变量的初始化和内存中的运行机制

發布時間:2024/1/17 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 成员变量的初始化和内存中的运行机制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  成員變量被分為類變量和實例變量兩種,定義成員變量時沒有static修飾的就是實例變量,有static修飾的就是類變量。其中類變量從該類的準備階段起開始存在,直到系統完全銷毀這個類,類變量的作用域與這個類的生存范圍相同;而實例變量則從該類的實例被創建起開始存在,直到系統完全銷毀這個實例,實例變量的作用域與對應實例的生存范圍相同。 可以把類變量和實例變量統稱為成員變量,其中類變量可以理解為類成員變量,它作為類本身的一個成員,與類本身共存亡;實例變量則可理解為實例成員變量,它作為實例的一個成員,與實例共存亡。   只要類存在,程序就可以訪問該類的類變量。在程序中訪問類變量通過如下語法:   類.類變量   只要實例存在,程序就可以訪問該實例的實例變量。在程序中訪問實例變量通過如下語法:   實例.實例變量   當然,類變量也可以讓該類的實例來訪問。通過實例來訪問類變量的語法如下:   實例.類變量   但由于這個實例并不擁有這個類變量,因此它訪問的并不是這個實例的變量,依然是訪問它對應類的類變量。也就是說,如果通過一個實例修改了類變量的值,由于這個類變量并不屬于它,而是屬于它對應的類。因此,修改的依然是類的類變量,與通過該類來修改類變量的結果完全相同,這會導致該類的其他實例來訪問這個類變量時也將獲得這個被修改過的值。    class Person{public String name;public static int eyeNum; }public class PersonTest {public static void main(String[] args) {System.out.println("Person的eyeNum類變量值:" + Person.eyeNum);Person p = new Person();System.out.println("p變量的name變量值是: " + p.name + " p對象的eyeNum變量值是: " + p.eyeNum);p.name = "孫悟空";p.eyeNum = 2;System.out.println("p變量的name變量值是: " + p.name + " p對象的eyeNum變量值是: " + p.eyeNum);System.out.println("Person的eyeNum類變量值:" + Person.eyeNum);Person p2 = new Person();p2.name = "張三";p2.eyeNum = 3;Person p3 = new Person();p3.name = "李四";p2.eyeNum = 4;System.out.println("p1對象的eyeNum類變量值:" + p.eyeNum);System.out.println("Person的eyeNum類變量值:" + Person.eyeNum);System.out.println("p2對象的eyeNum類變量值:" + p2.eyeNum);System.out.println("p1對象的name類變量值:" + p.name);System.out.println("p2對象的name類變量值:" + p2.name);System.out.println("p3對象的name類變量值:" + p3.name);} }

outputs:

Person的eyeNum類變量值:0 p變量的name變量值是: null p對象的eyeNum變量值是: 0 p變量的name變量值是: 孫悟空 p對象的eyeNum變量值是: 2 Person的eyeNum類變量值:2 p1對象的eyeNum類變量值:4 Person的eyeNum類變量值:4 p2對象的eyeNum類變量值:4 p1對象的name類變量值:孫悟空 p3對象的name類變量值:李四 p2對象的name類變量值:張三   當Person類初始化完成后,系統將在堆內存中為Person類分配一塊內存區,在這塊內存區里包含了保存eyeNum類變量的內存,并設置eyeNum的默認初始值:0. 系統接著創建了一個Person對象,并把這個Person對象賦給p變量,Person對象里包含了名為name的實例變量,實例變量是在創建實例時分配內存空間并指定初始值的。 eyeNum類變量并不屬于Person對象,它是屬于Person類的,所以創建第一個Person對象時并不需要為eyeNum類變量分配內存,系統只是為name實例變量分配了內存空間,并指定默認初始值:null.   接著執行Person p2 = new Person();代碼創建第二個Person 對象,此時因為Person 類已經存在于對內存中了,所以不再需要對Person 類進行初始化。創建第二個Person 對象與創建第一個Person 對象并沒有什么不同。   name實例變量是屬于單個Person實例的,因此修改第一個Person對象的name實例變量時僅僅與該對象有關,與Person類和其他Person對象沒有任何關系。同樣,修改第二個Person對象的name實例變量時,也與Person類和其他Person對象無關。 執行p.eyeNum = 2;代碼時,此時通過Person對象來修改Person的類變量,Person對象根本沒有保存eyeNum這個變量,通過p訪問的eyeNum類變量,其實還是Person類的eyeNum類變量。因此,此時修改的是Person類的eyeNum類變量。   當通過p來訪問類變量時,實際上訪問的是Person類的eyeNum類變量。事實上,所有的Person實例訪問eyeNum類變量時都將訪問到Person類的eyeNum類變量,本質其實還是通過Person類來訪問eyeNum類變量時,他們所訪問的是同一塊內存。因此,建議當程序需要訪問類變量時,盡量使用類作為主調,而不要使用對象作為主調,這樣可以避免程序產生歧義,提高程序的可讀性。

?

轉載于:https://www.cnblogs.com/ycyoes/p/6050025.html

總結

以上是生活随笔為你收集整理的成员变量的初始化和内存中的运行机制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。