static可以修饰的内容如下:
● 变量
● 方法
● 代码块
● 内部类
那就有一个问题,为什么static不能修饰外部类?
我们首先看一下static的作用是什么?
先看看其他人怎么解释的:
A static method can be accessed without creating an object of the class first:
The static variable can be used to refer to the common property of all objects (which is not unique for each object), for example, the company name of employees, college name of students, etc. The static variable gets memory only once in the class area at the time of class loading.https://www.javatpoint.com/static-keyword-in-java
In the Java programming language, the keyword static means that the particular member belongs to a type itself, rather than to an instance of that type. This means we’ll create only one instance of that static member that’s shared across all instances of the class.
被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
总结一下,我认为static作用有两个
- 节省空间,修饰方法或变量或内部类时可以不经过实例化直接访问
- 静态变量是所有实例共有的。
此时插入一下最开始的问题,为什么static不能修饰外部类?
回答:没有必要,static是为了暴露出内部的内容,使外部可以直接使用,外部类本来就可以直接使用,不需要点出来。
被static修饰的变量和方法会在类初次被加载时初始化,而不是实例被创建时。
如图:
那么静态方法保存在哪里呢?
答案:方法区
方法区在1.8之前的实现是永久代,1.8之后叫元空间metaspace
另外,普通方法其实也保存在方法区。
方法区还存了啥呢?
注意,方法区是《Java虚拟机规范》的规范,永久代或者元空间是对规范的实现。
《深入理解Java虚拟机》书中对方法区(Method Area)存储内容描述如下:它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等。
此时考虑一个问题,所有方法都会被加载到方法区吗?
回答:不是,首先我们可以确定,所有的静态方法都被加载到了方法区,其次,所有被实例化了类中的方法也都加载到了方法区。