代码块解析

本文深入解析Java中的四种代码块:普通代码块、构造块、静态代码块和同步代码块,阐述各自的概念、作用及执行时机,帮助理解Java类的加载和实例化过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、分类

根据代码块出现的位置以及关键字,分为四个代码块

1、普通代码块

2、构造块

3、静态代码快

      I、 非主类的中的静态代码块

      II、主类中的静态代码块

4、同步代码块

二、概念

1、普通代码块:定义在方法中的代码块

/*
public class Test{
     public static void main(String[] args) {
         
        int a = 0;
        {
            int b = 0;
        }
     }
 }
*/
/*
 public class Test{
     public static void main(String[] args) {
        {
            int a = 0;  //这个变量在出这个普通方法块后,无效
        }
         int a = 0;  //因此a没有重复定义
     }
 }
*/

public class Test{
     public static void main(String[] args) {
        int a = 0; //a在整个方法中有效
        {
            int a = 0;//错误,已在main方法中定义了a变量
        }
        
     }
 }

2、构造块

      定义在类中的代码块(不加任何修饰符),在对象产生时,优先于构造方法执行,有几个对象,就调用几次构造方法

      用于在构造方法执行前完成一些属性的初始化操作

 public class Test{
    //构造块
    {
        System.out.println("构造块");
    }
    public static void main(String[] args) {
        //没有对象创建时,不执行,没有输出
        //创建对象后执行
        new Test(); //输出:构造块
    }
 }

3、静态代码块:(用于给静态区初始化)

      I、非主类中的静态代码块

class A{
    static {
        System.out.println("非主类的静态块")
    }
}
public class Test{
    public static void main(String[] args) {
        
    }
 }

           在类加载时执行(类使用的时候),优先于构造块执行,无论有多少对象产生,都只调用一次

      II、主类中的静态代码块

class A{
    static {
        System.out.println("非主类的静态块")
    }
}
public class Test{
    static {
        System.out.println("主类的静态块")
    }
    public static void main(String[] args) {
        
    }
 }

执行过程:

           非主类中的静态代码块,在类加载时执行(类使用的时候),优先于构造块执行,无论有多少对象产生,都只调用一次

class A{
    {
        System.out.println("1.非主类的构造块"); //只调用一次
    }
    static {
        System.out.println("2.非主类的静态块");
    }
}
public class Test{
    public static void main(String[] args) {
        new A();
        new A();
        new A();
    }
 }
/*输出结果:
2.非主类的静态块
1.非主类的构造块
1.非主类的构造块
1.非主类的构造块
*/

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

public class Test{
    static {
        System.out.println("1.主类的静态块");
    }
    public static void main(String[] args) {
        System.out.println("2.主方法");
    }
 }
 //输出结果:
 //1.主类的静态块
 //2.主方法

4、同步代码块(多线程部分)

在多线程中为解决同一时刻多个线程同时访问共享资源是产生的问题,提出了锁的机制,而被锁住的代码块就称为同步代码块。

同步代码块同时只能被一个线程所访问,从而保证了线程的互斥访问

synchronized(this) { // 表示为程序逻辑上锁
if(this.ticket>0) { // 还有票
try {
Thread.sleep(20);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // 模拟网络延迟
System.out.println(Thread.currentThread().getName()+",还有" +this.ticket --
+" 张票");
}
}

 

1、综合构造块和静态块

public class B extends A{
    public B(){
        System.out.println("4.B方法的构造方法");
    }
    {
        System.out.println("5.B方法的构造块");
    }
    static {
        System.out.println("6.B方法的静态块");
    }
    public static void main(String[] args){
        System.out.println("7.start-----------");
        new B();
        new B();
        System.out.println("8.end-------------");
    }
}

输出结果:

6.B方法的静态块
7.start-----------
A
5.B方法的构造块
4.B方法的构造方法
A
5.B方法的构造块
4.B方法的构造方法
8.end-------------

 

2、内部类的静态块和构造块

public class Test3{
    static class Test{
        public Test(){
            System.out.println("1.内部类的构造方法");
        }
        {
            System.out.println("2.内部类的构造块");
        }
        static {
            System.out.println("3.内部类的静态块");
        }
    }
    static{
        System.out.println("4.主类中的静态块");
    }
    public static void main(String[] args){
        System.out.println("5.start----------");
        new Test();
        new Test();
        System.out.println("6.end------------");
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值