在java中有種靜態修飾符static,static只能修飾變量和方法,不能修飾類。有static修飾的變量和方法是通常叫做靜態變量和靜態方法,而沒有被修飾的變量和方法通常叫做非靜態變量和非靜態方法或實例變量和實例方法。我們常用的main方法就是靜態的,在靜態方法中是不可以使用實例變量和實例方法的,只能使用靜態變量和方法,而在實例方法中即可以使用靜態變量和靜態方法,也可以使用實例變量和方法。
要在靜態方法中使用實例變量和實例方法,就要創建一個新的對象去使用,而這個對象所對應的類要包含所要使用的實例變量和方法。
靜態的變量和方法是這個類的方法,而實例變量和方法是實例的變量和方法,所以對靜態的變量,方法的操作實際上是對這個類進行操作,而實例變量,方法不一樣,實例的改變只會是這個實例變化,而類本身是不會改變的,例:
class Test2{
static int number;
String name;
public static void a()
{
System.out.println("a方法可以運行");
}
public void b()
{
}
}
public class STATIC
{
public static void main(String[] args)
{
Test2 t1 = new Test2();
Test2 t2 = new Test2();
Test2.a();
//程序將輸出“a方法可以運行”
//Test2.b();是錯誤的
Test2.number = 2;
//Test2.name = "1";是錯誤的
System.out.println("Test2.number = " + Test2.number);
//程序輸出的結果是“Test2.number = 2”
t1.name = "小";
t2.name = "大";
System.out.println("t1.name = " + t1.name);
//顯示“t1.name = 小”
System.out.println("t2.name = " + t2.name);
//顯示“t2.name = 大”
t1.number = 3;
t2.number = 4;
System.out.println("Test2.number = " + Test2.number);
//顯示“Test2.number = 4”
System.out.println("t1.number = " + t1.number);
//顯示“t1.number = 4”
System.out.println("t2.number = " + t2.number);
//顯示“t2.number = 4”
}
}
在類Test2的對象中對實例變量name的改變是互不影響的,而對靜態變量number的改變卻是直接影響了類中變量的值。
從內存的角度出發,當類Test2一定義時,系統就爲number在堆內存中分配了一個空間,而創建了一個Test2的對象,系統就爲name 在堆內存中分配一個空間,所以所有的number都是公用一個空間的,所有的name都是使用不同的空間的。
另在static修飾的方法中是不能使用this的。