A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 午夜b'Boy 中级黑马   /  2014-2-23 23:21  /  1663 人查看  /  5 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

内部类的字节码与外部类的字节码有联糸吗?即他们可以相互获取对方吗?

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

5 个回复

倒序浏览
本帖最后由 kkopopo 于 2014-2-25 09:57 编辑

先mark  楼主这个问题犀利!
  1. class Outer{
  2.     private int x = 3;
  3.     class Inner{
  4.         public void function(){
  5.             System.out.println("内部类"+x);
  6.         }
  7.     }
  8. }
  9. class Test{
  10.         public static void main(String[] args) throws Exception{
  11.                 System.out.println(Class.forName("com.itcast.day01.Outer"));
  12.         }
  13. }
复制代码

编译时期上面代码 javac Test.java  产生了3个.class
Test.class
Outer.class
Outer$Inner.class
我理解的编译时期和运行
编译:给房子打草图------房子里面有小房子(卧室)-----也需要打草图
运行: 开始按照草图盖房子----为了防止盖得房子有偏差在盖之前就编译一下(打个草图)
字节码是对象的模板,那么在编译时期,模板是要先刻画好的,验证第一段代码

  1. class Outer{
  2.     private int x = 3;
  3.     class Inner{//内部类直接访问外部类成员,包括私有
  4.         public void function(){
  5.             System.out.println("内部类"+x);
  6.         }
  7.     }
  8.     static{
  9.             Outer out = new Outer();
  10.         Inner in = new Outer().new Inner();
  11.         System.out.println(in.getClass());
  12.         System.out.println(out.getClass());
  13.     }
  14. }
  15. class Test{
  16.         public static void main(String[] args) throws Exception{
  17.                 System.out.println(Class.forName("com.itcast.day01.Outer"));
  18.                 //问题在于如何用反射得到内部类字节码?
  19.                 //System.out.println(Class.forName("com.itcast.day01.Outer.Inner"));
  20.         }
  21. }
复制代码

输出结果:
class com.itcast.day01.Outer$Inner
class com.itcast.day01.Outer
class com.itcast.day01.Outer

Class.forName()会实现类的初始化,即静态块的运行,
运行时期,没有外部类的对象,即我们的大房子,何来的小房子(厕所,厨房,卧室)
所以我用静态块实现了一下

解决楼主问题:
1.之间的关系:
我们在画大房子的草图之前能画出厨房的草图吗? 不能,只有我们把大房子的基本图画完了才能!
2,即他们可以相互获取对方吗?
楼主明白我们为啥要获取字节码吗? 为啥要他们之间相互获取?



最后2句话:
内部类在内存的哪个部分?  栈,堆,方法区,....?
鄙人完全不懂类在初始化时内存里发生了什么,望见谅!

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
kkopopo 发表于 2014-2-25 09:26
先mark  楼主这个问题犀利!
编译时期上面代码 javac Test.java  产生了3个.class
Test.class

没有内部类.class吧
只有外部类$内部类.class
回复 使用道具 举报
内部类没有字节码,或者说没有自己的字节码
javac编译之后产生两个字节码文件:
一个是外部类.class
一个是内部类$外部类.class(由此看内部类与外部类的字节码必然有联系)
内部类相当于外部类的一个属性,所以二者自然可以互相获取,但是静态非静态之间不能相互获取。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
kkopopo 发表于 2014-2-25 09:26
先mark  楼主这个问题犀利!
编译时期上面代码 javac Test.java  产生了3个.class
Test.class

哦,看错了,不好意思。。那个是Test.class
回复 使用道具 举报
你可以写一个类在其中创建一个内部类,编译看两个的字节码文件
外部的字节码是:外部类名.class
内部的字节码是:外部类名$内部类名.class
通过他们的名字构造就能看出关系,外部类单独存在了,但是内部类却是在外部类的前提下才有,也就是要使用内部类必须先创建外部类实例,好比有了外部的人,人中的内脏才有意义。
但是内部类又好比外部类的一个成员,所以权限很大,可以直接访问外部类的其他成员。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马