[javase學習筆記]-6.4 成員變量與局部變量
阿新 • • 發佈:2018-04-25
ava 包含成員 -m img 不同之處 棧內存 RM 代碼塊 pub
我們能夠看到People類中我們定義了name,age,sex這三個變量就是成員變量;而在main方法中我們定義了kobe,name,age,sex這四個變量都是局部變量,那麽非常明顯就看出了它們的不同之處:
結果例如以下:
4.從它們的生命周期來分析,我們再對上面的代碼進行一下改動:
前面我們學習了類的定義,我們不難理解,定義類事實上就是在定義類中的成員.
成員包含成員變量和成員函數.
說到成員變量,我們非常自然會想到前面提到過的局部變量,那麽它們之間有什麽差別呢?
首先我們定義一個People類:
class People//定義一個People類 { String name;//姓名屬性 int age;//年齡屬性 char sex; void run()//跑的方法 { System.out.println(name+"開始跑步了."); } void information() { System.out.println("姓名:"+name+";\n性別:"+sex+";\n年齡:"+age+"."); } }
然後我們從四個方面來分析下這兩種變量的差別.
1.從它們的定義環境來分析,我們看一段代碼.
class PeopleTest { public static void main(String[] args) { People kobe = new People();//創建一個People的對象kobe String name = "jordan"; int age = 49; char sex = ‘男‘; kobe.name = "KOBE"; kobe.age = 37; kobe.sex = ‘男‘; kobe.information(); kobe.run(); } }
成員變量定義在類中,整個類中都能夠訪問.
局部變量定義在函數,語句,局部代碼塊中,僅僅在所屬區域有效.
2,從它們在內在中存放形式來分析:
聯系上一節以及4.3節的函數的內存分配兩節我們非常自然知道這兩種變量的差別在於:
成員變量存在於堆內存的對象中.
局部變量存在於棧內存的方法中.
3,從它們的默認初始化來分析,我們執行上面的代碼:
class PeopleTest { public static void main(String[] args) { People kobe = new People();//創建一個People的對象kobe String name = "jordan"; int age = 49; char sex = ‘男‘; kobe.name = "KOBE"; kobe.age = 37; kobe.sex = ‘男‘; kobe.information(); kobe.run(); System.out.println("name:"+name+";\nsex:"+sex+";\nage:"+age+"."); } }
我們再把該代碼稍做改動:
class PeopleTest { public static void main(String[] args) { People kobe = new People();//創建一個People的對象kobe String name; int age; char sex; kobe.name = "KOBE"; kobe.age = 37; kobe.sex = ‘男‘; kobe.information(); kobe.run(); System.out.println("name:"+name+";\nsex:"+sex+";\nage:"+age+"."); } }結果:
我們看出一個非常顯然的差別就是:
成員變量都有默認初始化值.
局部變量沒有默認初始化值.
所以我們在定義成員變量時,假設我們須要特定的初始值,我們就一定要顯性初始化詳細值.對於局部變量,假設我們不初始化,當操作該變量時編譯會提示未初始化的錯誤.4.從它們的生命周期來分析,我們再對上面的代碼進行一下改動:
class PeopleTest { public static void main(String[] args) { People kobe = new People();//創建一個People的對象kobe String name = "jordan"; { int age = 49; char sex = ‘男‘; System.out.println("name:"+name+";\nsex:"+sex+";\nage:"+age+".");//能夠打印出三個局部變量的值 } kobe.name = "KOBE"; kobe.age = 37; kobe.sex = ‘男‘; kobe.information(); kobe.run(); System.out.println("name:"+name+";\nsex:"+sex+";\nage:"+age+".");//報錯,找不到sex和age這兩個變量 } }結果:
而當我們把最後一句打印語句凝視之後的結果:
我們能夠看到:
成員變量隨著對象的創建而存在,隨著對象的消失而消失.
局部變量隨著所屬區域的執行而存在,隨著所屬區域的結束而釋放.
最後,我們再來看一個比較須要註意的地方,那就是成員變量和局部變量的同名情況.
我們把People類改動一下:
class People//定義一個People類 { String name;//姓名屬性 int age;//年齡屬性 char sex; void run()//跑的方法 { System.out.println(name+"開始跑步了."); } void information() { String name = "JAMES"; int age = 29; char sex = ‘女‘; System.out.println("姓名:"+name+";\n性別:"+sex+";\n年齡:"+age+"."); } }結果:
我們看到在打印出了局部變量的值,這是因為局部變量在棧的方法中,程序會把值直接賦值給局部變量,假設當在棧中找不到,則到堆內存中尋找指定的成員變量.這一點在以後的操作中一定要小心.
成員變量都有默認初始化值.
局部變量沒有默認初始化值.
[javase學習筆記]-6.4 成員變量與局部變量