如何理解:普通代码块、构造块、静态块?有什么关系?

  免费查看本文章可前往我的网站PiQiu

目录

普通代码块(本地代码块)

构造块(实例代码块)

静态块(静态代码块)

他们之间有什么关系呢?

例子:

分析:



普通代码块(本地代码块)

        定义在方法里面用{ }括起来的代码块(凡是用{ }括起来都叫代码块,只是没有细分),就是普通代码块,也叫本地代码块 。(不多见,也不常用)

例如:

public class Test {
    public static void main(String[] args){
        
        {
            System.out.println("本地代码块!");    
        }
        
    }
}

构造块(实例代码块)

        实例代码块定义在类的内部,方法的外部,可以初始化实例的成员

例如:


                
静态代码块、非静态代码块普通代码块Java 中存在显著区别,以下从定义、执行时机、执行次数、作用、使用位置和访问权限等方面进行详细阐述: ### 定义 - **静态代码块**:使用 `static` 修饰的代码块,主要用于类的静态初始化,随着类的加载而加载,且只执行一次[^1][^3][^4]。 ```java public class StaticBlockExample { static { System.out.println("静态代码块执行"); } } ``` - **非静态代码块**:没有 `static` 修饰的代码块,也叫实例代码块,在创建对象时执行,每次创建对象都会执行一次,用于对象的初始化操作[^1][^2][^4]。 ```java public class NonStaticBlockExample { { System.out.println("非静态代码块执行"); } } ``` - **普通代码块**:直接使用 `{}` 定义的代码块,用于限定变量的作用域,在方法内部使用,当方法被调用时执行[^2]。 ```java public class NormalBlockExample { public static void main(String[] args) { { int localVar = 10; System.out.println("普通代码块中的局部变量: " + localVar); } } } ``` ### 执行时机 - **静态代码块**:在类加载时执行,先于非静态代码块和构造方法执行。 - **非静态代码块**:在创建对象时,在构造方法之前执行。 - **普通代码块**:在包含它的方法被调用时,按顺序执行到该代码块时执行。 ### 执行次数 - **静态代码块**:类加载时执行一次,无论创建多少个对象。 - **非静态代码块**:每次创建对象时都会执行。 - **普通代码块**:每次调用包含它的方法时都会执行。 ### 作用 - **静态代码块**:用于初始化类的静态成员,如静态变量的赋值等。 ```java public class StaticInitialization { static int staticVar; static { staticVar = 100; } } ``` - **非静态代码块**:用于初始化对象的实例成员,可提取构造方法中的重复代码。 ```java public class NonStaticInitialization { int instanceVar; { instanceVar = 50; } } ``` - **普通代码块**:主要用于限定变量的作用域,使变量在代码块外部不可访问。 ```java public class ScopeLimitation { public static void main(String[] args) { { int limitedVar = 20; } // 下面的代码会报错,因为 limitedVar 作用域仅限于代码块内部 // System.out.println(limitedVar); } } ``` ### 使用位置 - **静态代码块**:在类中,方法外部。 - **非静态代码块**:在类中,方法外部。 - **普通代码块**:在方法内部。 ### 访问权限 - **静态代码块**:只能访问静态成员,不能访问非静态成员。 ```java public class StaticAccess { static int staticField = 1; int nonStaticField = 2; static { // 可以访问静态成员 System.out.println(staticField); // 下面的代码会报错,不能访问非静态成员 // System.out.println(nonStaticField); } } ``` - **非静态代码块**:可以访问静态成员和非静态成员。 ```java public class NonStaticAccess { static int staticField = 1; int nonStaticField = 2; { // 可以访问静态成员 System.out.println(staticField); // 可以访问非静态成员 System.out.println(nonStaticField); } } ``` - **普通代码块**:可以访问方法内的局部变量、类的静态成员和非静态成员(如果在实例方法中)。 ```java public class NormalBlockAccess { static int staticField = 1; int nonStaticField = 2; public void instanceMethod() { int localVar = 3; { // 可以访问局部变量 System.out.println(localVar); // 可以访问静态成员 System.out.println(staticField); // 可以访问非静态成员 System.out.println(nonStaticField); } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈亦康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值