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



目录
相关文章
|
关系型数据库 MySQL PHP
LAMP架构及搭建LAMP+Discuz论坛
LAMP架构及搭建LAMP+Discuz论坛
605 0
|
存储 机器学习/深度学习 算法
Adam-mini:内存占用减半,性能更优的深度学习优化器
论文提出一种新的优化器Adam-mini,在不牺牲性能的情况下减少Adam优化器的内存占用。
434 10
Adam-mini:内存占用减半,性能更优的深度学习优化器
|
域名解析 SQL 前端开发
如何使用CMS来搭建一个网站?
在如今的时代,拥有一个网站成为每一家企业展现形象、拓展业务、传递信息的重要途径。网站在互联网上吸引潜在客户、合作伙伴。对于大多数希望自行建设网站的企业来说,内容管理系统(CMS)成为了理想选择。
435 8
|
10月前
|
DataWorks 数据可视化 搜索推荐
DataWorks产品深度评测:优势与展望
在数字化时代,数据成为企业决策和创新的关键驱动力。DataWorks作为一款大数据开发治理平台,展现了强大的功能和潜力。本文从用户画像分析实践、实际工作中的作用、产品体验评测、与其他工具对比等多个维度,全面评测了DataWorks,旨在为潜在用户提供深入且实用的参考。评测内容涵盖任务开发便捷性、性能表现、价格策略、社区建设等方面,突显了DataWorks的优势和改进空间。
|
应用服务中间件
2022年最新最详细在IDEA中配置Tomcat(含有详细图解过程)、建立使用IEDA建立一个Web项目的案例
这篇文章提供了在IntelliJ IDEA中配置Tomcat服务器的详细步骤,包括添加Tomcat Server、选择安装路径、添加项目Artifact,以及创建和展示Web项目的流程。
|
Android开发
Android 数据传递的几种方式,HttpLoggingInterceptor消息拦截器
Android 数据传递的几种方式,HttpLoggingInterceptor消息拦截器
|
域名解析 Kubernetes Linux
Kubernetes 外部 HTTP 请求到达 Pod 容器的全过程
Kubernetes 外部 HTTP 请求到达 Pod 容器的全过程
533 4
|
SQL Java 关系型数据库
flink问题之使用debezium-json format报错如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
268 0
|
存储 应用服务中间件 API
Oauth 2 授权码模式
Oauth 2 授权码模式
473 1
|
JavaScript 安全 前端开发
跨越跨域限制,掌握 Axios 的跨域解决策略
跨域是指访问另外一个域的资源,由于浏览器的同源策略,默认情况下使用 XMLHttpRequest 和 Fetch 请求时是不允许跨域的。跨域的根本原因是浏览器的同源策略,这是由浏览器对 JavaScript 施加的安全限制。