JAVA笔试题
1、静态语句块、构造语句块和构造函数的执行顺序
静态语句块:在类加载的时候执行(从父类到子类)
静态语句块执行完,执行main方法
new对象,从上到下先执行构造代码块在执行构造器
package com.***.subject;
public class HelloA {
public HelloA()
{
System.out.println("hello A");
}
{
System.out.println("I'm A class");
}
static
{
System.out.println("static A");
}
}
public class HelloB extends HelloA{
public HelloB()
{
System.out.println("hello B");
}
{
System.out.println("I'm B class");
}
static
{
System.out.println("static B");
}
public static void main(String[] args)
{
new HelloB();
}
}
2、初始化顺序
当程序执行时,需要生成某个类的对象,java会检查是否加载了这个类,如果没有,则先执行类的加载在生成对象,如果已经加载则直接生成对象。
在类加载过程中
- static变量和static代码快会按代码顺序加载。
- 然后,其他变量和构造代码块会按顺序加载
- 最后执行构造函数。
public class TestExtends{
public static void main(String[] args){
new Circle();
}
}
class Draw{
public Draw(String type){
System.out.println(type + "1");
}
}
class Shape{
private Draw draw = new Draw("shape");
{
System.out.println("shape constructor block");
}
static
{
System.out.println("shape static block");
}
public Shape()
{
System.out.println("2");
}
}
class Circle extends Shape
{
private Draw draw = new Draw("circle");
public Circle()
{
System.out.println("3");
}
}
//输出为:
//shape static block
//shape1
//shape constructor block
//2
//circle1
//3