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 ");
}
}
结果如何?
这是Oracle认证问题和答案是选项D.我不明白答案。我认为选项C是正确的。任何人都可以解释为什么答案是选项D而不是选项C?
答案 0 :(得分:5)
基本上,只需仔细阅读JLS 12.5 (Creation of New Class Instances)即可。
特别注意以下顺序:
为此类执行实例初始值设定项和实例变量初始值设定项[...]
执行此构造函数的其余部分。 [...]
y
由实例初始化程序打印; c
由构造函数的主体打印 - 因此首先打印y
。
答案 1 :(得分:0)
java类的执行顺序如下:
答案 2 :(得分:0)
此代码块中有静态和实例初始值设定项。
按顺序,首先运行静态初始化程序,然后在创建对象实例时运行实例初始化程序。这由JLS 12.4.2和JLS 12.5指定:
- 接下来,按文本顺序执行类的类变量初始值设定项和静态初始值设定项,或接口的字段初始值设定项,就好像它们是单个块一样。
醇>
当评估类实例创建表达式(第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');
});
});
});