JavaSE——面向对象高级一(2/4)-饿汉式单例、懒汉式单例、代码块、static的注意事项

简介: JavaSE——面向对象高级一(2/4)-饿汉式单例、懒汉式单例、代码块、static的注意事项

static的注意事项

  • 类方法中可以直接访问类的成员,不可以直接访问实例成员。
public class Student{
    //定义一个类变量和一个实例变量
    static String schoolName;
    int score;
 
    //定义一个类方法和一个实例方法
    public static void printHello(){
 
    }
 
    public void printPass(){
 
    }
    
    public static void printHelloWorld(){
        //注意:这里是在同一个类中,访问类成员可以省略类名        
        //可以访问类变量
        schoolName = "**大学";
        //同样也可以访问类方法
        printHello();
 
        //而在类方法中访问实例成员的话,会报错
        System.out.println(score);  //报错
        printPass();  //报错
    }
}
 
  • 实例方法中既可以直接访问类成员,也可以直接访问实例成员。
public class Student{
    //定义一个类变量和一个实例变量
    static String schoolName;
    int score;
 
    public void printPass(){
        schoolName = "**大学";
        System.out.println(score);  //都可以执行
    }
}
 
  • 实例方法中可以出现this关键字,类方法中不可以出现this关键字的。
public class Student{
    
    public static void printHelloWorld(){
        //因为类方法中是在类中执行的,而this要取到当前对象的地址,类方法中并没有对象
        System.out.println(this); //会报错
 
    }
 
    public void printPass(){
 
        System.out.println(this); //可以执行
    }
 
}
 

static相关:代码块

代码块概述

  • 代码块是类的5大成分之一(成员变量、构造器、方法、代码块、内部类)。

代码块分为两种

  • 静态代码块

格式:static{}

特点:加载时自动执行,由于类只会加载一次,所以静态代码块也只会执行一次。

作用:完成类的初始化,例如:对类变量的初始化赋值(无意义),实际上多用来起到日志的作用。

例如:

定义一个学生类

public class Student{
    static int number = 100;
    //静态代码块
    static{
        System.out.println("静态代码块执行了");
    }
}

多次调用学生类,它会优先执行静态代码块,但只会执行一次

public class Test{
    public static void main(String[] args){
        System.out.println(Student.number);
        System.out.println(Student.number);
        System.out.println(Student.number);
    }
}

所以最终输出结果为:

静态代码块执行了

100

100

100

  • 实例代码块

格式:{}

特点:每次创建对象时,执行实例代码块,并在构造器前执行。

作用:和构造器一样,都是用来完成对象的初始化的,例如:对实例变量进行初始化赋值。

单例设计模式

学习单例设计模式之前,我们先了解一下什么是设计模式:

  • 一个问题通常有n种解法,其中肯定有一种解法是最优的,这个最优的解法被人总结出来了,称之为设计模式
  • 设计模式有20多种,对应20多种软件开发中会遇到的问题。

关于设计模式的学习,主要掌握两点:

  1. 解决什么问题?
  2. 怎么写?

而单例设计模式就是设计模式中的一种。

我们知道一个类可以new出很多对象,但对于某个应用场景下,我们希望这个类只能有一个对象,这就是单例设计模式所解决的问题。

  • 单例设计模式:确保一个类只有一个对象。

写法

  • 把类的构造器私有。
  • 定义一个类变量记住类的一个对象。
  • 定义一个类方法,返回对象。
//单例类
public class A{
    //1.私有构造器
    private A(){
 
    }
    
    //2.定义一个类变量记住类的一个对象
    private static A a = new A();
 
    //3.定义一个类方法返回对象
    public static A getObject(){
        return a;
    }
}

单例设计模式的应用场景

例如:任务管理器,只需要一个任务管理器就可以管理他们了,使用单例模式可以避免浪费内存。

饿汉式单例

单例设计模式的实现方式有很多,我们刚刚写的就属于饿汉式单例,也就是:

  • 返回对象时,对象已经创建好了。

下面介绍第二种单例设计模式

懒汉式单例

  • 拿对象时,才开始创建对象(延迟加载对象)。

写法

  • 把类的构造器私有。
  • 定义一个类变量用于存储对象。
  • 提供一个类方法,保证返回的是同一个对象。
public class B{
    //1.把类的构造器私有
    private B(){
 
    }
    
    //2.定义一个类变量,用于存储这个类的一个对象。
    private static B b; //注意:这里与饿汉式单例的区别就在于没有先new一个对象出来
 
    //3.定义一个类方法,保证第一次调用时才创建一个对象,后面调用时不创建对象
    public static B getInstance(){
        if(b == null){
            b = new B();
        }
        return b;
    }
}


什么时候用饿汉式单例?什么时候用懒汉式单例呢?

当需要频繁用到这个单例设计模式的时候可以用饿汉式单例先把对象创建出来,而对于不频繁使用的则可以用懒汉式单例,会稍微节省一些内存。


END



目录
相关文章
|
6月前
|
设计模式 Java
26、Java 简单实现单例设计模式(饿汉式和懒汉式)
26、Java 简单实现单例设计模式(饿汉式和懒汉式)
55 2
|
设计模式 存储 安全
八种创建单例模式的方式-懒汉式与饿汉式及枚举
八种创建单例模式的方式-懒汉式与饿汉式及枚举
121 2
|
设计模式 存储
static应用之 单例设计模式(饿汉单例&懒汉单例)
本章我们来学习单例模式中的饿汉单例和懒汉单例,那么什么是单例模式呢?应用该模式的这个类永远只有一个实列,即一个类只能创建一个对象例如电脑上的任务管理器对象只需要一个就能解决问题,可以节省内存空间先定义一个类,把构造器私有如下图,先来看一下没有把构造器私有化的SingleInstance类,此时Test类中可以随意创建多个SingleInstance的实例化。 在SingleInstance类中用private修饰无参构造器,此时左边new方法报错了。我们在右边创建一个静态变量来存储对象,变量名为instan
60 0
|
设计模式 Java
Java反射(Class、反射实例化、反射与单例、获取类结构)附带相关面试题
1.了解反射,2.Class类的三种实例化方法,3.反射机制与对象实例化,4.反射与单例设计模式,5.通过反射获取类结构的信息
301 0
|
3月前
|
Java
【多线程面试题十五】、synchronized可以修饰静态方法和静态代码块吗?
这篇文章讨论了Java中的`synchronized`关键字是否可以修饰静态方法和静态代码块,指出`synchronized`可以修饰静态方法,创建一个类全局锁,但不能修饰静态代码块。
|
6月前
|
设计模式 安全 Java
【单例模式】饿汉式,懒汉式?JAVA如何实现单例?线程安全吗?
【单例模式】饿汉式,懒汉式?JAVA如何实现单例?线程安全吗?
62 0
|
SQL 缓存 安全
Java枚举单例模式比DCL和静态单例要好?———反编译分析单例枚举类
枚举单例模式比DCL和静态单例模式要好?为什么好呢?本文带你一探究竟!
115 0
Java枚举单例模式比DCL和静态单例要好?———反编译分析单例枚举类
|
设计模式 Java 应用服务中间件
不是单例的单例——巧用ClassLoader
本文通过如何将一个单例类实例化两次的案例,用代码实践来引入 Java 类加载器相关的概念与工作机制。理解并熟练掌握相关知识之后可以扩宽解决问题的思路,另辟蹊径,达到目的。
5788 1
|
SQL Java
解决单例模式中懒汉式不支持高并发,饿汉式不支持懒加载问题最简单方法——基于枚举类型的单例实现
解决单例模式中懒汉式不支持高并发,饿汉式不支持懒加载问题最简单方法——基于枚举类型的单例实现
163 0
解决单例模式中懒汉式不支持高并发,饿汉式不支持懒加载问题最简单方法——基于枚举类型的单例实现
|
设计模式 Java
第26篇:Java 简单实现单例设计模式(饿汉式和懒汉式)
📖 ① 构造方法私有化(不让别人有创建该类实例的权利) 📖 ② 在类的内部创建该类的唯一对象(该类实例只能有一个,且在该类中由自己创建) 📖 ③ 向外暴露一个公共的静态方法(以返回该类的唯一对象)(通过public static 静态方法向外界返回唯一的该类的对象)
122 0
第26篇:Java 简单实现单例设计模式(饿汉式和懒汉式)