Java零基础也看得懂的单例模式与final及抽象类和接口详解

Java零基础也看得懂的单例模式

什么是单例模式?

在设计模式中,单例模式是一种经典的、创建型的设计模式,其目的是确保一个类仅有一个实例,并提供一个全局访问点。

为什么需要单例模式?

在某些情况下,我们需要确保一个类仅有一个实例,例如数据库连接池、线程池等。如果我们每次使用时都创建一个新的对象,那么会很浪费资源,因为每个对象在JVM中都有一定的内存消耗,加之对象的创建及其初始化过程,会在一定程度上降低应用程序的运行效率。

单例模式的实现方式

单例模式有多种实现方式,这里我们介绍比较典型的两种实现方式:懒汉式和饿汉式。

懒汉式(线程不安全)

懒汉式是指在第一次使用时才去创建对象,这种方式简单而直观,但是线程不安全。

public class Singleton {
    private static Singleton instance;

    private Singleton() {
    }

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

饿汉式(线程安全)

饿汉式是指在类加载时就创建对象,这种方式线程安全,但是有可能造成资源浪费。

public class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {
        return instance;
    }
}

单例模式的注意事项

在多线程的环境下,懒汉式容易造成线程安全问题,因此需要进行线程安全的处理。即通过synchronized关键字或者使用静态内部类等方式来保证线程安全。

final

什么是final?

final是Java中的关键字,可以用来修饰一个变量、方法或类,表示它们不可被修改、被重写或被继承。

final的作用

final主要有以下几个作用:

  • 常量:使用final修饰的变量表示常量不可被修改。
  • 安全:使用final修饰的方法表示方法不可被重写,避免了子类对父类方法的覆盖,也防止了不经意的改变代码行为。
  • 效率:final关键字可以使Java虚拟机在运行时进行优化,例如在方法调用中使用final关键字可以避免动态绑定,提高了程序的运行效率。

final的示例

public class MyClass {
    public static final int MAX_COUNT = 100;
    private static final int MIN_COUNT = 0;

    public final void printMessage() {
        System.out.println("Hello World!");
    }

    public void processMessage() {
        // ...
    }
}

public class SubClass extends MyClass {
    // 编译报错:Cannot override the final method from MyClass
    public void printMessage() {
        // ...
    }
}

在上面的示例中,我们使用final关键字定义了MAX_COUNT常量和printMessage方法,其中MAX_COUNT不可被修改,而printMessage方法不可被重写。另外,在SubClass子类中,试图重写printMessage方法时会编译报错。

抽象类和接口详解

抽象类是什么?

抽象类是一种不能被实例化的类,它定义了一些不能被具体实现的方法,而具体实现需要在其子类中实现,其子类必须实现父类的所有抽象方法。

什么是接口?

接口是Java中一种特殊的抽象类,它定义了一组规范和约束,而不需要具体实现,其具体实现需要在其实现类中实现。

抽象类和接口的区别

抽象类和接口都是Java中用来实现抽象类、多态和代码重用的机制,它们之间的区别主要有以下几个方面:

  • 定义:抽象类可以定义成员变量、普通方法和抽象方法,其中抽象方法必须被子类实现;而接口只能定义常量和抽象方法。
  • 实现:一个类只能继承一个抽象类,但是可以实现多个接口。
  • 构造函数:抽象类可以有构造函数,而接口不可以。
  • 访问修饰符:抽象类和接口中的方法都可以设置为public或者protected,但是抽象类中的成员变量可以设置为public、protected、private或者默认访问权限,而接口中的成员变量只能为public、static、final类型。

抽象类和接口的示例

public abstract class Animal {
    protected String name;
    public abstract void move();

    public void setName(String name) {
        this.name = name;
    }
}

public interface Flyable {
    public static final double PI = 3.1415;
    public abstract void fly();

    public default void speak() {
        System.out.println("I can fly!");
    }
}

public class Bird extends Animal implements Flyable {
    public void fly() {
        System.out.println("I can fly.");
    }

    public void move() {
        System.out.println("I can move by flying or walking.");
    }
}

public class Airplane implements Flyable {
    public void fly() {
        System.out.println("I can fly.");
    }
}

在上面的示例中,我们定义了Animal抽象类和Flyable接口,并实现了Bird类和Airplane类。其中Bird类继承了Animal类,并实现了Flyable接口,而Airplane类只实现了Flyable接口。注意到在Flyable接口中定义了一个speak方法,其实现不是必须的,但是如果要实现的话需要使用default关键字来声明。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java零基础也看得懂的单例模式与final及抽象类和接口详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Redis对象与redisObject超详细分析源码层

    Redis对象与redisObject超详细分析源码层 1. Redis对象的定义与结构 Redis对象是Redis中的核心数据结构,用于表示存储在Redis数据库中的键值对。在Redis源码中,Redis对象的定义位于src/redis.h文件中。 Redis对象的结构如下: typedef struct redisObject { unsigned ty…

    other 2023年10月15日
    00
  • 学信网用户名忘了怎么办?学信网帐号找回用户名的解决方法

    学信网用户名忘了怎么办?学信网帐号找回用户名的解决方法 1. 可以通过学信网官方网站找回用户名 步骤如下: 打开学信网官方网站(http://www.chsi.com.cn)。 点击网站右上角的“登录”按钮并进入登录页面。 在登录页面点击下方的“忘记用户名?”。 在弹出的页面中输入您的身份证号和姓名,并选择您的证件类型和证件号。 点击“下一步”按钮,按照页面…

    other 2023年6月27日
    00
  • Linux初始化系统盘后重新挂载数据盘方法

    针对这个问题,以下是针对Linux系统初始化系统盘后重新挂载数据盘的完整攻略: 1. 查看系统盘和数据盘信息 在重新挂载数据盘之前,必须先查看一下当前系统中系统盘和数据盘的信息。我们可以使用lsblk命令来查看磁盘信息,执行如下命令: lsblk 该命令会列出系统中已经挂载的磁盘、分区信息,以及它们的挂载点。通过该命令可以确定当前系统盘和数据盘的标识和挂载点…

    other 2023年6月20日
    00
  • Java 深入分析链表面试实例题目

    Java 深入分析链表面试实例题目的攻略如下: 1. 理解链表结构 链表是一种非常基础的数据结构,它由各个节点组成,每个节点都包含数据和指向下一个节点的指针。链表包含头节点和尾节点,以及节点间的链接关系。 示例代码如下: public class ListNode { int val; ListNode next; ListNode(int x) { val…

    other 2023年6月27日
    00
  • 关于opengl:使用glblitframebuffer显示纹理

    下面是关于“使用glBlitFramebuffer显示纹理”的完整攻略,包括步骤和示例说明。 简介 glBlitFramebuffer是OpenGL中的函数,用将一个帧缓冲区的内容复制到另一个帧缓冲区。它可以用于将一个帧缓冲区的内容显示到屏上,也可以于将一个帧缓冲区的内容复制到另一个帧缓冲区中。 步骤 下面是使用glBlitFramebuffer显示纹理的步…

    other 2023年5月8日
    00
  • npmdependencies/devdependencies…详解

    npm Dependencies/DevDependencies…详解攻略 在Node.js中,我们使用npm来管理依赖项。npm提供了两种类型的依赖项:dependencies和devDependencies。本攻略将介绍这两种依赖项的区别,并提供两个示例。 dependencies和devDependencies的区别 dependencies和devD…

    other 2023年5月9日
    00
  • iPhone手机内存不足怎么办? 一键清理释放几个G内存教程详解

    iPhone手机内存不足怎么办? 一键清理释放几个G内存教程详解 如果你的iPhone手机内存不足,可以采取以下步骤来清理并释放内存空间。这些方法可以帮助你腾出几个G的内存空间,提高设备的性能和响应速度。 1. 删除不需要的应用程序和数据 首先,检查你的iPhone上是否有不需要的应用程序和数据。这些应用程序和数据可能占用了大量的内存空间。你可以按照以下步骤…

    other 2023年7月31日
    00
  • Oracle安装TNS_ADMIN环境变量设置参考

    下面是Oracle安装TNS_ADMIN环境变量设置的完整攻略: 什么是TNS_ADMIN环境变量? TNS_ADMIN环境变量是Oracle数据库安装过程中需要配置的一个环境变量,它的作用是指定tnsnames.ora文件所在的目录。tnsnames.ora文件是一个配置文件,用于指定数据库连接信息。当客户端需要连接数据库时,它会读取tnsnames.or…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部