为了账号安全,请及时绑定邮箱和手机立即绑定

关于继承的一个问题

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 回答

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

1 回复 有任何疑惑可以回复我~
#1

榎目贵音 提问者

那我在demo1里面这么写的时候为什么是等于2呢? public class demo1 { public static int b=10; public demo1(){ b=1; } static{ b=2; } public void show(){ System.out.println("demo1_biu"); } public static void main(String[] args) { System.out.println(b); } }
2016-05-05 回复 有任何疑惑可以回复我~
#2

命里有玄机 回复 榎目贵音 提问者

虚拟机调用main方法的时候,并不会去创建它所在类的对象,所以就不会调用构造方法..
2016-05-12 回复 有任何疑惑可以回复我~
#3

榎目贵音 提问者

非常感谢!
2016-05-18 回复 有任何疑惑可以回复我~
#4

桥米 回复 命里有玄机

想不明白= =
2017-03-01 回复 有任何疑惑可以回复我~
#5

ThomasYao

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

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

0 回复 有任何疑惑可以回复我~

注意顺序

0 回复 有任何疑惑可以回复我~

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);

}

}

0 回复 有任何疑惑可以回复我~

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

1 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Java入门第二季 升级版
  • 参与学习       530711    人
  • 解答问题       6091    个

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

进入课程

关于继承的一个问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信