jiang_liu_ 2016-08-17 06:02 采纳率: 100%
浏览 1717
已采纳

关于java对象实例化的一些顺序过程

package myTest;

abstract class Glyph {
abstract void draw();

Glyph() {
    System.out.println("Glyph() before draw()");
    draw();
    System.out.println("Glyph() after draw()");
}

}

class RoundGlyph extends Glyph {
int radius = 1;

RoundGlyph(int r) {
    radius = r;
    System.out.println("RoundGlyph.RoundGlyph(), radius = " + radius);
}

void draw() {
    System.out.println("RoundGlyph.draw(), radius = " + radius);
}

}

public class PolyConstructors {
public static void main(String[] args) {
new RoundGlyph(5);
}
}

这个是thinking in java书上的一个例子,解释并没有看的很懂,这里实例化了一个Roundlyph对象,会先调用父类构造器,当调用父类构造器的时候执行了覆盖的draw方法,但是此时父类没有radius,所以没有初始化这个值,但是子类成员的初始化还没有开始,所以这个时候radius应该是都没生命的啊,为什么还会输出0.
只有11c币,全身家当了

  • 写回答

8条回答 默认 最新

  • poseidon-angel 2016-08-17 17:00
    关注

    你的疑惑可能是,为什么我的成员都没初始化却有0这个值?
    我刚刚跟你说了类加载从内存到jvm的过程中的第二步
    链接 这个过程就已经自动为类的成员开辟内存了,也就是说,此时这个成员是存在的,这个变量存在的,那么你又没有给他赋值,就分配了一个默认值,int的默认值是0,于是你看到的结果就是0了。
    懂了吗? 这不是初始化不初始化的问题,而是这个变量早在 链接 这个过程中就已经为这个变量分配内存分配默认值了。
    而这个开辟为类变量开辟内存分配初始值的地方是在
    内存中的堆栈中的栈 中的方法区的类代码存档区域执行的。
    兄弟我想解释到这个地步你应该已经弄懂了吧,欠缺的或许是一时没想起来或是有些知识没学?
    所以,给个分吧。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(7条)

报告相同问题?

悬赏问题

  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题