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 { ... } 静态方法(){ ... } 属性; { ... } 构造方法(){ } 方法(){ } }