java: java代码块附阿里面试题
定义:使用{ }定义的一段代码
根据代码块定义的位置以及关键字,可分为四种:
普通代码块
构造块
静态块
同步代码块(多线程)
1.1 普通代码块:定义在方法中的代码块
public class Test {
public static void main(String[] args) {
{
int x = 10;
System.out.println("x = "+x);
}
int x = 20;
System.out.println("x = "+x);
}
}
一般如果方法中代码较长时,为避免变量重名时使用。(使用较少)
1.2 构造块:定义在类中的代码块(不加修饰符)
class Person{
{
System.out.println("Person类的构造块");
}
public Person(){
System.out.println("Person类的构造方法");
}
}
public class Test {
public static void main(String[] args) {
new Person();
new Person();
}
}
运行上述代码发现,构造块优于构造方法执行,且每产生一个新对象就会地搜用一次构造块
1.3 静态块
静态代码块:用static修饰的代码块
1.3.1 非主类中的静态块
class Person{
{
System.out.println("Person类的代码块");
}
public Person(){
System.out.println("Person类的构造方法");
}
static {
System.out.println("Person类的静态块");
}
}
public class Test{
public static void main(String[] args) {
System.out.println("start-----------");
new Person();
new Person();
System.out.println("end--------------");
}
}
运行结果如下:
可发现静态块优于构造块执行,且无论实例化多少对象,静态块都只执行一次。
1.3.2 主类中的代码块
public class Test{
{
System.out.println("Test的代码块");
}
public Test(){
System.out.println("Test的构造方法");
}
static {
System.out.println("Test的静态块");
}
public static void main(String[] args) {
System.out.println("start-----------");
new Test();
new Test();
System.out.println("end--------------");
}
}
 运行结果如下
主类中的静态块优于主方法执行。
看一道题:
public class Test {
//构造方法
public Test() {
System.out.println("Test父类构造方法");
}
//非静态代码块
{
System.out.println("父类非静态代码块");
}
//静态代码块
static {
System.out.println("父类静态代码块");
}
}
class B extends Test{
public B(){
System.out.println("子类构造方法");
}
{
System.out.println("子类非静态代码块");
}
static{
System.out.println("子类静态代码块");
}
public static void main(String[] args) {
System.out.println("start-----");
new B();
new B();
}
}
可看一下该代码的运行结果。