黑马程序员技术交流社区

标题: 一个内部类问题 [打印本页]

作者: 倪杭乘    时间: 2012-5-14 08:50
标题: 一个内部类问题
内部类在加载的时候什么时候进方法区?
系统运行时加载外部类到方法区,内部类是不是在外部类那块方法区中,
当创建对象的时候是把内部类方法直接调用到栈内存还是将内部类加载到外部类外的方法区中。具体过程是怎么样的

作者: 倪杭乘    时间: 2012-5-14 14:02
咋没人回答我呢~~~
作者: niceBoy    时间: 2012-5-14 14:19
內部類不也是類,只有在用的時候才加載,并不隨著外部類加載就加載(比如在外部類中都沒用到內部類,那就不加載)
在java中調用對象,調用的都是對象的引用。對象都在堆裏面(內部類對象也好,外部類對象也好)
作者: 倪杭乘    时间: 2012-5-14 16:30
不是非常明白
作者: 倪杭乘    时间: 2012-5-14 19:26
内部类不是也能创建对象吗
作者: suiabing    时间: 2012-5-14 19:40
内部类就当与一个外部类的变量。把他当做普通变量就可以了。java把这种类封装在了一个类的内部,目的就是隐藏这个类。所以当我们需要的时候才加载进JVM,关于存在哪里,应该是存储在这个外部类的方法区所属的区域中吧。
确定一点:如果使用内部类,就必须要现有外部类对象。
如果这个内部类是静态的,就相当于一个外部类。

编译会生成这样两个字节码文件
Outer.class
Outer$Inner.class



作者: 永恒之翼网络    时间: 2012-5-14 20:56
内部类是随着外部类加载到方法区的,因为内部类也有.class文件,当加载外部类时发现它有内部类,在加载完外部类之后,就开始加载内部类。“内部类是不是在外部类那块方法区中”,方法区只有一个,每个.class文件在方法区中是独立存放的。方法的调用肯定是要进方法栈的,不管是外部类的方法,还是内部类的方法。而方法栈只和线程有关,方法栈记录和跟踪线程对方法调用的过程。所以方法栈对每个线程调用方法的过程是分开记录的。
作者: 永恒之翼网络    时间: 2012-5-14 21:05
补充一下:“当创建对象的时候是把内部类方法直接调用到栈内存还是将内部类加载到外部类外的方法区中”
创建对象时,是在堆内存中新建一个该类的对象。如果创建时调用了内部方法,方法只会进方法栈,而不会进方法区。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2