静态代码段static的执行情况收藏

现在的面试真TMD垃圾啊,什么题都出,而且工作的时候99.9%用不到的, 我估计面试官自己也搞不清楚。
package lucenedemo.test;

class Base {
static int a=1;
public Base(){
   System.out.println(" 55555");
}
static {
   System.out.println("init Base");
}
static void method(){
   System.out.println("Base");
}

}
class Sub extends Base{

public Sub(){
   System.out.println(" 44444");
}
static int b=2;
static {
   System.out.println(" init Sub");
}
}

public class Traversc {
public static void main(String[] args){
   Sub.method();
   System.out.println("a="+Sub.b);
}
}

问最后输出结果

init Base
Base
init Sub
a=2

如果
public class Traversc {
public static void main(String[] args){
   System.out.println("a="+Sub.b);
   Sub.method();
 
}

则输出

init Base
init Sub
a=2
Base

如果

public class Traversc {
public static void main(String[] args){
   System.out.println("a="+Sub.a);
   Sub.method();
 
}

则输出

public class Traversc {
public static void main(String[] args){
   System.out.println("a="+Sub.a);
   Sub.method();
 
}

可以看出静态代码段先于构造函数运行而且只运行一次,同时父类的优先级最高先被初始化。

public class Traversc {
public static void main(String[] args){
   Sub s=new Sub();
   System.out.println("a="+Sub.a);
   Sub.method();
 
}


显示

init Base
init Sub
55555
44444
a=1
Base

可以得出构造函数优先级别在静态之后,同时父类也执行了



还有一题:

指出下面程序的运行结果:
class A{
  static{
      System.out.print("1");
  }
  public A(){
      System.out.print("2");
  }
}
class B extends A{
  static{
      System.out.print("a");
  }
  public B(){
      System.out.print("b");
  }  
}
public class Hello{
  public static void main(String[] ars){
      A ab = new B(); //执行到此处,结果: 1a2b
ab = new B(); //执行到此处,结果: 1a2bab
  }
}
   注:类的static 代码段,可以看作是类首次加载(被虚拟机加载)执行的代码,而对于类的加载,首先要执行其基类的构造,再执行其本身的构造
    静态块只在类声明时执行,类实例化时将不再调用。


你可能感兴趣的:(虚拟机,工作,面试)