黑马程序员技术交流社区

标题: 继承下变量的初始化问题 [打印本页]

作者: 陆强强    时间: 2012-6-19 10:33
标题: 继承下变量的初始化问题
class fu
{
        int x=2;
       
        fu()
        {
                show();
        }
        public void show()
        {
                System.out.println(x);
        }

}
class zi extends fu
{
        int x=1;//问题:有这句话时第一个打印的是0,没有的时候是2,
        {
                      x=5;//
                }
        public void show()
        {
                System.out.println(x);
                new fu()//fu() f=new inner();所以s()走的是inner中的s ()
                {
                        public void show()
                        {
                                System.out.println(x);
                        }
                }.show();
        }
       
}
class neibulei
{
        public static void main(String[] args)
        {
                new zi().show();
}
作者: 车风波    时间: 2012-6-19 10:46
有这句话时第一个打印的是0  是因为 打印这句话System.out.println(x);的时候子类构造函数还没有执行,子类的成员变量就没有显式初始化,所以是0.
没有的时候是2  是因为 打印这句话System.out.println(x);的时候已经执行了父类的构造函数,父类的x已经显式初始化了,所以是2.
作者: 李文龙    时间: 2012-6-19 12:25
子类和父类中都有  x  这个变量,在继承的时候,同名变量会被覆盖掉。
new fu()//fu() f=new inner();所以s()走的是inner中的s ()
                {
                        public void show()
                        {
                                System.out.println(x);
                        }
                }.show();
这是一个匿名类,匿名类可以 调用zi类中的方法和变量,
当你有int x=1这句话的时候,匿名类调用zi类中的构造函数,你的程序中不存在构造函数,所以系统会自动生成一个无参构造函数为x赋值,也就是0;
当你没有int x=1这句话的时候,匿名类也是这样调用无参构造函数,此时无参构造函数会用super.fu();去调用父类中的构造函数,将x的值为2.
作者: 涂金哲    时间: 2012-6-19 17:49
上层类构造器调用一个方法,方法被束定到进行方法调用的当前类的这个方法上实现。即,创建子对象时,父类构造器被调用,父类show方法束定到子类show 方法实现。当定义变量x 时,还没有来得及进行显示初始化,打印的是系统默认值0,没我定义的时候打印的是从父类继承来的。
这个程序的初始化很复杂。
作者: sbeeqnui1987    时间: 2012-6-19 22:06

      当子类继承自父类时,为了保证父类成员变量的正确初始化,子类的任何构造器默认的都必须调用父类的某一构造器,具体调用哪个构造器要看构造器的初始化参数列表。如果没有初始化参数列表,那么子类的该构造器就调用父类的无参数构造器;如果有初始化参数列表,那么子类的该构造器就调用父类对应的参数构造器。

    而构造器的作用就在于负责类中成员变量(域)的初始化;同时类内的成员变量声明初始化被编译器转换成赋值语句强加在类的每一个构造器的内部。




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