要想區分這哥倆,首先,我們得知道它們分別是什么。先從成員變量下刀。
成員變量
我們來研究一個事物:
屬性:外在特征;例如人的身高,體重
行為:能夠做什么;例如人有說話,打球等行為。
而在Java語言中,最基本的單位是類,類就是用來體現事物的。
用類class來描述事物也是如此:
屬性:對應類中的成員變量
行為:對應類中的成員函數
定義類其實就是在定義類中的成員(成員變量和成員函數)
拓展:類是一個抽象的概念,而對象就是類的具體的存在,體現。例如:生活中的汽車,可以看做一個類,我們稱之為汽車類,每一臺車都有顏色和輪胎數(可以定義為屬性,即成員變量),每一臺車都可以跑(即車的行為,對應類總的成員函數),我們把汽車實例化一下,即會產生一個對象,比如奔馳、寶馬(BMW)。
Demo1:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public class Car { private String color; // 定義汽車顏色,全局變量 private int numLuntai; // 定義汽車輪胎數,全局變量 public Car(String color, int numLuntai){ super (); this .color = color; this .numLuntai = numLuntai; } public void run() { System.out.println( this .numLuntai+ "個輪子的" + this .color + "轎車在馬路上行駛著" ); } } |
1
2
3
4
5
6
|
public class ClassTest { public static void main(String[] args){ Car bmw = new Car( "黑色" , 4 ); // 創建一個轎車對象,名字為bmw bmw.run(); } } |
運行結果:
4個輪子的黑色轎車在馬路上行駛著
其中color和numLuntai就稱為Car 類的成員變量,這個屬性能夠用來描述一個類的屬性,否則,它就應該定義為局部變量。
例如一個for循環中的i即是局部變量。
for(int i = 0; i < args.length; i++) {
......
}
又例如寫在成員方法中變量是局部變量。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
publicclass Car { private String color; // 定義汽車顏色,全局變量 private int numLuntai; // 定義汽車輪胎數,全局變量 public Car(String color, int numLuntai){ super (); this .color = color; this .numLuntai = numLuntai; } public void run() { String carName=”寶馬牌”; //這個就是局部變量 System.out.println( this .numLuntai+ "個輪子的" + this .color + carName+ "轎車在馬路上行駛著" ); } } publicclass ClassTest { public static void main(String[] args){ Car bmw = new Car( "黑色" , 4 ); // 創建一個轎車對象,名字為bmw bmw.run(); } } |
結果:
4個輪子的黑色寶馬牌轎車在馬路上行駛著
成員變量和局部變量的區別
成員變量:
①成員變量定義在類中,在整個類中都可以被訪問。
②成員變量隨著對象的建立而建立,隨著對象的消失而消失,存在于對象所在的堆內存中。
③成員變量有默認初始化值。
局部變量:
①局部變量只定義在局部范圍內,如:函數內,語句內等,只在所屬的區域有效。
②局部變量存在于棧內存中,作用的范圍結束,變量空間會自動釋放。
③局部變量沒有默認初始化值
在使用變量時需要遵循的原則為:就近原則
首先在局部范圍找,有就使用;接著在成員位置找。
看到這里可能有點懵,下面給大家整理個示例,仔細想想其實特別簡單。
先來看一個簡單的代碼。
首先我定義了一個Person類。
1
2
3
4
5
6
7
8
9
10
11
|
public class Person { private int age= 1000 ; //定義成員變量,年齡為1000 public void setAge( int age) { age=age; System.out.println( "方法內的年齡" +age); } public void sayHello() { System.out.println( "我的年齡是" +age+ "." ); } } |
然后在主函數里面創建對象并輸出。
1
2
3
|
Person p= new Person(); p.setAge( 20 ); p.sayHello(); |
輸出結果是什么?并不是我們想象的我的年齡是20,而是下面這樣:
1
2
|
//方法內的年齡20 //我的年齡是1000. |
想一下其實就很容易理解。
一句話,如果不同名,那么方法內的變量名代表成員變量;如果同名,那么方法內的變量名就只表示局部變量了,和成員變量一毛錢關系都沒有了。
所以,首先當我們創建了一個Person對象p,在創建對象的時候就已經完成了成員變量的初始化了。成員變量age的初始值是1000。
當我們p.setAge(20)的時候,其實這個20只在setAge這個方法內起作用,所以輸出了方法內年齡20,執行完這句話后,20就被銷毀了。
然后執行sayHello,它里面的age代表的是成員變量的值,所以依舊是1000。
到這里如果還是不能理解,可以自己寫代碼看輸出結果體會下。
那么,當同名的時候,我們就是要讓這個變量名表示成員變量,有沒有辦法呢?
那就要說到this關鍵字了。我們把Person類改成這樣:
1
2
3
4
5
6
7
8
9
10
11
|
public class Person { private int age= 1000 ; public void setAge( int age) { this .age=age; System.out.println( "方法內的年齡" +age); } public void sayHello() { System.out.println( "我的年齡是" +age+ "." ); } } |
再運行代碼,發現代碼運行結果變成了下面這樣:
1
2
|
//方法內的年齡20 //我的年齡是20. |
this表示的是當前對象。
this.age在這里具體表示p對象的age(即p對象的成員變量age)的值是20。
盡管兩者的本質都是變量,可是使用時卻有相當大的區別,稍不留神就可能陷入陷阱。且先記住:在一個類中,如果一個變量能夠用來描述一個類的屬性,那就定義為成員變量,否則,它就應該定義為局部變量。不能理解的話就多寫寫代碼就能理解了。