Java中静态字段和静态方法
在一个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类型。