哪个是正确的选择? C或D?

时间:2015-08-07 06:17:03

标签: java

public class Sequence { 
    Sequence() {
        System.out.print("c ");
    }

    {
        System.out.print("y ");
    } 

    public static void main(String[] args) { 
        new Sequence().go(); 
    } 

    void go() { 
        System.out.print("g ");
    } 

    static { 
        System.out.print("x "); 
    } 
} 

结果如何?

  • A)c x y g
  • B)c g x y
  • C)x c y g
  • D)x y c g
  • E)y x c g
  • F)y c g x

这是Oracle认证问题和答案是选项D.我不明白答案。我认为选项C是正确的。任何人都可以解释为什么答案是选项D而不是选项C?

4 个答案:

答案 0 :(得分:5)

基本上,只需仔细阅读JLS 12.5 (Creation of New Class Instances)即可。

特别注意以下顺序:

  
      
  • 为此类执行实例初始值设定项和实例变量初始值设定项[...]

  •   
  • 执行此构造函数的其余部分。 [...]

  •   

y由实例初始化程序打印; c由构造函数的主体打印 - 因此首先打印y

答案 1 :(得分:0)

java类的执行顺序如下:

  1. 静态块初始化,因为它在对象创建之前进行。
  2. 对象的初始化块
  3. 父构造函数(未在代码中列出)
  4. 构造函数
  5. 之后调用的方法

答案 2 :(得分:0)

此代码块中有静态和实例初始值设定项。

按顺序,首先运行静态初始化程序,然后在创建对象实例时运行实例初始化程序。这由JLS 12.4.2JLS 12.5指定:

  
      
  1. 接下来,按文本顺序执行类的类变量初始值设定项和静态初始值设定项,或接口的字段初始值设定项,就好像它们是单个块一样。
  2.   
 
  

当评估类实例创建表达式(第15.9节)导致实例化类时,将显式创建新的类实例。

     

... 4.执行此类的实例初始值设定项和实例变量初始值设定项,将实例变量初始值设定项的值分配给相应的实例变量,按从开到文本的顺序在源代码中以从左到右的顺序排列为了上课。如果执行任何这些初始值设定项导致异常,则不会处理其他初始化程序,并且此过程会突然完成同样的异常。否则,继续执行步骤5.

要进一步细分:

  • 根据要加载的类,首先打印"x"
  • 通过初始化Sequence的实例,接下来会打印"y"
  • 通过调用Sequence的无参数构造函数,"c"将被打印第三。
  • 通过调用go方法,最后打印"g"

答案 3 :(得分:0)

1.static块在类加载时在main方法之前执行。

{
System.out.print("y ");
 }   

2.在创建类的实例时创建实例初始化程序块。

Sequence(){
System.out.print("c "); 
}

3.在调用父类构造函数后调用实例初始化程序块

$(function(){
    //Find all ul elements within items in the nav
    $('nav ul li:has(ul)').each(function(){
        //Prevent the links that have submenus from being clicked
        $(this).children('a').on('click', function(e){
            e.preventDefault();
        });
        $(this).children('a').mouseover(function(){
            console.log('hovered');
            $(this).parent().find('ul').css('display', 'inline');
        })
        .mouseout(function(){
            $(this).parent().find('ul').css('display', 'none');
        });
    });
});