首页 > 试题广场 >

关于以下application,说法正确是什么?

[单选题]
关于以下application,说法正确是什么?
public class Test {
	static int x=10;
	static {x+=5;}
	public static void main(String[] args) //4
        {
		System.out.println("x="+x);
	}
	static{x/=3;};
}//9
  • 4行与9行不能通过编译,因为缺少方法名和返回类型
  • 编译通过,执行结果是:x=5
  • 编译通过,执行结果是:x=3
  • 9行不能通过编译,因为只能有一个静态初始化器
class A{
	static {
		System.out.println("父类静态代码块");
	}
	public A(){
		System.out.println("父类构造方法");
	}
	{
		System.out.println("父类初始化块");
	}
}
public class B extends A{
	static{
		System.out.println("子类静态代码块");
	}
	public B(){
		System.out.println("子类构造方法");
	}
	{
		System.out.println("子类初始化块");
	}
	public static void main(String[] args){
		new B();
	}
}
父类静态代码块-->子类静态代码块-->父类普通代码块-->父类构造方法-->子类代码块-->子类构造方法;
编辑于 2016-08-20 15:31:59 回复(27)
首先明确一下执行顺序,静态代码块先于主方法执行,静态代码块之间遵从代码顺序执行。
所以:先初始化静态变量x=10;//x=10
执行第一个静态代码块,x=x+5; //x=15
执行第二静态代码块 x=x/3; //x=5
执行主方法: 输出x=5
拓展一下,在类中定义的{}之间被称为构造块,构造块相对于构造方法先执行,构造块之间按照代码编译顺序执行
此外还有普通代码块,存在于方法之中。
发表于 2017-12-15 11:24:01 回复(6)
答案:B
这道题主要考察类记载时候的初始化问题,执行这个类的 main方法,会导致类进行加载,而类加载的属性如下
 1、虚拟机在首次加载Java类时,会对静态初始化块、静态成员变量、静态方法进行一次初始化。我们不要去纠结这里的顺序,一般来说我们只需要知道,静态方法一般在最后。
 2、只有在调用new方法时才会创建类的实例
 3、类实例创建过程:按照父子继承关系进行初始化,首先执行父类的初始化块部分,然后是父类的构造方法;再执行本类继承的子类的初始化块,最后是子类的构造方法
 4、类实例销毁时候,首先销毁子类部分,再销毁父类部分

编辑于 2015-10-21 16:47:03 回复(18)
静态块:用static申明,JVM加载类时执行,仅执行一次,且按声明顺序执行
构造块:类中直接用{}定义,每一次创建对象时执行
执行顺序优先级:静态块>main()>构造块>构造方法
发表于 2016-07-10 18:02:11 回复(4)
test类加载的时候首先进行静态成员初始化,之后进行静态代码块初始化,x=10,x=10+5,x=15/3
发表于 2015-10-19 21:22:26 回复(1)
Java初始化顺序:
1 继承体系的所有静态成员初始化(先父类,后子类)
2 父类初始化完成(普通成员的初始化-->构造函数的调用)
3 子类初始化(普通成员-->构造函数)
发表于 2015-10-27 16:33:26 回复(2)
1) 首先初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化 
2) 然后初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化 
3) 其次初始化父类的普通成员变量和代码块,再执行父类的构造方法 
4) 最后初始化子类的普通成员变量和代码块,再执行子类的构造方法 
对象初始化时,先给对象的属性赋默认值,然后调用构造方法
发表于 2016-04-17 23:49:08 回复(0)
对于static的加载顺序:静态成员初始化,静态代码块初始化,静态方法初始化
发表于 2016-01-05 20:48:39 回复(2)
发表于 2016-01-08 10:08:27 回复(9)

类的初始化顺序如下:

  1. 父类静态变量
  2. 父类静态代码块
  3. 子类静态变量
  4. 子类静态代码块
  5. 父类非静态变量
  6. 父类非静态代码块
  7. 父类构造器
  8. 子类非静态变量
  9. 子类非静态代码块
  10. 子类构造器

结合这个顺序,看下图:
执行过程

发表于 2018-05-23 20:25:46 回复(1)
public class Test {
   static int x=10;
   static {x+=5;
   System.out.println("----first");
   }
   public static void main(String[] args) //4
       {
       System.out.println("x="+x);
   }
   static{x/=3;
   System.out.println("-----second");
   }
}

静态方法的调用按照出现的顺序进行调
所以,首先是x=10+5;
其次,x=15/3;
最后,输出x=5
发表于 2016-03-27 15:08:50 回复(3)
关于子类和父类的初始化顺序,这里面有详细介绍:http://blog.csdn.net/shakespeare001/article/details/51151650
发表于 2016-05-06 10:31:38 回复(0)
执行顺序:静态代码块>构造代码块>构造方法>main()
发表于 2017-12-18 16:36:48 回复(1)
首先进行静态变量的初始化,然后是静态代码块的进行
发表于 2019-10-10 10:28:11 回复(0)
执行顺序:父类静态成员初始化、子类静态成员初始化、父类静态代码块、子类静态代码块、父类代码块、父类构造方法、子类代码块、子类构造方法。 总体而言:静态变量>静态代码块>普通代码块>构造方法
发表于 2022-03-12 20:44:02 回复(0)
JAVA的初始化顺序: 父类的静态成员初始化>父类的静态代码块>子类的静态成员初始化>子类的静态代码块>父类的代码块>父类的构造方法>子类的代码块>子类的构造方法
发表于 2020-10-06 08:42:48 回复(0)
牢记代码的执行流程:
父类静态代码块-->子类静态代码块-->父类普通代码块-->父类构造方法-->子类代码块-->子类构造方法
发表于 2019-11-08 11:04:58 回复(0)
答案:B 这道题主要考察类记载时候的初始化问题,执行这个类的 main方法,会导致类进行加载,而类加载的属性如下  1、虚拟机在首次加载Java类时,会对静态初始化块、静态成员变量、静态方法进行一次初始化。我们不要去纠结这里的顺序,一般来说我们只需要知道,静态方法一般在最后。  2、只有在调用new方法时才会创建类的实例  3、类实例创建过程:按照父子继承关系进行初始化,首先执行父类的初始化块部分,然后是父类的构造方法;再执行本类继承的子类的初始化块,最后是子类的构造方法  4、类实例销毁时候,首先销毁子类部分,再销毁父类部分
发表于 2019-10-13 06:58:24 回复(0)
静态代码块不限制只能有一个,且调用时根据静态代码块出现的顺序调
发表于 2018-07-23 16:51:17 回复(0)
发表于 2018-07-04 11:48:50 回复(0)