Static 修饰符

静态资源

什么是

属性 和 方法 可以被标记为 static。

代表 不需要对象 依附于类

有没有对象都无所谓,有类 就有静态资源

名词

静态 / 非静态

案例

1 2 3
public class Cla { public static int a = 3;}
1 2 3 4 5
public class Dla { psvm { Cla.a = 4; }}

静态属性的共享特性

生命周期

第一次访问类的静态成员 之前 或者 第一次创建对象 之前

开辟空间, 之后再也不死

唯一性

一个类 不管有多少个对象 都只为一个静态属性 开一个数据格

相比而言, 一个非静态属性, 会为每个对象开数据格

全局性

因为唯一,所以全局

与 public 组合使用 表达全局属性

public 哪都能访问

static 一个类就一个

1 2 3 4 5
public class Driver { public void run() { Board.size = 15; }}
1 2 3 4 5
public class Board { public void test() { System.out.println(Board.size); }}

共享范围控制

共享范围 受访问控制修饰符 约束

public static 全局共享

private static 类内共享

类内共享心态

所有对象共用的

访问 静态资源 规则

正常 访问 静态资源

类名引导

1 2 3 4 5
public class Driver { psvm () { Cla.a = 2; }}

对象变量 访问 静态资源

对象变量引导

不好但合法

1 2 3 4 5 6
public class Driver { psvm () { Cla c = new Cla(); c.a = 10; }}

内部 this 访问 静态资源

在 内部 this 对象变量引导

不好但合法

1 2 3 4 5 6
public class Cla { public static int a = 3; public void f() { this.a = 2; }}

内部 省略 访问 静态资源

等效于 类名 引导

1 2 3 4 5 6
public class Cla { public static int a = 3; public void f() { a = 2; }}

冲突

静态属性不能跟非静态属性冲突

静态函数 内 访问其它资源的规则

static 方法内 不能使用 this

无法在 static 方法内 访问 内部的 非 static 资源

1 2 3 4 5 6 7 8!9!10!11 12 13 14 15
public class Cla { public int instanceVar = 1; public static int staticVar = 1; public void instanceMethod() { a = 2; } public static void staticMethod() { instanceVar = 1; this.instanceVar = 1; Cla.instanceVar = 1; staticVar = 1; this.staticVar = 1; Cla.staticVar = 1; }}

但可以 在 static 方法内 访问 有对象的 任何资源

1 2 3 4 5 6 7 8 9 10 11!12 13 14
public class Cla { public int instanceVar = 1; public static int staticVar = 1; public void instanceMethod() { a = 2; } public static void staticMethod() { Cla a = new Cla(); a.instanceVar = 1; a.staticVar = 1; Cla.instanceVar = 1; Cla.staticVar = 1; }}

静态初始化块Static Initialization Blocks

案例

属性可以直接赋值

1 2 3
public class Cla { private int num = 10;}

复杂时,可以转移到构造方法里

1 2 3 4 5 6 7 8 9 10
public class Cla { private LinkedList<Integer> nums; public Cla() { nums = new LinkedList<Integer>(); for (int i = 0; i < 10; i++ ) { nums.add(i); } }}

静态属性初始化

1 2 3 4 5 6 7 8 9 10
public class Cla { private static LinkedList<Integer> nums; static { nums = new LinkedList<Integer>(); for (int i = 0; i < 10; i++ ) { nums.add(i); } }}

静态属性开辟空间之后,会被调用一次

之后每次创建对象都不会调用这块的代码

初始化块

构造方法调用之前,会被调用

1 2 3 4 5 6 7 8 9 10 11 12
public class Int{ private int value; { ... } public Int(){ ... } public Int(int value) { ... }}

类的完整结构

public class 类名 extends 父类 implements 接口列表 {

    静态属性;

    static {
        ...
    }

    静态方法(){
        ...
    }

    属性;

    {
        ...
    }

    构造方法(){

    }

    方法(){

    }
}   

ZZAX 微信公众

文档一更新,立刻告诉你