前面我們學習了類的定義,我們不難理解,定義類其實就是在定義類中的成員.
成員包括成員變量和成員函數.
說到成員變量,我們很自然會想到前面提到過的局部變量,那么它們之間有什么區別呢?
首先我們定義一個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();
}
}
~~~
我們可以看到People類中我們定義了name,age,sex這三個變量就是成員變量;而在main方法中我們定義了kobe,name,age,sex這四個變量都是局部變量,那么很明顯就看出了它們的不同之處:
成員變量定義在類中,整個類中都可以訪問.
局部變量定義在函數,語句,局部代碼塊中,只在所屬區域有效.
**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+".");
}
}
~~~
結果:

我們看到在打印出了局部變量的值,這是由于局部變量在棧的方法中,程序會把值直接賦值給局部變量,如果當在棧中找不到,則到堆內存中尋找指定的成員變量.這一點在以后的操作中一定要小心.
成員變量都有默認初始化值.
局部變量沒有默認初始化值.
- 前言
- 1.1 基本常識
- 1.2 Java語言概述
- 1.3 Java語言的環境搭建
- 1.4 Java程序開發之初體驗--Hello World
- 2.1 關鍵字
- 2.2 標識符
- 2.3 注釋
- 2.4 常量
- 2.5 進制掃盲
- 2.6 變量和數據類型(1)
- 2.7 變量和數據類型(2)
- 2.8 運算符
- 3.1 if語句
- 3.2 switch語句
- 3.3 while和do-while語句
- 3.4 for語句
- 3.5 for循環的嵌套
- 3.6 break語句與continue語句
- 4.1 函數的定義
- 4.2 定義函數的兩個明確
- 4.3 函數的內存加載過程
- 4.4 函數的重載
- 5.1 數組的定義
- 5.2 數組的內存分配及特點
- 5.3 數組操作中常見問題
- 5.4 數組常用操作(1)
- 5.5 數組常用操作(2)
- 5.6 二維數組
- 6.1 面向對象的概述
- 6.2 類與對象的關系
- 6.3 對象的內存體現
- 6.4 成員變量與局部變量
- 6.5 類類型參數與匿名對象
- 6.6 基本數據類型參數與引用數據類型參數的傳遞過程
- 6.7 封裝
- 7.1 構造函數概述與默認構造函數
- 7.2 構造函數與一般函數的區別
- 7.3 構造函數的重載
- 7.4 構造函數的內存加載
- 7.5 構造函數需要注意的幾個細節
- 7.6 this關鍵字的原理
- 7.7 this關鍵字的細節與應用
- 8.1 static關鍵字之特點
- 8.2 成員變量與靜態變量的區別
- 8.3 static關鍵字使用的注意細節
- 8.4 main函數的解析與細節
- 8.5 static關鍵字的使用場景
- 8.6 靜態的內存加載
- 8.7 靜態代碼塊
- 8.8 構造代碼塊
- 9.1 繼承
- 9.2 單繼承與多重繼承
- 9.3 子父類中成員變量特征體現