java静态变量和⾮静态变量_Java学习帖-静态字段和静态⽅法
来源 廖雪峰
静态字段和静态⽅法
在⼀个class中定义的字段,我们称之为实例字段。实例字段的特点是,每个实例都有独⽴的字段,各个实例的同名字段互不影响。学习java的学习方法
还有⼀种字段,是⽤static修饰的字段,称为静态字段:static field。
实例字段在每个实例中都有⾃⼰的⼀个独⽴“空间”,但是静态字段只有⼀个共享“空间”,所有实例都会共享该字段。举个例⼦:
class Person {    public String name;    public int age;    // 定义静态字段number:    public static int number;}
我们来看看下⾯的代码:
对于静态字段,⽆论修改哪个实例的静态字段,效果都是⼀样的:所有实例的静态字段都被修改了,原因是静态字段并不属于实例:┌──────────────────┐ming ──>│Person instance  │├──────────────────┤│name = "Xiao Ming"││age = 12          ││number ─────虽然实例可以访问静态字段,但是它们指向的其实都是Person class的静态字段。所以,所有实例共享⼀个静态字段。
因此,不推荐⽤实例变量.静态字段去访问静态字段,因为在Java程序中,实例对象并没有静态字段。在代码中,实例对象能访问静态字段
只是因为编译器可以根据实例类型⾃动转换为类名.静态字段来访问静态对象。
推荐⽤类名来访问静态字段。可以把静态字段理解为描述class本⾝的字段(⾮实例字段)。对于上⾯的代码,更好的写法是:
Person.number = 99;System.out.println(Person.number);
静态⽅法
有静态字段,就有静态⽅法。⽤static修饰的⽅法称为静态⽅法。
调⽤实例⽅法必须通过⼀个实例变量,⽽调⽤静态⽅法则不需要实例变量,通过类名就可以调⽤。静态⽅法类似其它编程语⾔的函数。例
如:
因为静态⽅法属于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 {    // 编译器会⾃动加上public statc final:    int MALE = 1;    int FEMALE = 2;}
编译器会⾃动把该字段变为public static final类型。
练习
给Person类增加⼀个静态字段count和静态⽅法getCount,统计实例创建的个数。
下载练习:静态字段和静态⽅法 (推荐使⽤IDE练习插件快速下载)
⼩结
静态字段属于所有实例“共享”的字段,实际上是属于class的字段;
调⽤静态⽅法不需要实例,⽆法访问this,但可以访问静态字段和其他静态⽅法;
静态⽅法常⽤于⼯具类和辅助⽅法。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。