實例變量屬於類的某個特定實例,靜態變量屬於類,因為它們的作用域在整個類中都是可用的,所以也被稱為全局變量。在類中定義實例變量或靜態變量時,可以放在任何位置。但為了美觀規范,設計類時最好統一放在類中的最前面。
public class Testvariable { int a; //實例變量 static int b; //靜態變量 //不能聲明后,單獨賦值 a = 5; //error b = 5; //error }
因為不符合語法規則, 賦值語句這個操作要放在語句塊中才能執行。但可以聲明變量后直接賦值進行初始化:
int a = 5; //實例變量 static int b = 5; //靜態變量
實例變量和靜態變量
實例變量屬於類的某個特定實例,每一個對象對實例變量的操作都不會影響到其他對象的實例變量,它們之間毫無關系。 但靜態變量屬於類,為所有對象所共享,當某個對象對靜態變量修改時,其他對象會受其影響。
public class Testvariable { int a = 5; //實例變量 static int b = 10; //靜態變量 public static void main(String[] args) { Testvariable t1 = new Testvariable(); Testvariable t2 = new Testvariable(); t1.a = 6; t2.a = 7; //對象修改實例變量只會影響它本身的實例變量值 System.out.println(t1.a); // 6 System.out.println(t2.a); // 7 System.out.println(t1.b); //10 //t2對象修改靜態變量,會影響到t1對象 t2.b = 12; System.out.println(t1.b); // 12 }
這里僅介紹實例變量與靜態變量的區別,關於static的使用和對象的創建細節這里不作過多討論。
局部變量
如果一個變量不是在類中定義,而是在某個語句塊或方法中,則該變量就是局部變量。局部變量的作用范圍: 從定義該局部變量開始,直到所處的塊結束。因為局部變量的作用域特性,所以無法使用訪問權限修飾符,包括static修飾符。
相比於全局變量,局部變量沒有默認值,必須手動進行初始化賦值。局部變量的生命周期取決於所處的塊,當方法執行結束或語句塊結束,其中的局部變量就會被釋放。
在main方法中定義的變量也是局部變量,如下:
public static void main(String[] args) { //error,Illegal modifier for parameter a; only final is permitted public int a = 5; //局部變量沒被初始化,不能使用。 int a; System.out.println(a); //error //正確定義局部變量 int b = 5; }
for循環語句塊中定義的初始條件變量,也是局部變量:
int[] a = new int[5]; for(int i = 0; i <a.length; i++ ) { //... } System.out.println(i); //for循環語句塊中定義的i變量僅限於該塊中使用
注意:如果定義的局部變量和全局變量同名,則在該塊中優先使用局部變量。也可以通過this調用同名實例變量或者類名調用同名靜態變量。但定義局部變量時,最好不要和全局變量同名,避免引起混淆。
public class Testvariable { public String str = "實例變量str"; public static String staStr = "靜態變量staStr"; public static void main(String[] args) { test(); } public static void test() { String str = "局部變量str"; String staStr = "局部變量staStr"; System.out.println(str); //局部變量str System.out.println(staStr); //局部變量staStr System.out.println(new Testvariable().str); //實例變量str。靜態方法中,this與super無法使用 System.out.println(Testvariable.staStr); //靜態變量staStr } }
常量
變量表示變化的值,常量表示常久不變的值。在程序運行時,變量的值會根據不同的情況進行改變,而常量則不會被改變。
變量 :variableType name = value; 常量 :static final variableType NAME = value; 常量名建議大寫。 final可以用於修飾類、方法和變量,用於標識不可更改。
定義常量時,修飾符一般為public static final , 表明該常量是公開的,隨着類加載而加載,只分配一次內存,並且被類的所有對象共享,使用時直接類名.常量名。 因為是常量,所以無需擔心值被對象修改。若不用static修飾常量,類創建實例后,才能調用實例常量,並且每次都要為該常量重新分配內存。
public class Testvariable { public final int MIN = 15; //實例常量 public static final int MAX = 100; //靜態常量 public static void main(String[] args) { //類名.常量 System.out.println(Testvariable.MAX); //創建實例,才能調用實例常量 Testvariable t = new Testvariable(); Testvariable t2 = new Testvariable(); System.out.println(t.MIN); System.out.println(t2.MIN); } }
static final 與 final的修飾區別之分,孰優孰劣,一目了然。