大家好,最近几天开始看thinking in java。看到继承与初始化这里有点搞不清楚概念。
举个例子:我先写一个类a,里面有类变量、实例变量以及一些方法。然后我再写一个类b继承a,再加几个类变量、实例变量。然后在这个类b中写个main函数,new一个b类的实例。这时候初始化的顺序应该是怎样的呢?(类变量和实例变量都在定义的位置直接给赋值了)看了一下午书了,目前我的理解是:先按照声明的顺序,对基类a里面的类变量进行初始化,然后是对导出类b中新增的类变量按照声明顺序初始化。然后导出类b的构造器被调用,开始进入到b的构造器后,默认调用基类a的构造器,然后进入a的构造器后发现a就是根基类了,不用再调用更高一层的a的基类的构造器了,于是对类a里面的实例变量进行初始化。然后再调用类a的构造器的主体。然后回到b的构造器了,对类b中新增的实例变量进行初始化,然后调用类b的构造器主体,完成整个初始化。不知道我的理解对不?还请大家指点。但是我翻看书中更靠前一点儿的地方时发现这样一句话:在类的内部,变量定义的先后顺序决定了初始化的顺序。即使变量定义散布于方法定义之间,它们扔就会在任何方法(包括构造器)被调用之前得到初始化。这句话好像又和我上面自己的理解有些矛盾。如果说把上面这句话最后一点改成“它们会在任何方法(包括构造器<构造器的主体>)被调用之前得到初始化”。这样好像能自圆其说一些。不过以上都是我自己的猜想,迷迷糊糊ing,还请高手指点,谢谢了。
帮帮我这个小菜鸟吧。

解决方案 »

  1.   


    public class Test{
          public static void main(String[] args){
              Father f = new Father("父亲",45); 
              f.showinfo();
    }
    }class Father{
          public String name;
          public int age;
          public Father(String name,int age){
              this.name=name;
              this.age=age;}
          public void showinfo(){
              System.out.println("My name is "+name+" and I am "+age+"years old");
    }
    }能不能发出去啊,看看先
      

  2.   

    初始化的顺序应该是这样的
    ----------------------------------------
    public class Parent {
        private String name="1";        //1
        public Parent(){
            System.out.println("父类初始化");//3
        }
        private String id="1";          //2
    }
    -------------------------------------------------
    public class Child extends Parent{
        private String stNo="1";   //5
        private String schoolName="1";//6
        public Child(){
            System.out.println("子类初始化");//8
        }
        private String schoolNo="1";//7
    }------------------------------------------------
    public class Test {    public static void main(String[] args) {
            Child c = new Child();  //0
        }
    }