# 静态字段
在一个`class`中定义的字段,我们称之为实例字段。实例字段的特点是,每个实例都有独立的字段,各个实例的同名字段互不影响。
还有一种字段,是用`static`修饰的字段,称为静态字段:`static field`。实例字段在每个实例中都有自己的一个独立“空间”,但是静态字段只有一个共享“空间”,所有实例都会共享该字段。
```java
class Person{
public String name;
public int age;
//定义静态字段number
public static int number;
}
```
```java
public class Main{
public static void main(String[] args){
Person ming = new Person("Xiao ming", 12);
Person hong = new Person("Xiao hong", 15);
ming.number = 88;
System.out.println(hong.number);
hong.number = 99;
System.out.println(ming.number);
}
}
class Person{
public String name;
public int age;
public static int number;
public Person(String name, int age){
this.name = name;
this.age = age;
}
}
```
虽然实例可以访问静态字段,但是它们指向的其实都是`Person class`的静态字段。所以,所有实例共享一个静态字段。因此,不推荐用`实例变量.静态字段`去访问静态字段,因为在Java程序中,实例对象并没有静态字段。在代码中,实例对象能访问静态字段只是因为编译器可以根据实例类型自动转换为`类名.静态字段`来访问静态对象。
```java
Person.number = 99;
System.out.println(Person.number);
```
# 静态方法
有静态字段,就有静态方法。用`static`修饰的方法称为静态方法。调用实例方法必须通过一个实例变量,而调用静态方法则不需要实例变量,通过类名就可以调用。静态方法类似其它编程语言的函数。
```java
public class Main{
public static void main(String[] args){
Person.setNumber(99);
System.out.println(Person.number);
}
}
class Person{
public static int number;
public static void setNumber(int value){
number = value;
}
}
```
因为静态方法属于`class`而不属于实例,因此,静态方法内部,无法访问`this`变量,也无法访问实例字段,它只能访问静态字段。通过实例变量也可以调用静态方法,但这只是编译器自动帮我们把实例改写成类名而已。静态方法经常用于工具类。`Arrays.sort(), Math.random()`等。静态方法也经常用于辅助方法。注意到Java程序的入口`main()`也是静态方法。
# 接口的静态字段
因为`interface`是一个纯抽象类,所以它不能定义实例字段。但是,`interface`是可以有静态字段的,并且静态字段必须为`final`类型。
```java
public interface Person{
public static final int MALE = 1;
public static final int FEMAL = 2;
}
```
实际上,因为`interface`的字段只能是`public static final`类型,所以我们可以把这些修饰符都去掉,上述代码可以简写
```java
public interface Person{
int MALE = 1;
int FEMALE = 2;
}
```
编译器会自动把该字段变为`public static final`类型。