先以两个问题开篇:
1.如果一个类有多个子类,那么new多个子类对象时,父类的对象是一个还是多个?
2.每个类型有一个常量池,还是每个对象都有自己的常量池?
你可以很快地正确回答吗?了解了java虚拟机方法区的原理,这两个问题就很清晰了。
java虚拟机把内存划分为方法区、堆和线程栈。简单说方法区用来存储类型的元数据信息,一个.class文件是类被java虚拟机使用之前的表现形式,一旦这个类要被使用,java虚拟机就会对其进行装载、连接(验证、准备、解析)和初始化。而装载(这里涉及到类加载器的相关理论)后的结果就是由.class文件转变为方法区中的一段特定的数据结构。这个数据结构会存储如下信息:
类型信息
这个类型的全限定名
这个类型的直接超类的全限定名
这个类型是类类型还是接口类型
这个类型的访问修饰符
任何直接超接口的全限定名的有序列表
字段信息
字段名
字段类型
字段的修饰符
方法信息
方法名
方法返回类型
方法参数的数量和类型(按照顺序)
方法的修饰符
除了常量以外的所有类