前言:这道题第一眼看上去让人脑壳疼,但搞清楚代码块的知识之后(其实是很基础的知识哦),又特别有意思,有感而发。
代码:
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----");
}
}
运行结果:
下面是一些关于代码块的知识点
1.普通代码块:类中方法的方法体
public void test(){
.......
}
2. 构造块:{}
1) 定义在类中的代码块(不加任何修饰符)
2) 在对象产生时,优先于构造方法执行,有几个对象产生,就调用几次构造块
3.静态代码块:static{}
1)非主类中的静态代码块
在类加载时执行,优先于构造块执行,无论有多少对象产生,只会调用一次。
2)主类中的静态代码块
主类中的静态块优先于主方法执行
此题中,子类(HelloB)对象实例化之前首先调用父类(HelloA)构造方法产生父类对象后再调用子类构造方法实例化子类对象。
4.同步代码块:synchronized(obj){}
(这里简单说一下,它应用于多线程部分)
在方法中使用synchronized(对象),一般可以锁定当前对象this表示同一时刻只有一个线程能够进入同步代码块,但是多个线程可以同时进入方法。
在方法声明上加synchronized,表示此时只有一个线程能进入同步方法。