普通代码块:
定义在方法中的代码块。
public class Test {
public static void main(String[] args) {
{
// 普通代码块
int x = 10;
System.out.println(x);
}
int x = 20;
System.out.println(x);
}
}
结论:普通代码块主要是用来解决变量重命名问题,并且代码块一定要写在方法变量名前面!
构造块:
定义在类中的代码块,而且代码块前面不加任何修饰符。
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();
}
}
结论:构造块优先于主方法执行,并且由多少个对象产生就调用多少次构造块!
静态代码块:
定义在类中的代码块,并且前面有static修饰符。
根据静态块所在的类的不同又可分为以下两种类型:
1. 非主类中的静态块
class Person {
{
// 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("===============");
new Person();
new Person();
System.out.println("===============");
}
}
结论:定义在非主类中的静态块优先于构造块执行,并且无论有多少对象产生,静态块只执行一次(在类加载时执行),静态块的主要作用是为static属性进行初始化!
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("===============");
new Person();
new Person();
System.out.println("===============");
}
}
结论:主类中的构造块优先于主(main)方法执行!
*** 三种代码块的综合题:
class Test {
public Test() {
System.out.println("1.Test的构造方法");
}
{
System.out.println("2.Test的构造块");
}
static{
System.out.println("3.Test的静态块");
}
}
public class DaiMaKuai extends Test {
public DaiMaKuai() {
System.out.println("4.DaiMaKuai的构造方法");
}
{
System.out.println("5.DaiMaKuai的构造块");
}
static{
System.out.println("6.DaiMaKuai的静态块");
}
public static void main(String[] args) {
System.out.println("7.main方法开始");
new DaiMaKuai();
new DaiMaKuai();
System.out.println("8.main方法结束");
}
}
结论:因为 DaiMaKuai 是主类,主类中的静态代码块优先于主方法执行,又因为DaiMaKuai类继承了Test类,Test类是父类,DaiMaKuai是子类,子类对象在进行实例化之前一定会首先实例化父类对象,即先有父类对象才有子类对象,所以先加载父类接着加载子类,加载的过程执行静态块,即先执行Test类的静态块再执行DaiMaKuai类的静态块,接着才是主方法开始,又因为产生了DaiMaKuai类的两个对象,调用父类的构造块、构造方法,接着调用子类的构造块、构造方法,因为构造块优先于构造方法执行,生成两个对象,构造块和构造方法都会执行两次,接着主方法结束。