代码块:使用{ }定义的一段代码。
根据代码块定义的位置以及关键字,分为4种:
1)普通代码块
2)构造块
3)静态块
4)同步代码块 — 多线程
1、普通代码块
普通代码块:定义在方法中的代码块
public class Test {
public static void main(String[] args) {
{
//普通代码块
int x = 10;
System.out.println("x = " + x);
}
int x = 100;
System.out.println("x = "+ x);
}
}
2、构造块
构造块:定义在类中的代码块(不加修饰符)
class Person{
{
//构造块
System.out.println("1、Person类的构造块");
}
public Person(){
System.out.println("2、Person类的构造方法");
}
}
public class Test {
public static void main(String[] args) {
new Person();
new Person();
}
}
通过以上代码可以发现:构造块优先于构造方法执行,每产生一个新的对象就调用一次构造块,构造块可以进行简单的逻辑操作(在调用构造方法之前)。
3、静态代码块
静态代码块:使用static定义的代码块
3.1 在非主类中的静态代码块
class Person{
{
//构造块
System.out.println("1、Person类的构造块");
}
public Person(){
System.out.println("2、Person类的构造方法");
}
static {
System.out.println("3、Person类的静态块");
}
}
public class Test {
public static void main(String[] args) {
System.out.println("======start======");
new Person();
new Person();
System.out.println("======end======");
}
}
通过以上代码可以发现:静态块优先于构造块执行,无论产生多少实例对象,静态块都只执行一次。
静态块的主要作用是为static属性进行初始化
3.2 在主类中的代码块
public class Test {
{
System.out.println("1、Test的构造块");
}
public Test(){
System.out.println("2、Test的构造方法");
}
static {
System.out.println("3、Test的静态块");
}
public static void main(String[] args) {
System.out.println("======start======");
new Test();
new Test();
System.out.println("======end======");
}
}
通过以上代码可以发现:在主类中定义的静态块,优先于main方法执行。
如果一些属性需要在使用前做处理,可以考虑使用代码块。
小试牛刀
这是一道阿里的Java校招笔试题:
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) {
System.out.println("======start======");
new HelloB();
new HelloB();
System.out.println("======end======");
}
}
结果为: