Java入门:08.Java中的static关键字02(拓展:单例模式)

1.3 对象代码段和静态代码段

什么是代码段?

  • 就是个{} 里面包含一堆代码

  • 代码段可以写在方法中 , 也可以写在方法外

  • 代码段可以方法中和方法外独立存在,也可以配合着 分支结构和循环结构存在

    class A{
        {
            .....
        }
        public void t1(){
            {
                .....
            }
        }
        
        public void t2(){
            if(){
                System.out.println()
                System.out.println()
                System.out.println()
                System.out.println()
            }
            while(){}
        }
        
    }

方法外的代码端

  • 写在方法外,但要写在类里。

  • 可以是普通的代码段,也可以是增加了static关键字修饰的代码段

  • 前者就称为对象代码段(普通代码段), 后者称为静态代码段

  • 对象代码段,在创建对象时,自动执行,每个对象的创建仅执行一次。

    如果创建多个对象,这个代码段就会被执行多次。

  • 静态代码段,在类加载时,自动执行,且仅执行一次

    class A{
        {
            ...
        }
        
        static{
            ...
        }
    }

扩展

java类在编译时,会自动的提供两种初始化方法

  1. 对象的初始化方法 。 其内容来自于构造方法和对象代码段, 如果有构造方法重载的,就会有多个对象初始化方法

  2. 类的初始化方法。没有专门的对应的方法,方法的内容就是静态代码段的内容。

Java入门:08.Java中的static关键字02(拓展:单例模式)_第1张图片

2 单例模式

单例模式是一种设计模式

什么是设计模式?

  • 是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结

设计模式主要分为3大类

  • 创建型 : 如何创建对象 , 例如单例模式,如何只创建一个对象。

  • 结构型 : 设计不同的执行结构,适合不同的执行场景。 暂不解释。

  • 行为型 : 与具体的行为操作有关,例如策略模式,如何根据不同的策略完成功能。

单例模式特点

  • 确保在jvm内存中,或在程序执行的过程中,某一个类只会产生一个对象。

  • 重点在于是否能想明白 为什么只需要对象创建一次,而不在于如何实现对象只创建一次。

单例模式的实现

  1. 需要构造方法私有化。 不再使用public修饰构造方法,改用private修饰构造方法

    private修饰的方法或者属性只有类自己可以使用。外部类不能使用。

  2. 定义一个属性,来存储类自身创建的对象

    类自身只创建一次

  3. 提供一个方法,外部使用者可以通过调用这个方法,获得刚刚存入属性中的那个对象

    class D{
        
        private D(){}
    ​
        static D d = new D();
    ​
        public static D getD(){
            return d ;
        }
        //-----------------------
        //属性
        //方法
    }
    • 由于外部类调用这个方法的时候,还没拥有D对象, 所以只能通过类调用这个方法。

      所以这个方法应该是static方法

    • static方法中不能直接使用非静态的属性,

      所以d属性应该也是静态的

注意:

单例模式的设计与类对象应该具备哪些属性和方法无关。

扩展:懒汉式和饿汉式

  • 饿汉式的单例模式:在类加载时就完成对象的创建,并将其存入属性变量

    特点:空间换时间

    class D{
        
        private D(){}
    ​
        static D d = new D();
    ​
        public static D getD(){
            return d ;
        }
    }

  • 懒汉式的单例模式:在类加载时先不创建对象, 第一次请求对象时再创建对象

    特点:时间换空间

    class D{
        
        private D(){}
    ​
        static D d ;
    ​
        public static D getD(){
            if(d == null){
                //还没有创建呢
                d = new D();
            }
            return d ;
        }
    }

你可能感兴趣的:(java,单例模式,开发语言)