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