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技术站