本帖最后由 kkopopo 于 2014-2-25 09:57 编辑
先mark 楼主这个问题犀利!- class Outer{
- private int x = 3;
- class Inner{
- public void function(){
- System.out.println("内部类"+x);
- }
- }
- }
- class Test{
- public static void main(String[] args) throws Exception{
- System.out.println(Class.forName("com.itcast.day01.Outer"));
- }
- }
复制代码
编译时期上面代码 javac Test.java 产生了3个.class
Test.class
Outer.class
Outer$Inner.class
我理解的编译时期和运行
编译:给房子打草图------房子里面有小房子(卧室)-----也需要打草图
运行: 开始按照草图盖房子----为了防止盖得房子有偏差在盖之前就编译一下(打个草图)
字节码是对象的模板,那么在编译时期,模板是要先刻画好的,验证第一段代码
- class Outer{
- private int x = 3;
- class Inner{//内部类直接访问外部类成员,包括私有
- public void function(){
- System.out.println("内部类"+x);
- }
- }
- static{
- Outer out = new Outer();
- Inner in = new Outer().new Inner();
- System.out.println(in.getClass());
- System.out.println(out.getClass());
- }
- }
- class Test{
- public static void main(String[] args) throws Exception{
- System.out.println(Class.forName("com.itcast.day01.Outer"));
- //问题在于如何用反射得到内部类字节码?
- //System.out.println(Class.forName("com.itcast.day01.Outer.Inner"));
- }
- }
复制代码
输出结果:
class com.itcast.day01.Outer$Inner
class com.itcast.day01.Outer
class com.itcast.day01.Outer
Class.forName()会实现类的初始化,即静态块的运行,
运行时期,没有外部类的对象,即我们的大房子,何来的小房子(厕所,厨房,卧室)
所以我用静态块实现了一下
解决楼主问题:
1.之间的关系:
我们在画大房子的草图之前能画出厨房的草图吗? 不能,只有我们把大房子的基本图画完了才能!
2,即他们可以相互获取对方吗?
楼主明白我们为啥要获取字节码吗? 为啥要他们之间相互获取?
最后2句话:
内部类在内存的哪个部分? 栈,堆,方法区,....?
鄙人完全不懂类在初始化时内存里发生了什么,望见谅!
|