【Java学习笔记之十七】Java中普通代码块,构造代码块,静态代码块区别及代码示例分析...

本文详细解析了Java中不同类型的代码块(如静态代码块、构造代码块和普通代码块)的执行顺序及特点。介绍了它们在类加载和对象创建过程中的作用,并通过示例代码展示了实际执行流程。

//执行顺序:(优先级从高到低。)静态代码块>mian方法>构造代码块>构造方法。

其中静态代码块只执行一次。构造代码块在每次创建对象是都会执行。

1 普通代码块

 1 //普通代码块:在方法或语句中出现的{}就称为普通代码块。普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”
 2 public class CodeBlock01{
 3       public static void main(String[] args){
 4           
 5             {
 6               int x=3;
 7               System.out.println("1,普通代码块内的变量x="+x);    
 8             }
 9             
10             int x=1;
11             System.out.println("主方法内的变量x="+x);
12             
13             {
14                int y=7;
15                System.out.println("2,普通代码块内的变量y="+y);    
16             }
17           }
18     }
19     
20     /*
21     运行结果:
22     1,普通代码块内的变量x=3
23          主方法内的变量x=1
24          2,普通代码块内的变量y=7
25     */

2 构造代码块

 1 //构造块:直接在类中定义且没有加static关键字的代码块称为{}构造代码块。构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。
 2 
 3 public class CodeBlock02{
 4     {
 5       System.out.println("第一代码块");    
 6     }
 7     
 8     public CodeBlock02(){
 9         System.out.println("构造方法");
10         }
11         
12         {
13           System.out.println("第二构造块");
14         }
15       public static void main(String[] args){
16           new CodeBlock02();
17           new CodeBlock02();
18           new CodeBlock02();
19            
20     }
21 }    
22 
23 /*
24 *
25 执行结果:
26 第一代码块
27 第二构造块
28 构造方法
29 第一代码块
30 第二构造块
31 构造方法
32 第一代码块
33 第二构造块
34 构造方法
35 */

3 静态代码块

 1 //静态代码块:在java中使用static关键字声明的代码块。静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。
 2 //如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行"。
 3 //注意:1 静态代码块不能存在于任何方法体内。2 静态代码块不能直接访问静态实例变量和实例方法,需要通过类的实例对象来访问。
 4 
 5 
 6 class Code{
 7     {
 8       System.out.println("Code的构造块");
 9     }
10     
11     static{
12         System.out.println("Code的静态代码块");
13         }
14         
15     public Code(){
16         System.out.println("Code的构造方法");
17         }
18     }
19     
20     
21 public class CodeBlock03{
22      {
23       System.out.println("CodeBlock03的构造块");    
24      }
25      
26      static{
27         System.out.println("CodeBlock03的静态代码块");
28         }
29         
30         public CodeBlock03(){
31              System.out.println("CodeBlock03的构造方法");
32             }
33         
34       public static void main(String[] args){
35             System.out.println("CodeBlock03的主方法");
36             new Code();
37             new Code();
38             new CodeBlock03();
39             new CodeBlock03();
40           }
41     }
42 /*
43 CodeBlock03的静态代码块
44 CodeBlock03的主方法
45 Code的静态代码块
46 Code的构造块
47 Code的构造方法
48 Code的构造块
49 Code的构造方法
50 CodeBlock03的构造块
51 CodeBlock03的构造方法
52 CodeBlock03的构造块
53 CodeBlock03的构造方法
54 */

 

<think>好的,我现在需要帮助用户获取关于Kotlin中单例模式的详细学习笔记代码示例,特别是针对初学者的指南。首先,我得回顾一下单例模式的基本概念,确保自己理解正确。单例模式是一种设计模式,确保一个类只有一个实例,并提供全局访问点。这在需要频繁创建和销毁对象,或者控制资源共用时非常有用,比如数据库连接、日志记录器等。 接下来,我需要考虑Kotlin中实现单例的方式。因为Kotlin有一些特有的语法特性,比如object关键字,这可能是实现单例的关键。用户是初学者,所以需要从基础开始,逐步解释,避免使用过于复杂的术语。 首先,我应该介绍Kotlin中的object声明。在Java中,实现单例通常需要私有构造函数、静态实例和双重检查锁定等,但Kotlin的object关键字简化了这一点。例如,使用object Singleton就可以直接创建一个单例类。需要说明这是饿汉式单例,即在类加载时就创建实例,这样可能影响启动性能,但保证线程安全。 然后,可能需要提到懒加载的情况。Kotlin的延迟初始化属性by lazy可以实现懒汉式单例。这里需要注意lazy的线程安全模式,默认是LazyThreadSafetyMode.SYNCHRONIZED,也就是线程安全的。但用户可能想知道如何实现非线程安全的懒加载,或者双重检查锁定,这时候可能需要展示对应的代码示例。 另外,用户可能关心单例模式的应用场景,比如在Android开发中,比如管理数据库连接、SharedPreferences或者Retrofit实例等。结合用户提供的引用中提到的天气项目例子,可以举例说明单例模式如何用于网络请求或数据缓存,这样更贴近实际应用。 还要注意代码示例的正确性。比如,使用object时,不需要构造函数,直接通过Singleton访问实例。而使用伴生对象和lazy时,需要确保私有化构造函数,避免外部实例化。此外,双重检查锁定的实现需要用到@Volatile注解和同步块,这在Kotlin中如何简化表达也需要说明。 可能还需要对比不同实现方式的优缺点,比如饿汉式vs懒汉式,线程安全性的保证,性能影响等。这样帮助初学者理解在不同场景下如何选择适合的实现方式。 此外,用户提供的引用中有提到Kotlin的简洁性和安全性,比如避免空指针异常。在单例模式中,如何利用Kotlin的特性来避免常见错误,比如直接使用object保证实例不为null,这也是需要强调的点。 最后,生成的相关问题需要覆盖单例模式的不同方面,比如线程安全、应用场景、与Java实现的对比、优缺点以及如何防止反射攻击等。这些问题能帮助用户进一步深入学习和理解单例模式。 现在需要组织这些内容,确保结构清晰,分点说明,代码示例正确,并且符合用户要求的格式,比如行内公式使用$...$,独立公式用$$...$$,虽然在这个问题中可能用不到数学公式,但其他格式要求如中文回答、引用标识等需要注意。同时,要检查引用是否正确,用户提供的引用中有提到Kotlin的简洁和安全,以及一个天气项目的例子,可以在适当的地方引用,比如在应用场景部分提到数据库操作或网络请求时引用[^1]。 总结步骤: 1. 介绍单例模式的定义和用途 2. Kotlin中的object实现饿汉式单例 3. 使用lazy实现懒汉式单例 4. 双重检查锁定实现线程安全的懒加载 5. 应用场景举例,结合引用中的项目 6. 不同实现方式的对比和优缺点 7. 注意事项,如防止反射和反序列化 8. 生成相关问题 需要确保代码示例正确,语法正确,注释清晰。同时,语言要简洁易懂,适合初学者。</think># Kotlin单例模式学习指南 ## 一、单例模式概念 单例模式确保一个类**只有一个实例**,并提供全局访问点。适用于需共享资源的场景,如数据库连接、日志记录器等[^1]。 ## 二、Kotlin实现方式 ### 1. 饿汉式单例(线程安全) 直接使用`object`声明实现: ```kotlin object Singleton { fun showMessage() = println("单例对象方法") } // 使用 Singleton.showMessage() ``` - 特点:类加载时立即初始化 - 优点:绝对线程安全 - 缺点:可能增加启动时间 ### 2. 懒汉式单例(线程安全) 通过`by lazy`实现延迟初始化: ```kotlin class LazySingleton private constructor() { companion object { val instance: LazySingleton by lazy { LazySingleton() } } } // 使用 LazySingleton.instance ``` - 特点:首次访问时初始化 - 模式参数: ```kotlin by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { ... } // 默认线程安全 by lazy(LazyThreadSafetyMode.NONE) { ... } // 非线程安全 ``` ### 3. 双重检查锁定(Double-Checked Locking) ```kotlin class DCLSingleton private constructor() { companion object { @Volatile private var instance: DCLSingleton? = null fun getInstance(): DCLSingleton = instance ?: synchronized(this) { instance ?: DCLSingleton().also { instance = it } } } } ``` - 特点:减少同步代码块执行次数 - 优势:高效线程安全 ## 三、应用场景示例 1. 网络请求客户端管理 2. 数据库访问对象(DAO) 3. 全局配置管理 4. 日志记录器(如引用[^1]天气项目中的日志模块) ## 四、实现方式对比 | 实现方式 | 线程安全 | 延迟加载 | 性能 | |----------------|---------|---------|--------| | object声明 | ✔️ | ❌ | 高 | | lazy属性 | ✔️ | ✔️ | 中 | | 双重检查锁定 | ✔️ | ✔️ | 高 | ## 五、注意事项 1. 防止反射攻击:Kotlin的`object`类构造器私有化 2. 序列化安全:需实现`readResolve()`方法 3. 内存泄漏:避免持有Activity/Fragment等短生命周期对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值