一、静态变量
静态变量,被static修饰的变量,也称为类变量。静态变量不属于某个实例,而是属于类。只要程序加载了类,不需要创建任何实例,静态变量便可以被分配空间,且在内存中只分配一个地址。而实例变量需要在创建了实例对象后才会被分配内存,且创建一个实例对象便会分配不同的内存用来存放不同的实例变量。
在该程序中,不论创建多少个实例对象,instanceVar始终为1,而staticVar在每创建一个实例对象时就会加1。
静态变量位于方法区,被类的所有实例共享。(这点需要注意!在LeetCode等提交代码时,若使用了静态变量一般会报错,因为不同测试用例共享了静态变量)
在分配内存空间的顺序上,先分配静态对象的空间,继而分配实例对象的空间。
那么静态对象有什么好处呢?
1、全局唯一性。可以被全部实例对象使用并保持值的唯一性。
2、使用便利。直接“类名.静态对象名”便可对其进行操作,无需get、set等方法。
PS:final定义常量,static加final修饰组合可以定义全局常量,关于final的总结由于时间原因推迟到以后。
二、静态方法
静态方法可以被直接使用而不需要建立任何实例对象(注意,跟类是否有static修饰无关)
但是,静态方法的使用也需注意一些事项。
1.静态方法仅能调用其他的静态方法。
2.静态方法想要直接访问本方法外的变量时,该变量必须为静态变量。
3.静态方法不能以任何方式饮用this或super。
三、静态块
静态块仅在该类被加载时执行一次(注意,仅这一次)。静态块执行的级别是比较高的,要高于构造函数。
如:
public class Test {
public Test() {// 构造方法
System.out.println("我是构造方法”);
}
static {
System.out.println("我是静态块“);
}
}
之后我们创建一个Test类的时候
new Test(); //输出为"我是构造方法”、"我是静态块“
new Test(); //输出为"我是构造方法”
这说明,静态块先于构造函数执行,且只会被执行一次。
四、静态内部类
静态内部类指在一个类内部又定义了一个由static修饰的类。为什么要定义内部类,因为其于外部类有一定的关系,并且往往只有外部类会调用该内部类,因为没有必要单独用一个java文件存放该类。
静态内部类要求使用静态对象和静态方法,静态内部类随着外部类的加载而产生(不是随着实例对象的建立),可以使用类名加静态成员名获得,也就是说它可以通过外部类名+内部类名访问。如:
public class Build {
public static class VERSION {
public static final String RELEASE = getString("ro.build.version.release");
}
}
在外部可以直接通过Build.VERSION.RELEASE来访问。