乐趣区

关于java:JAVA基础static关键字及单例设计模式

static 关键字

基本概念

  • 应用 static 关键字润饰成员变量示意 动态 的含意, 此时成员变量 <u> 由对象层级晋升为类层级 </u>, 也就是整个类只有一份并被所有对象共享. 该成员变量 <u> 随着类的加载准备就绪 </u>, 与是否创建对象无关
  • static关键字润饰的成员能够应用援用. 的形式拜访, 但举荐 类名.的形式

应用形式

  • 在非动态成员办法中, 既能拜访非动态的成员又能拜访动态的成员
    (成员: 成员变量 + 成员办法. 动态成员被所有对象共享)
  • 在动态成员办法中, 只能拜访动态成员不能拜访非动态成员
    (成员: 成员变量 + 成员办法. 因为此时可能还没有创建对象)
  • 在当前的开发中, 只有附属类层级并被所有对象共享的内容才能够应用 static 关键字润饰(不能滥用 static 关键字)

结构块和动态代码块

  • 结构块 : 在类体中间接应用{} 括起来的代码块
  • 每创立一个对象都会执行一次结构块
  • 动态代码块 : 应用static 关键字润饰的结构块
  • 动态代码块随着类加载时执行一次

案例题目

编程实现 Singleton 类的封装
编程实现 SingletonTest 类对 Singleton 类进行测试, 要求 main 办法中能失去且只能失去该类的一个对象

public class Singleton {

    // 2. 申明本类类型的援用, 指向本类类型对象
    // 在类中创立好对象, 而后送到类外
    /* 只看等号右边, 就相当于是类的成员变量, 且该成员变量附属对象层级
    // 若类外想要拜访这个变量, 就须要应用对象 也就是 < 援用. 成员变量 > 的形式
    // 然而当初类外是无奈创建对象的, 所以就须要将该成员变量晋升为类层级的
    //Singleton sin = new Singleton();
    */
    // 为了避免 Singleton sin = null 使援用变量有效, 所以私有化, 类外就不能间接拜访
    // 应用 private static 独特润饰
    private static Singleton sin = new Singleton();
    
    // 1. 私有化构造方法, 应用 private 关键字润饰
    private Singleton() {}
    
    // 3. 提供私有的 get 办法负责将对象返回
    // 应用 static 关键字润饰, 将该办法晋升为类层级
    public static Singleton getInstance(){ // 通过该办法能失去且只能失去这个类的一个对象
        return sin;
    }
    
    /**
     * 本人写了构造方法 , 就不会再调用零碎默认的构造方法
     * 因为私有化构造方法后, 类外就一个对象都不能创立
     * 
     */
}

接下来创立 SingletonTest 类进行测试


public class SingletonTest{public static void main(String[] args) {

        // 申明 Singleton 类型的援用, 指向 Singleton 类型的对象
        // 类名 援用变量名 = new 类名();
        // Singleton st1 = new Singleton();
        // Singleton st2 = new Singleton();
        // System.out.println(st1 == st2); // false

        /**
         * 只有能够调用构造方法, 就惋惜创立一个新对象, 也就不满足题目中的“失去且只能失去一个对象”的要求
         * 所以将构造方法私有化后, 在类外就不能应用, 也就是不能应用 new 办法创建对象
         */
        // Singleton st1 = Singleton.sin; // Singleton.sin 就是类内创立的对象
        // Singleton.sin = null; // 使得援用变量有效
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        System.out.println(s1 == s2); // true

        /**
         * 无论.getInstance()调用多少次, 都指向类内同一个创建对象的语句, 所以也就是只一个对象
         * 另, 类内创建对象的语句是类层级, 是随类的创立而加载, 所以只有这个类整体只运行一次, 那么也就只创立一个对象
         */
        
    }
}

单例设计模式

概念

在某些非凡场合中, 一个类 <u> 对外提供且只提供一个对象 </u> 时, 这样的类叫做 单例类 . 而设计单例的流程和思维叫做 单例设计模式

实现流程

  • 私有化构造方法, 应用 private 关键字润饰
  • 申明本类类型的援用指向本类类型的对象, 并应用 private static 关键字独特润饰
  • 提供私有的 get 办法负责将对象返回出动, 并应用 public static 关键字独特润饰
退出移动版