静态代码段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 代码段,可以看作是类首次加载(被虚拟机加载)执行的代码,而对于类的加载,首先要执行其基类的构造,再执行其本身的构造
    静态块只在类声明时执行,类实例化时将不再调用。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值