面试中的笔试可能会遇到以下问题:
写出下面代码的执行结果:
class A{
static{
System.out.println("父类静态代码块...1");
}
public A(){
System.out.println("父类构造函数...");
}
{
System.out.println("父类非静态代码块...1");
}
static{
System.out.println("父类静态代码块...2");
}
{
System.out.println("父类非静态代码块...2");
}
}
class B extends A{
static{
System.out.println("子类静态代码块...1");
}
public B(){
System.out.println("子类构造函数...");
}
{
System.out.println("子类非静态代码块...1");
}
static{
System.out.println("子类静态代码块...2");
}
{
System.out.println("子类非静态代码块...2");
}
}
public class LoginAction {
public static void main(String[] args) {
System.out.println("main方法...");
new B();
}
}
运行结果是:
main方法...
父类静态代码块...1
父类静态代码块...2
子类静态代码块...1
子类静态代码块...2
父类非静态代码块...1
父类非静态代码块...2
父类构造函数...
子类非静态代码块...1
子类非静态代码块...2
子类构造函数...
首先要弄清楚子类与父类中的静态代码块、非静态代码块和构造函数的加载顺序:
加载父类中的静态代码块 ---> 加载子类中的静态代码块 ---> 加载父类中的非静态代码块和构造函数(先非静态后构造)---> 加载子类中的非静态代码块和构造函数(先非静态后构造)
而对于多个静态代码块,按代码的顺序加载...
写出下面代码的执行结果:
class A{
static{
System.out.println("父类静态代码块...1");
}
public A(){
System.out.println("父类构造函数...");
}
{
System.out.println("父类非静态代码块...1");
}
static{
System.out.println("父类静态代码块...2");
}
{
System.out.println("父类非静态代码块...2");
}
}
class B extends A{
static{
System.out.println("子类静态代码块...1");
}
public B(){
System.out.println("子类构造函数...");
}
{
System.out.println("子类非静态代码块...1");
}
static{
System.out.println("子类静态代码块...2");
}
{
System.out.println("子类非静态代码块...2");
}
}
public class LoginAction {
public static void main(String[] args) {
System.out.println("main方法...");
new B();
}
}
运行结果是:
main方法...
父类静态代码块...1
父类静态代码块...2
子类静态代码块...1
子类静态代码块...2
父类非静态代码块...1
父类非静态代码块...2
父类构造函数...
子类非静态代码块...1
子类非静态代码块...2
子类构造函数...
首先要弄清楚子类与父类中的静态代码块、非静态代码块和构造函数的加载顺序:
加载父类中的静态代码块 ---> 加载子类中的静态代码块 ---> 加载父类中的非静态代码块和构造函数(先非静态后构造)---> 加载子类中的非静态代码块和构造函数(先非静态后构造)
而对于多个静态代码块,按代码的顺序加载...