请在java

时间:2015-11-20 14:01:45

标签: java inheritance constructor initialization instance

class abc extends TestStart{
     static{
         System.out.println("c");
     }
     {
         System.out.println("f");
     }
     public abc(){
         System.out.println("d");
     }
}

public class TestStart {
     static {
         System.out.println("A");
     }
     {
         System.out.println("z");
     }
     public TestStart(){
         System.out.println("b");
     }

     public static void main(String[] args) {

         TestStart x = new abc();
         TestStart y = new TestStart();             
     }
}

输出-----------> 一个 C ž b F d ž B'/ P>

我认为这个的输出行为---->>>>> TestStart x = new abc(); --------应该是: -

  1. 两个类的第一个静态块将运行
  2. 然后因为新的abc()而调用子类的init块。但是这里的父类的init被称为
  3. 然后从新的abc()调用super(),这会调用父类构造函数。
  4. 在父类构造函数之前,父类的init块将执行。
  5. 然后parnet类的构造函数将执行
  6. 然后子类的构造函数将执行。
  7. 我应该得到以下输出: 一个 C F ž b d ž B'/ P>

    这种行为主要来源于父类和子类中没有init块。 请解释我提到的输出。

3 个答案:

答案 0 :(得分:2)

您得到:A c z b f d z b A c f z b d z b

所以,你是说你期望在f z之前发生b

所以,你基本上说的是你所期望的:

  • 派生程度最高的类(f
  • 的实例初始值设定项

之前调用

  • 基类(z)和
  • 的实例初始值设定项
  • 基类的构造函数(b)。

嗯,这根本不是事情的发生。必须在派生类的实例初始化开始之前完成基类的所有实例初始化,否则派生类将能够访问基类的未初始化成员。

所有静态初始化内容(Ac)都是问题中的红色鲱鱼,让我们感到困惑。

答案 1 :(得分:0)

初始化之后,所有类中的静态块和变量都运行父级的初始化程序。在父构造函数之后,然后在子构造函数中初始化子项。 那是因为您可以在子初始值设定项中使用一些父字段,因此必须先将它们初始化。

答案 2 :(得分:0)

首先,一些命名:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul>
  <li>WHITBY
    <time datetime="2015-11-1">November 1st 11.00</time><a href="bbc.co.uk" class="datelink"> SOME LINK </a> 
  </li>
  <li>EASINGWOLD
    <time datetime="2015-11-2">November 2nd 10.34</time><a href="bbc.co.uk" class="datelink"> SOME LINK </a> 
  </li>
  <li>DARLINGTON
    <time datetime="2015-11-15">November 15th 9.30</time><a href="bbc.co.uk" class="datelink"> SOME LINK </a> 
  </li>
  <li>RIPON CITY
    <time datetime="2015-11-16">November 16th 11.00</time><a href="bbc.co.uk" class="datelink"> SOME LINK </a> 
  </li>
  <li>ROMANBY
    <time datetime="2015-11-20">November 20th 13.00</time><a href="bbc.co.uk" class="datelink"> SOME LINK </a> 
  </li>
  <li>KIRKBYMOORSIDE
    <time datetime="2015-11-21">November 21st</time><a href="bbc.co.uk" class="datelink"> SOME LINK </a> 
  </li>
  <li>BEDALE
    <time datetime="2015-11-22">November 22nd 8.30</time><a href="bbc.co.uk" class="datelink"> SOME LINK </a> 
  </li>
  <li>CATTERICK
    <time datetime="2015-11-23">November 23rd 9.00</time><a href="bbc.co.uk" class="datelink"> SOME LINK </a> 
  </li>
</ul>

首先调用静态初始化器是正确的,但唯一的保证是在任何上下文中使用该类之前调用​​类静态初始化器。

对于实例初始化器和构造器,调用的顺序如下,从第一次调用到最后调用:

 public class TestStart {
   static { // static initializer
     System.out.println("A");
   }
   { // instance initializer
     System.out.println("z");
   }
   public TestStart() { // constructor
     System.out.println("b");
   }
 }

如果使用Parent initializer, Parent Constructor, Your Initializer, Your Constructor 从同一个类调用其他构造函数,则在所有构造函数调用类之前调用​​初始化程序。