成員變量與局部變量
成員變量:在類體中定義的變量為成員變量,作用范圍(scope)是整個類,只要在這個類中都可以訪問到它。
局部變量:在一個方法或方法中的代碼塊(code block)中定義的變量。局部變量是在方法或代碼塊被執行的時候被創建,在方法或代碼塊結束時被銷毀。局部變量在進行取值操作前必須被初始化或賦值,否則出現編譯錯誤。
如下程序綜合了變量的應用:
package com.liaojianya.chapter1; /** * This program demonstrates the difference between local variables and member variables * @author LIAO JIANYA * */ public class TestLocalVar4_5 { public static void main(String[] args) { int outer = 1; { int inner = 2; System.out.println("inner = " + inner); System.out.println("outer = " + outer); } // System.out.println("inner = " + inner); int inner = 3; System.out.println("inner = " + inner); System.out.println("outer = " + outer); System.out.println("In class, the member a = " + a); } static int a = 123; }
運行結果:
inner = 2 outer = 1 inner = 3 outer = 1 In class, the member a = 123
總結:塊(block)作用范圍除了用for(while)循環或方法體的左右花括號{}來界定外,還可以直接用花括號{}來定義塊。
1)在上述程序中,塊內定義inner為2,所以第一次打印出來的inner = 2.出了塊后,若取消注釋符號//,會出現編譯錯誤,原因是這個語句不認識名叫“inner”的變量,因為前一個inner是定義在塊內,出了塊,塊內inner將對后面的語句無效。之后,又重新定義一個inner變量並賦值為3,所以之后打印出來為inner = 3。
2)從程序結果可以看出,outer = 1一直適用,因為是定義在塊外的變量並且已經被賦值為1,塊內快外都是可以調用.
3)對於主方法塊外的static int a = 123;是屬於成員變量,必須聲明為static的,否則main方法無法識別,因為是靜態方法只能訪問靜態域,無法訪問非靜態域,雖然是在最后聲明的,但是能夠被訪問,因為它的作用域是整個類。
規則:一般而言,所有變量都遵循“先聲明,后使用”的原則,只有先聲明了,變量才能在內存中存在,之后才能被其他方法去訪問。但是,存在於類中成員變量(不在任何的方法中),其作用域是整個類的范圍,在編譯器的內部協調下,變量只要作為類中的數據成員被聲明,就可以在類內部的任何地方使用,無需滿足“先聲明,后使用”的原則。