Java中的變量只有兩種:成員變量和局部變量。
和C++不同,沒有全局變量了。
成員變量,field,我習慣稱之為**”屬性“**(但這些年,因為attribute更適合被叫做屬性,所以漸漸不這么叫了)。
局部變量是在方法中定義的變量。
成員變量
和成員方法類似,成員變量也有兩種:
- 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默認值是0// 實例化一個Personvar p = new Person();// 通過引用變量p來訪問這個實例System.out.println(p.name, p.eyeNum); // p.name默認值是null}
}
成員變量不需要顯式初始化,系統會默認在類的準備階段或者在實例化的時候進行默認初始化。默認初始化規則和動態初始化數組元素是一樣的。
局部變量
局部變量有三種定義形式(在三個不同的地方被定義):
- 形參:定義方法簽名時定義的變量,作用域是整個方法的生命期;
- 方法局部變量:方法體內部,作用域是從定義的地方生效,方法結束時失效;
- 代碼塊局部變量:在代碼塊內部定義的局部變量,作用域從定義該變量的地方生效,到該代碼塊結束時失效。
局部變量除形參外,必須顯式初始化,否則不能訪問。
作用域
- 一個類中不能定義兩個同名的成員變量,即便修飾符不同也不行;
- Java允許局部變量和成員變量同名。且方法中的局部變量會覆蓋成員變量。如果需要調用被覆蓋的成員變量,需使用
this
指針(實例變量)或類名.類變量
(類變量)
道理是這么個道理,但是真正編程的時候還是別這樣了,徒增煩惱。
public class VariableOverrideTest
{private String name = "王五";private static double price = 78.0;public static void main(String[] args){var price = 65; // 方法中的局部變量覆蓋成員變量System.out.println(price); // 65System.out.println(VariableOverrideTest.price); // 78.0}public void info(){var name = "孫悟空"; // 局部變量覆蓋成員變量System.out.println(name); // 孫悟空System.out.println(this.name); // 王五}
}