-
static关键字
作用:- 方便在没有创建对象的时候调用方法或者对象
- 被static变量修饰的变量,代码块,方法只会在类初始化的时候加载一次
- 被static变量修饰的变量,代码块,方法在内存(运行时常量池中)中只会生成一个副本
- 使用 static final 进行 常量传播优化,在使用 static final 修饰的变量时不会进行类的初始化
public class ConstClass{
static {
System.out.println("ConstClass init!");
}
public static final String HELLOWORLD = "hello world";
}
public class NotInitialization{
public static void main(String[] args){
System.out.println(ConstClass.HELLOWORLD);
}
}
- static代码块
- static变量
-
static方法
- static方法会随着类的初始化而被装载到内存(运行时常量池中类对应的Class对象)中。所以static方法在内存中有且仅有一个内存空间。
- 因为static方法中只能存在静态成员变量,所以任意一个对象对静态成员变量的修改都会影响其他对象。
每一个被虚拟机加载类在运行时常量池中都有且仅有一个对应的Class对象
-
static类
静态内部类不依附与外部类(不能在静态内部类中使用 外部类.this)
静态内部类和普通内部类区别
1. 表面区别:普通内部类可以调用外部类的任意变量/方法,静态内部类只能调用静态变量/方法
2. 本质区别:普通内部类会维护一个外部类的this变量(也就是和当前内部类对象相关联的外部类实例),这也就是为什么实例化(new)普通内部类先实例化(new)一个外部类的原因。
而静态内部类没有维护该this变量,意味着静态内部类和外部类没有强关联关系(这也就意味着静态内部类和外部类相当于是借鸡下蛋的关系,看着属于外部类,其实本质上没有任何关系,静态内部类相当于普通类)。
这是最简单的一个普通内部类示例
public class OuterClass {
public class InnerClass{
}
}
使用javap -c进行编译
普通内部类public class OuterClass {
public static class InnerClass{
}
}
静态内部类
外部类
other
静态内部类可以实例化多个对象(内存空间不一样)
网友评论