static可以修饰的内容如下:
● 变量
● 方法
● 代码块
● 内部类
那就有一个问题,为什么static不能修饰外部类?
我们首先看一下static的作用是什么?
先看看其他人怎么解释的:
A static method can be accessed without creating an object of the class first:
被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
总结一下,我认为static作用有两个
- 节省空间,修饰方法或变量或内部类时可以不经过实例化直接访问
- 静态变量是所有实例共有的。
此时插入一下最开始的问题,为什么static不能修饰外部类?
回答:没有必要,static是为了暴露出内部的内容,使外部可以直接使用,外部类本来就可以直接使用,不需要点出来。
被static修饰的变量和方法会在类初次被加载时初始化,而不是实例被创建时。
那么静态方法保存在哪里呢?
答案:方法区
方法区在1.8之前的实现是永久代,1.8之后叫元空间metaspace
另外,普通方法其实也保存在方法区。
方法区还存了啥呢?
注意,方法区是《Java虚拟机规范》的规范,永久代或者元空间是对规范的实现。
《深入理解Java虚拟机》书中对方法区(Method Area)存储内容描述如下:它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等。
此时考虑一个问题,所有方法都会被加载到方法区吗?
回答:不是,首先我们可以确定,所有的静态方法都被加载到了方法区,其次,所有被实例化了类中的方法也都加载到了方法区。