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

yizhihongxing

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日

相关文章

  • androidcursor浅析

    androidcursor浅析 在Android开发中,常常需要对数据库进行操作。Android提供了一个SQLite数据库用于本地存储。如果要实现数据的增删改查,需要使用Android提供的SQLiteOpenHelper类,它封装了对SQLite数据库的操作,但是我们更多的时候会使用Cursor来获取数据库的内容。 什么是Cursor 打个比方,我们把它…

    其他 2023年3月29日
    00
  • C语言详解select函数的使用

    C语言详解select函数的使用 什么是select函数? select函数是Linux系统中的多路复用函数,它通过检查一组文件描述符(socket、文件、管道等)的状态来实现同时监视多个文件描述符的读写状态,并在其中的一个文件描述符可读写时进行相应的处理。可以说,select函数是实现I/O多路复用的重要工具之一。 select函数的语法 int sele…

    other 2023年6月27日
    00
  • ajax提交加载进度条示例代码

    下面是“ajax提交加载进度条示例代码”的完整攻略: 理解Ajax 在介绍示例代码之前,我们需要先了解什么是Ajax。Ajax指“异步JavaScript和XML”(Asynchronous JavaScript and XML),是一种用于创建快速动态网页的技术。通过使用Ajax,可以在不刷新整个网页的情况下,将部分数据提交给服务器进行处理和更新。这就为实…

    other 2023年6月25日
    00
  • cvt无级变速是什么意思

    CVT无级变速是一种变速器的设计,它通过无级变速的机制使得发动机始终在最高效率的转速范围内工作,从而提高燃油经济性和驾驶舒适性。 CVT变速器具有一组变速带和滑轮系统。当驾驶员加速时,CVT会自动调整变速带和滑轮的组合,以最大限度地利用发动机的扭矩和功率输出。与传统的机械式或自动变速器相比,CVT的优点在于它可以提供更为顺畅的加速和减速过程,更好的燃油经济性…

    其他 2023年4月16日
    00
  • java字符串格式化详解

    以下是关于“Java字符串格式化详解”的完整攻略,包括字符串格式化的介绍、示例说明等。 字符串格式化介绍 Java中的字符串格式化是指将一个字符串中的占位符换为具体的值。占位符可以是任何类型的数据,包括整数、浮点数、字符串等。Java中常用的字符串格式化方法是使用String.format()方法。 示例说明 以下是两个使用字符串格式化的示例说明: 示例一 …

    other 2023年5月7日
    00
  • ffserver用法小结

    以下是关于“ffserver用法小结”的完整攻略,包括基本概念、解决方法、示例说明和注意事项。 基本概念 FFserver是FFmpeg的一个组件,用于实现流媒体服务器。它可以将音视频流转换为HTTP或RTSP流,并提供实时的流媒体服务。FFserver可以通过配置文件进行配置,支持多种音视频格式和编码方式。 解决方法 以下是使用FFserver的解决方法:…

    other 2023年5月7日
    00
  • js类式继承的具体实现方法

    让我来详细讲解 “JS类式继承的具体实现方法” 的完整攻略。 什么是类式继承 类式继承是 JavaScript 中一种常用的面向对象编程模式,通过创建一个类(也就是构造函数)作为父对象,然后在子对象中通过调用父对象的构造函数,实现对父对象属性和方法的继承。 具体实现方法 定义父类 我们首先要定义一个父类,作为后面子类对象的模板。父类可能需要有一些属性和方法,…

    other 2023年6月27日
    00
  • Linux 下 安装jdk 1.7

    Linux 下 安装JDK 1.7 在 Linux 下安装 JDK 1.7 通常需要经过以下步骤: 1. 下载 JDK 1.7 JDK 1.7 的安装文件可以在 Oracle 官网下载,也可以在其他可信的第三方网站下载,建议选择官方网站进行下载以确保文件的安全性。 2. 解压 JDK 1.7 下载完成后,需要将文件解压至指定文件夹中。解压方式为执行以下命令:…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部