黑马程序员技术交流社区
标题:
内部类应该也有字节码吧?
[打印本页]
作者:
午夜b'Boy
时间:
2014-2-23 23:21
标题:
内部类应该也有字节码吧?
内部类的字节码与外部类的字节码有联糸吗?即他们可以相互获取对方吗?
作者:
kkopopo
时间:
2014-2-25 09:26
本帖最后由 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句话:
内部类在内存的哪个部分? 栈,堆,方法区,....?
鄙人完全不懂类在初始化时内存里发生了什么,望见谅!
作者:
乔青山
时间:
2014-2-25 10:30
kkopopo 发表于 2014-2-25 09:26
先mark 楼主这个问题犀利!
编译时期上面代码 javac Test.java 产生了3个.class
Test.class
没有内部类.class吧
只有外部类$内部类.class
作者:
乔青山
时间:
2014-2-25 10:35
内部类没有字节码,或者说没有自己的字节码
javac编译之后产生两个字节码文件:
一个是外部类.class
一个是内部类$外部类.class(由此看内部类与外部类的字节码必然有联系)
内部类相当于外部类的一个属性,所以二者自然可以互相获取,但是静态非静态之间不能相互获取。
作者:
乔青山
时间:
2014-2-25 10:36
kkopopo 发表于 2014-2-25 09:26
先mark 楼主这个问题犀利!
编译时期上面代码 javac Test.java 产生了3个.class
Test.class
哦,看错了,不好意思。。那个是Test.class
作者:
薛旻
时间:
2014-2-25 12:16
你可以写一个类在其中创建一个内部类,编译看两个的字节码文件
外部的字节码是:外部类名.class
内部的字节码是:外部类名$内部类名.class
通过他们的名字构造就能看出关系,外部类单独存在了,但是内部类却是在外部类的前提下才有,也就是要使用内部类必须先创建外部类实例,好比有了外部的人,人中的内脏才有意义。
但是内部类又好比外部类的一个成员,所以权限很大,可以直接访问外部类的其他成员。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2