首先,要了解一下这些东西的存放位置
堆区:
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
栈区:
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
方法区:
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
还有补充的一点,有这样一个步骤:
加载->链接(验证+准备+解析)->初始化(使用前的准备)->使用->卸载
一、静态内部类
为什么只有静态内部类而没有静态外部类?
答:因为Jvm的类加载器在加载类时,会判断是否有静态变量,静态方法,和静态内部类,如果存在,则将其加载到方法区(方法区中所有东西都只有一个,即不会重复),静态内部类的作用是可以在外部不需要实例化,而通过类名.内部类名直接调用,而外部静态类是没有必要的,因为static的作用时间是类加载时才被加载,而此时外部类已经在被加载,所以这种设计是没有必要的。
二、静态变量,静态方法
答:静态方法和静态变量都是在类加载的时候被载入方法区。