//执行的优先顺序:静态代码块>mian方法>构造代码块>构造方法。
其中静态代码块只执行一次。构造代码块在每次创建对象是都会执行。
牛客网的一道经典题目:
package go.jacob.day612;
public class Demo3 {
public static Demo3 d1=new Demo3();
{
System.out.println("A");
}
static{
System.out.println("B");
}
public static void main(String[] args) {
Demo3 d2=new Demo3();
}
/*
* 运行结果:
* A
* B
* A
*/
}
package go.jacob.day612;
public class Demo3 {
static{
System.out.println("B");
}
public static Demo3 d1=new Demo3();
{
System.out.println("A");
}
public static void main(String[] args) {
Demo3 d2=new Demo3();
}
/*
* 运行结果:
* B
* A
* A
*/
}
1 普通代码块
package go.jacob.day612;
public class Demo3 {
/*
* 普通代码块:在方法或语句中出现的{}就称为普通代码块。
* 普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”
*/
public static void main(String[] args) {
{
int x = 3;
System.out.println("1,普通代码块内的变量x=" + x);
}
int x = 1;
System.out.println("主方法内的变量x=" + x);
{
int y = 7;
System.out.println("2,普通代码块内的变量y=" + y);
}
}
/*
* 运行结果
* 1,普通代码块内的变量x=3
* 主方法内的变量x=1
* 2,普通代码块内的变量y=7
*/
}
2.普通构造代码块
package go.jacob.day612;
public class Demo3 {
/*
* 构造代码块:直接在类中定义且没有加static关键字的代码块称为{}构造代码块。
* 构造代码块在创建对象时被调用,每次创建对象都会被调用,
* 并且构造代码块的执行次序优先于类构造函数。
*/
{
System.out.println("第一代码块");
}
public Demo3(){
System.out.println("构造方法");
}
{
System.out.println("第二代码块");
}
public static void main(String[] args) {
new Demo3();
new Demo3();
new Demo3();
}
/*
* 运行结果:
* 第一代码块
* 第二代码块
* 构造方法
* 第一代码块
* 第二代码块
* 构造方法
* 第一代码块
* 第二代码块
* 构造方法
*/
}
3.静态代码块
package go.jacob.day612;
public class Demo3 {
/*
* 构造代码块:直接在类中定义且没有加static关键字的代码块称为{}构造代码块。
* 构造代码块在创建对象时被调用,每次创建对象都会被调用,
* 并且构造代码块的执行次序优先于类构造函数。
*/
{
System.out.println("普通构造代码块");
}
static{
System.out.println("静态代码块");
}
public Demo3(){
System.out.println("构造方法");
}
public static void main(String[] args) {
System.out.println("Demo3主方法");
new Demo3();
new Demo3();
}
/*
* 运行结果:
* 静态代码块
* Demo3主方法
* 普通构造代码块
* 构造方法
* 普通构造代码块
* 构造方法
*/
}