成員變量和局部變量
根據定義變量位置的不同,可以將變量分為成員變量和局部變量
成員變量是在類范圍內定義的變量
局部變量是在一個方法內定義的變量
成員變量可以分為:
實例屬性 (不用static修飾)
隨着實例屬性的存在而存在
類屬性 (static修飾)
隨着類的存在而存在
成員變量無需顯式初始化,系統會自動對其進行默認初始化
局部變量可分為:
形參(形式參數)
在整個方法內有效
方法局部變量 (方法內定義)
從定義這個變量開始到方法結束這一段時間內有效
代碼塊局部變量 (代碼塊內定義)
從定義這個變量開始到代碼塊結束這一段時間內有效
局部變量除了形參外,都必須顯示初始化,也就是要指定一個初始值,否則不能訪問。
示例代碼:
package object; /** * 成員變量和局部變量 * * */ public class VariableTest { //成員變量 public static String staticname = "類屬性"; public String nostaticname = "實例屬性"; //沒有初始化的成員變量 public static String staticname1; public String nostaticname1; //定義一個方法 public void info(){ //在方法中定義一個局部變量i //int i; //直接輸出是輸出不出來的,因為沒有初始化 //System.out.println(i); //定義一個局部變量i並初始化 int i = 10; //輸出i System.out.println(i); } //定義了一個靜態的方法 public static void infos(){ int i = 20; System.out.println(i); } public static void main(String[] args) { /*第一問:類屬性和實例屬性的范圍一樣嗎?*/ //在沒創建實例之前 可以調用類屬性,但不能調用實例屬性 System.out.println(VariableTest.staticname);//結果:類屬性 //實例化對象之后,就可以調用實例屬性了 VariableTest vt = new VariableTest(); System.out.println(vt.nostaticname);//結果:實例屬性 /*--- 結論:在成員變量中,類屬性的范圍比實例屬性大一點 ---*/ System.out.println("----------"); /*第二問:成員變量需要顯性初始化嗎?*/ //直接調用沒有初始化的類屬性 System.out.println(VariableTest.staticname1);//結果:null //用實例化對象調用沒有初始化的實例屬性 System.out.println(vt.nostaticname1);//結果:null /*--- 結論:成員變量會自動隱性初始化,賦給變量一個默認值 ---*/ System.out.println("----------"); /*第三問:如果用實例化后的對象去調用類屬性會怎么樣?*/ //vt.staticname; //這樣會報錯 //Syntax error, insert "VariableDeclarators" to complete LocalVariableDeclaration //翻譯:語法錯誤,插入“變量聲明符”來完成局部變量聲明 /*為什么會報錯。一開始我以為是因為eclipse出錯了 *后來我直接用文本文檔重寫了一個test *編譯文件后,報不是語句的錯,然后我又試了一下 *VariableTest.staticname *也是報錯,說明這種寫法是不正確的,具體為什么有待研究*/ vt.staticname = "改變了的類屬性"; //如果同時給類屬性賦值,就不會報錯...有警告 //The static field Variable Test.static name should be accessed in a static way //翻譯:靜態字段變量測試。靜態的名字應該在一個靜態方法訪問 System.out.println(vt.staticname);//結果:改變了的類屬性 //這樣就不會報錯,但是會有警告,同上↑ /*結論:用實例化后的對象調用類屬性,格式正確的情況下,是可以調用的,但有警告 *通過對象調用類屬性,同樣可以改變類屬性的值*/ System.out.println("----------"); //定義在方法中的局部變量 /*第四問:定義在方法中的局部變量,出了方法還能訪問嗎?*/ //調用方法 vt.info();//結果:10 //現在還能用info中的i嗎? //System.out.println(i); //報錯:i cannot be resolved to a variable //翻譯:i 不能轉換成一個變量 /*結論:定義在方法中的局部變量,出了方法就不能被訪問了*/ System.out.println("----------"); //定義在代碼塊中的局部變量 /*第五問:定義在代碼塊中的局部變量,出了代碼塊還能訪問嗎?*/ { int j = 11; System.out.println(j);//結果:11 } //出了代碼塊 //System.out.println(j); //同樣報錯,內容與上面的一樣 /*定義在代碼塊中的局部變量,出了代碼塊就不能訪問了*/ System.out.println("----------"); //后續:一個靜態方法 infos();//結果:20 //這樣依然報錯 //System.out.println(i); } }
java允許局部變量和成員變量重名,局部變量會覆蓋成員變量的值
代碼示例:
package object; /** * 局部變量覆蓋成員變量 * */ public class VariableCover { /*當實例變量與方法中的局部變量同名時, *局部變量的值會覆蓋實例變量*/ //定義實例變量 public String city = "合肥"; private static String citys = "滁州"; //定義一個方法 public void function(){ String city = "蚌埠"; //輸出 //方法中的同名局部變量會覆蓋實例變量 System.out.println(city);//結果:蚌埠 //要想調用實例變量,可以用this System.out.println(this.city);//結果:合肥 } public static void main(String[] args) { String citys = "南京"; //方法中的同名局部變量會覆蓋實例變量 System.out.println(citys);//結果:南京 //可以通過類名調用被覆蓋的類屬性 System.out.println(VariableCover.citys);//結果:滁州 String city = "上海"; System.out.println(city);//結果:上海 //這樣也可以 System.out.println(new VariableCover().city);//結果:合肥 new VariableCover().function(); } }
/* 文章是我從我的CSDN博客里考過來的,因為那邊用的不習慣,比較亂,沒有這邊純粹...雖然有些功能是挺好的...全轉過來之后,那邊就廢棄了.... */