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类型。

 

posted @ 2020-03-15 22:56  明王不动心  阅读(1505)  评论(1编辑  收藏  举报