关于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币,全身家当了

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

因为int默认值是0,String的默认值是null

这里我又有个问题了,变量的声明式在什么时候执行

变量初始化先于构造方法执行,父类构造方法先于子类变量初始化

调用构造之前,先为属性分配空间,并且赋予各种数据类型的默认值

jvm把class文件加载到内存,并对数据进行校验、转换解析和初始化;
对于类的属性,Java虚拟机会在加载class时依程序中的顺序自动进行初始化;
顺序是
1,由父类到子类;
2,先static,再普通变量,再构造器;

初始化值:
原始类型的,比如 int ,初始化为 0 ,其他类推;
封装类型的,比如Integer,初始化为NULL,其他类推;

哥们我来告诉你,我是过来人,如果你没有理解好一个知识点,放下,等经验积累后自然可以明白的。

我给你解释下
首先整个类从编写到运行显示给你看的的过程是:
①将java的源文件也就是你的源码编译成class文件,这个编译过程中的细节涉及java语言转换成机器语言,这个我先不讲,怕误导你。
②java将源文件编译好了,那么就生成了class字节码文件,这个文件里面的内容不是人可以看懂的。
那么编译好了,怎么运行?
肯定是在jvm里面运行,但这种的有个过程。
首先java先将class文件加载到内存中
经历了这三步①加载②链接
③初始化 :这个过程就涉及到了你提的问题,初始化阶段是执行类构造器的过程,类构造器会自动合并类变量的赋值动作(代码)和static语句合并生成的。最后在合并的过程中若发现父类没有加载,则就会加载父类的构造。
jvm会保证在执行这些过程中类会被正确的加锁和同步(多线程的知识)。
执行完这些过程则会将class放入jvm运行。
那么好好的一个类什么时候会执行类初始化的代码?这个执行的判定分为类的主动初始化和被动初始化,就比如说我new这个类对象会被初始化,或者是调用某类中的xx则这个类会被初始化。

这也是为什么,子类构造器中会默认调用父类构造器的原因。
打了一大段子,还翻了笔记,希望你能给分,这些知识都是小儿科,你还有什么不懂的可以问我或是经验这些。
希望给c币。

最后看了一下你说的,子类的变量都没去初始化,为什么会输出0,难道你忘了变量会有默认值的吗?
int的默认值是0