public class A {
//构造方法
public A(){
System.out.println("A--->父类构造方法");
}
//非静态代码块
{
System.out.println("A--->父类非静态代码块");
}
//静态代码块
static{
System.out.println("A--->父类静态代码块");;
}
}
public class B extends A{
//构造方法
public B(){
System.out.println("B--->构造方法");
}
//非静态语句块
{
System.out.println("B--->非静态语句块");
}
//静态语句块
static{
System.out.println("B--->静态语句块");
}
public static void main(String[] args) {
System.out.println("----开始----");
new B();
System.out.println("----结束----");
}
}
运行结果:
new两次
public class B extends A{
//构造方法
public B(){
System.out.println("B--->构造方法");
}
//非静态语句块
{
System.out.println("B--->非静态语句块");
}
//静态语句块
static{
System.out.println("B--->静态语句块");
}
public static void main(String[] args) {
System.out.println("----开始----");
new B();
new B();
System.out.println("----结束----");
}
}
运行结果:
静态块属于类的,非静态属于对象,有对象才有类,有类不一定有对象。打个比方,有车子一定有图纸,有图纸未必有车子。静态块用于类的初始化,构造函数用于对象的初始化,所以静态块在非静态块之前执行。静态代码只在第一次new执行一次,之后不再执行,而非静态块每new一次就执行一次。
所以静态方法>非静态语句块>构造方法
上图是我遇到的面试题
import Test02.Test01;
public class Test01 {
public static Test01 t1 = new Test01();
{
System.out.print("blockA");
}
static {
System.out.print("blockB");
}
public static void main(String[] args) {
System.out.print("开始");
Test01 t2 = new Test01();
System.out.println("结束");
}
}
运行结果:C,运行程序时先运行静态方法new了一个t1对象,t1里面就一个语句块,然后就打印了A,然后在执行下一个静态方法打印B,这些都在mian方法之前执行的,然后在执行main,然后打印"开始",再new t2这个对象,因为静态方法只在类加载的时候执行一次,所以就打印A,所以选C。