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日

相关文章

  • 分享几种常见WEB服务器配置方案

    分享几种常见WEB服务器配置方案的攻略如下: 常见WEB服务器 在开始配置方案之前,我们需要先了解常见的WEB服务器类型。常见的WEB服务器有 Apache、Nginx、IIS 等。在选择服务器时,需要考虑服务器的稳定性、性能、功能支持等因素。 Apache 配置方案 安装Apache 在Linux操作系统中,我们可以使用以下命令安装Apache: sudo…

    other 2023年6月27日
    00
  • Asp.net自定义控件之单选、多选控件

    Asp.net自定义控件之单选、多选控件 在ASP.NET中,我们可以使用自定义控件来实现复杂的功能和界面。其中单选和多选控件是非常常用的控件,我们可以通过自定义控件的方式来实现它们的功能。 创建自定义控件 我们可以通过继承WebControl类来创建自定义控件。以下是单选、多选控件的基础结构: public class RadioButtonList : …

    other 2023年6月27日
    00
  • 怎样使用路由器手动更换ip地址?

    怎样使用路由器手动更换IP地址? 如果你想手动更换路由器的IP地址,下面是一个详细的攻略,包含了两个示例说明。 步骤1:登录路由器管理界面 首先,你需要登录到路由器的管理界面。打开你的网页浏览器,输入路由器的默认IP地址(通常是192.168.1.1或192.168.0.1)并按下回车键。这将打开路由器的登录页面。 步骤2:输入用户名和密码 在登录页面上,输…

    other 2023年7月30日
    00
  • Python基础入门之if判断语句

    Python基础入门之if判断语句攻略 在Python中,if语句是一种用于根据条件执行不同代码块的控制结构。它允许我们根据条件的真假来决定程序的执行路径。本攻略将详细介绍if语句的使用方法,并提供两个示例说明。 基本语法 if语句的基本语法如下: if condition: # 如果条件为真,则执行这里的代码块 statement1 statement2 …

    other 2023年7月28日
    00
  • 怎么更改文件类型

    下面是如何更改文件类型的完整攻略。 步骤一:显示文件扩展名 要更改文件类型,我们首先需要显示文件的扩展名。默认情况下,Windows 系统会隐藏文件的扩展名,但更改文件类型需要知道文件的扩展名。 打开 Windows 资源管理器,点击“查看”选项卡。 在“选项”菜单下,点击“更改文件和文件夹选项”。 在“文件夹选项”对话框中,点击“查看”选项卡。 取消勾选“…

    其他 2023年4月16日
    00
  • java-将intwritatble转换为int

    在Hadoop MapReduce中,IntWritable是一种常用的数据类型,它表示一个整数。有时候,我们需要将IntWritable转换为Java中的int类型。本文将介绍如何将IntWritable转换int类型提供两个示例说明。 示例一:使用IntWritable的get方法 IntWritable类提供了一个get()方法,可以将IntWrita…

    other 2023年5月9日
    00
  • javascript自定义右键菜单插件

    下面是关于制作 JavaScript 自定义右键菜单插件的完整攻略。我们按照以下步骤进行: 1.项目环境配置 要开发自定义右键菜单插件,我们需要考虑以下几个关键因素: 依赖库: 我们需要使用jQuery库,它可以使DOM操作变得更加简单。 插件结构: 插件结构应该让任何开发者都能够轻松理解。 交互相关操作: 与菜单交互的JavaScript代码必须能够响应用…

    other 2023年6月27日
    00
  • 新安装的XAMPP访问phpmyadmin出错的解决方法

    如果你新安装的XAMPP出现了访问phpmyadmin出错的问题,一般有以下两种可能的解决方法: 方法一:重启Apache和MySQL服务 有时候出错的原因可能是因为Apache和MySQL服务没有正常启动,所以你可以尝试通过重启这两个服务来解决此问题。具体步骤如下: 在XAMPP控制面板中,停止Apache和MySQL服务 点击“Start”按钮,再次启动…

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