阿里的Java校招笔试题(经典)——代码块

前言:这道题第一眼看上去让人脑壳疼,但搞清楚代码块的知识之后(其实是很基础的知识哦),又特别有意思,有感而发。

 代码:

class HelloA{
    //构造方法
    public HelloA(){
        System.out.println("1.Hello A!父类构造方法");
    }
    //非静态代码块
    {
        System.out.println("2.i'm A class.父类非静态代码块");
    }
    //静态代码块
    static{
        System.out.println("3.static A 父类静态代码块");
    }
}
public class HelloB extends HelloA{
    //构造方法
    public HelloB(){
        System.out.println("4.Hello B!构造方法");
    }
    //非静态代码块
    {
        System.out.println("5.i'm B class.非静态代码块");
    }
    //静态代码块
    static{
        System.out.println("6.static B 静态代码块");
    }
    public static void main(String[] args){
        System.out.println("7.----start----");
        new HelloB();
        new HelloB();
        System.out.println("8.----end----");
    }
}

运行结果:

 

阿里的Java校招笔试题(经典)——代码块_第1张图片

下面是一些关于代码块的知识点 

1.普通代码块:类中方法的方法体

public void test(){

.......

}

2. 构造块:{}

1) 定义在类中的代码块(不加任何修饰符)

2) 在对象产生时,优先于构造方法执行,有几个对象产生,就调用几次构造块

3.静态代码块:static{}

1)非主类中的静态代码块

在类加载时执行,优先于构造块执行,无论有多少对象产生,只会调用一次。

2)主类中的静态代码块

主类中的静态块优先于主方法执行

此题中,子类(HelloB)对象实例化之前首先调用父类(HelloA)构造方法产生父类对象后再调用子类构造方法实例化子类对象。

4.同步代码块:synchronized(obj){}

(这里简单说一下,它应用于多线程部分)

在方法中使用synchronized(对象),一般可以锁定当前对象this表示同一时刻只有一个线程能够进入同步代码块,但是多个线程可以同时进入方法。

在方法声明上加synchronized,表示此时只有一个线程能进入同步方法。

 

你可能感兴趣的:(关于Java)