关于继承的一个问题

来源:9-5 Java 中的 final 的使用

榎目贵音

2016-05-05 18:16

public class demo1 {
	public static int b=10;
	public demo1(){
		b=1;
	}
	static{
		b=2;
	}
}

这是第二个

public class Demo2 extends demo1{
    public static void main(String[] args) {
		demo1 d=new demo1();
		System.out.println(d.b);
	}
}

为什么结果是1不是2,不是说static的初始化块里面的b会覆盖构造器的b么?

写回答 关注

5回答

  • 命里有玄机
    2016-05-05 18:37:12
    已采纳

    static 初始化快在构造器前先执行,不会覆盖..

    Thomas...

    其实你的core question 是首先加载类成员(包括类变量和类初始块,如果类初始块位置在前面,按照系统顺序执行的原则,这个时候类变量还没有定义,系统回自动把类变量提前定义,但是这个时候类变量=缺省值),然后再在调用构造函数的时候执行实例变量和实例初始块代码. 你的程序里面没有构造函数,按照above describtion 所以b=2

    2017-05-19 09:22:22

    共 5 条回复 >

  • qq_雾里看花_12
    2017-07-13 19:00:25

    执行顺序,普通初始化>static初始化>构造函数初始化。构造这个最后执行。

  • BlueBlueSkyZ
    2016-07-09 20:38:33

    注意顺序

  • 雪中_悍刀行
    2016-07-09 18:15:37

    public class Demo2 extends demo1{

        public static void main(String[] args) {

            demo1 d=new demo1();

            System.out.println(d.b);

        }

    }

    在调用静态变量时,无需创建对象进行调用,

    public class Demo2 extends Demon1{

         public static void main(String[]args){

             System.out.println("静态初始化块中变量"+d);

    }

    }

  • 书书呆呆子子
    2016-05-10 13:05:25

    执行顺序是static代码块,然后是构造方法,然后是普通方法。

Java入门第二季 升级版

课程升级!以终为始告别枯燥,在开发和重构中体会Java面向对象编程的奥妙

530715 学习 · 6091 问题

查看课程

相似问题