Java_OOP-高级篇3(单例模式,final关键字)

单例模式

什么是设计模式?

  1. 对静态属性和方法的经典使用
  2. 在大量实践中总结的优质代码结构和风格,以及问题的思考方式

什么是单例模式?

采取方法保证在整个软件系统中,某一个类只能有一个实例对象,并且该类只提供一个取得对象实例的方法

单例模式的两种方式:

实现步骤:

  • 构造器私有化
  • 类内部创建对象
  • 向外暴露一个静态的公共方法(getInstance)

【单例模式-饿汉式】

无论是否使用对象,都会创建;不使用对象时可能造成资源浪费。

package com.java_learn.oop_advanced.singular_;

public class HungryMan {
    public static void main(String[] args) {
        /**
         * 单例设计模式-饿汉式
         */
        Girlfriend g1 = Girlfriend.getInstance();
        Girlfriend g2 = Girlfriend.getInstance()
        System.out.println(g1==g2);//T
    }
}
class Girlfriend{
    /**
     * 1.私有化构造器
     * 2.在类内部创建对象
     * 3。暴露一个静态的公共方法
     */
    private String name;

    private Girlfriend(String name) {
        this.name = name;
    }
    private static Girlfriend gf=new Girlfriend("OG");
    public static Girlfriend getInstance(){
        return gf;
    }

    @Override
    public String toString() {
        return "Girlfriend{" +
                "name='" + name + '\'' +
                '}';
    }
}

【单例模式-懒汉式】

类加载时并不会创建对象,使用时才创建

package com.java_learn.oop_advanced.singular_;

public class LazyMan {
    public static void main(String[] args) {
        Pig p1=Pig.getInstance();
        Pig p2=Pig.getInstance();
        System.out.println(p1==p2);
    }
}
class Pig{
    private String name;

    private Pig(String name) {
        this.name = name;
    }
    private static Pig peiqi;
    public static Pig getInstance(){//🚩主要区别
        if(peiqi == null){
            peiqi=new Pig("佩奇");
        }
        return peiqi;
    }

    @Override
    public String toString() {
        return "Pig{" +
                "name='" + name + '\'' +
                '}';
    }
}

饿汉式 VS 懒汉式

  • 最主要区别:饿汉式类加载时创建对象,懒汉式使用时才创建对象

  • 饿汉式不存在线程安全,懒汉式存在线程安全

  • 饿汉式当没有使用对象时会产生资源浪费


final关键字

基本介绍

  1. 可以修饰类、属性、方法、局部变量
  2. 不希望类被继承时,可以使用final修饰该类;final class S{}
  3. 不希望父类某个方法被重写时,用final修饰该方法;public final int gets(){}
  4. 不希望属性被修改;public final String name
  5. 不希望局部变量被修改

细节与注意

  1. final修饰的属性又叫常量;用形式为:XX_XX_XX命名
  2. final修饰的属性定义时,必须赋值;且以后不可修改,有如下位置可赋值:
    • 定义时
    • 构造器
    • 代码块
  3. final修饰的属性时静态的public static final int TAX_RADE),位置只能是:
    • 定义时
    • 静态代码块,🚩不能在构造器中
  4. 被final修饰的类不能被继承,但是可以实例化
  5. 若类中有方法被final修饰,方法不可重写,但是类可继承
  6. 若类被final修饰,其方法不必使用final
  7. final不允许修饰构造器
  8. final和static搭配使用效率高;不会导致类加载
  9. 包装类(String,Boolean,Integer,Double)都是final修饰
posted @   Chair-0u98  阅读(25)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示