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修饰
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值