前言
在Java代码中,static使用的是比较多的一个关键字,今天就来总结一下static的用法。首先写一段囊括static用法的代码:
public class Outer {
private int age;
// 静态变量
private static String name;
// 静态代码块
static {
name = "outer";
}
// 静态方法
public static void say() {
System.out.println("hello world");
}
// 静态内部类
static class Inner {
private static String name = "inner";
private int age = 10;
}
}
当一个类被主动引用时,就会引起类的加载过程,首先会在方法区生成运行时结构(包括static变量和static方法),并在堆中生成一个唯一的Class对象作为整个类的入口,然后再执行静态代码块和初始化静态变量,静态方法,并分配内存地址。
最后调用类构造器,在内存中初始化非static变量(成员变量)和非static方法。所以说在static方法中不能使用no-static变量和方法,就是因为static方法分配内存的时候no-static变量还没有建立,找不到对应的引用。
什么时候会触发主动引用?说几个比较常见的:
static修饰的变量叫做类变量,是共享变量,属于整个类,通过类名.属性名即可调用,不需要持有此类的实例对象(new)即可使用此属性。未被static修饰的变量叫做成员变量,属于每个对象私有的。
只在类的加载过程中调用,因为一个类只加载一次,所以static代码块也只会执行一次,会在类的构造器前执行。常用来初始化链接、加载配置文件和给static变量赋值。
static修饰的方法叫做类方法,通过类名.方法名即可调用,不需要持有此类的实例对象即可使用此方法。
静态内部类就是在一个用static修饰的内部类,而内部类就是定义在另一个类中的类。静态内部类有以下特点;
public class Outer{
public static void main(String[] args) {
System.out.println(Inner.name);
}
}
4.在不相关类中可以直接创建静态内部类的对象
public class Test {
public static void main(String[] args) {
// 第一种方法
Outer.Inner inner = new Outer.Inner();
// 第二种方法
import com.Outer.Inner;
Inner inner1 = new Inner();
}
5. 静态内部类实际上和外部类联系很少,也就是命名空间上的联系,外部类相当于静态内部类的包,即package目录
非static的变量/方法进不去static变量/方法的圈子,因为非static在static变量/方法声明后才被声明,有一种“君生我未生,我生君已老”的感觉在里面。