java中静态字段和静态方法学习
一、静态字段
在一个class中定义的字段,称为实例字段。实例字段的特点是:每个实例都有独立的字段,各个实例的同名字段互不影响。还有一种字段,用static修饰,这种字段就叫做静态字段。
实例字段在每个实例中都有自己独立的空间,但是静态字段只有一个共享空间,所有实例都会共享此字段,举个例子来描述一下:
class Person { public String name; public int age; // 定义静态字段number: public static int number; }
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; } }
这里最后执行结果是88、99,因为这里的number是静态字段,它既不属于实例ming,也不属于hong,而是二者共有的数据,可以多次进行更改,并没有什么大问题。
虽然实例可以访问静态字段,但是它们指向的其实都是Person class
的静态字段。所以,所有实例共享一个静态字段。
因此,不推荐用实例变量.静态字段
去访问静态字段,因为在Java程序中,实例对象并没有静态字段。在代码中,实例对象能访问静态字段只是因为编译器可以根据实例类型自动转换为类名.静态字段
来访问静态对象。
所以,更好的访问静态字段的方法可以是:
Person.number = 99;
System.out.println(Person.number);
二、静态方法
有静态字段,就有静态方法。用static
修饰的方法称为静态方法。
调用实例方法必须通过一个实例变量,而调用静态方法则不需要实例变量,通过类名就可以调用。静态方法类似其它编程语言的函数。例如:
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
变量,也无法访问实例字段,它只能访问静态字段。
通过实例变量也可以调用静态方法,但这只是编译器自动帮我们把实例改写成类名而已。
通常情况下,通过实例变量访问静态字段和静态方法,会得到一个编译警告。
三、接口的静态字段
因为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 { // 编译器会自动加上public statc final: int MALE = 1; int FEMALE = 2; }
编译器会自动把该字段变为public static final
类型。
到这里就学完静态字段和静态方法了。
到此,结束。