在一個class中定義的字段,我們稱之為實例字段。
實例字段的特點是,每個實例都有獨立的字段,各個實例的同名字段互不影響。
還有一種字段,使用static修飾的字段,稱為靜態字段:static field
實例字段在每個實例中都有自己的一個獨立“空間”,但是靜態字段只有一個共享“空間”,所有實例會共享該字段。
package com.imooc.objectoriented; class Person { public String name; public int age; public static int number; public Person(String name,int age) { this.name = name; this.age = age; } } public class ObjectMethod2 { public static void main(String[] args) { Person ming = new Person("ming",18); Person mao = new Person("mao",26); ming.number = 88; System.out.println(mao.number); //應改是默認值 mao.number = 99; System.out.println(ming.number); } }
對於靜態字段,無論修改哪個實例的靜態字段,效果都是一樣。
所有實例的靜態字段都被修改了,原因是:靜態字段並不屬於實例。
雖然實例可以訪問靜態字段,但是它們指向的其實都是Person class字段。
所以,所有實例共享一個靜態字段。
可用通過 實例變量.靜態字段 去訪問靜態字段。
在Java程序中,實例對象並沒有靜態字段。
推薦使用 類命.靜態字段。
有靜態字段,就有靜態方法。用static修飾的方法稱為靜態方法。
調用實例方法必須通過一個實例變量,而調用靜態方法則不需要實例變量,通過類命就可以調用。
靜態方法類似其他編程語言的函數。
package com.imooc.objectoriented; class Person { public static String name; public static void setName(String na) { name = na; //無法調用this,也無法訪問實例字段,只能訪問靜態字段。 } } public class ObjectMethod2 { public static void main(String[] args) { Person.setName("ming"); //不需要實例化對象,可以直接調用 System.out.println(Person.name); } }
因為靜態方法屬於class而不屬於實例,因此,靜態方法內部,無法訪問this變量,
也無法訪問實例字段,它只能訪問靜態字段。
通過實例變量也可以調用靜態方法,但這只是編譯器自動幫我們把實例改成類命而已。
通常情況下,通過實例變量訪問靜態字段和靜態方法,會得到一個編譯警告。
靜態方法經常用於工具類。例如:
Arrays.sort()
Math.random()
態方法也經常用於輔助方法。注意到Java程序的入口main()也是靜態方法。
接口的靜態字段
因為interface是一個純抽象類,所以它不能定義實例字段。
但是,interface是可以有靜態字段的,並且靜態字段必須為final類型。
public interface Person { public static final int MALE = 1; public static final int FEMALE = 2; }
實際上,因為interface的字段只能是public static final類型,
所以我們可以把這些修飾符都去掉,上述代碼可以簡寫為:
public interface Person { int MALE = 1; int FEMALE = 2; }
編譯器自動把字段變為public static final類型。