我是靠谱客的博主 机智水壶,最近开发中收集的这篇文章主要介绍3.3 面向对象编程高级 单例设计模式 final关键字-跟着韩老师学JavaSE4.单例设计模式5.final关键字,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

大佬给推荐的韩顺平老师的课程 2021年刚刚录的船新版本!
【零基础 快速学Java】韩顺平 零基础30天学会Java
我整理的学习路线与各章节学习笔记戳这里
硬把从另一个讲师那里看了300多集的我拽过来 几十节课一下子爱上这个节奏了!安利!!

具有其他语言基础的盆友只需要把前几章的章节总结简单看一下 然后再去着重看需要学习的章节就可以了!
知识点分的非常清晰! 每章还有总结 这…真的是我理想中的学习资料呐!

学习笔记整理过后放到这里

  • 一方面是让自己再二次记忆一下
  • 一方面是希望可以帮到有这方面知识需要的朋友 给他们一个新的切入点来重新了解这一个知识

本专题包括以下几个主要知识点~
在这里插入图片描述
本次笔记主要记录 单例设计模式final关键字的内容

4.单例设计模式

【1】什么是设计模式

在大量的实践中总结和理论化之后优选的代码结构、编程风格、解决问题的思考方式

设计模式就像是经典的棋谱

面对不同的棋局 我们使用不同的棋谱 免去我们自己再思考和摸索

【2】什么是单例模式

顾名思义 单例 就是单个的案例

所谓的单例设计模式就是采取一定的方法保证在整个的软件系统中 对某个类只能存在一个对象实例 并且该类只提供一个取得其对象实例的方法

单例模式有两种方式——

  • 饿汉式 类加载的时候就实例化,并且创建单例对象。
  • 懒汉式 默认不会实例化,什么时候用什么时候new。

【3】单例模式应用实例

请添加图片描述

public class SingleTon01 {
	public static void main(String[] args) {
		// GirlFriend xh = new GirlFriend("小红");
		// GirlFriend xb = new GirlFriend("小白");
		//通过方法可以获取对象
		GirlFriend instance = GirlFriend.getInstance();
		System.out.println(instance);
        
		GirlFriend instance2 = GirlFriend.getInstance();
		System.out.println(instance2);
        
		System.out.println(instance == instance2);//T
		//System.out.println(GirlFriend.n1);
		
        //... 
    }
}

//有一个类, GirlFriend
//只能有一个女朋友
class GirlFriend {
	private String name;
	//public static int n1 = 100;
	//为了能够在静态方法中,返回 gf 对象,需要将其修饰为 static
	//對象,通常是重量級的對象, 餓漢式可能造成創建了對象,但是沒有使用. private static GirlFriend gf = new GirlFriend("小红红");
	//如何保障我们只能创建一个 GirlFriend 对象
	
    //步骤[单例模式-饿汉式]
	//1. 将构造器私有化
	//2. 在类的内部直接创建对象(该对象是 static)
	//3. 提供一个公共的 static 方法,返回 gf 对象
	private GirlFriend(String name) {
		System.out.println("構造器被調用.");
		this.name = name;
	}
	public static GirlFriend getInstance() {
		return gf;
	}
	@Override
	public String toString() {
		return "GirlFriend{" +
		"name='" + name + ''' +
		'}';
	}

}

下面来演示一下懒汉式的单例模式——

/**
* 演示懒汉式的單例模式
*/
public class SingleTon02 {
	public static void main(String[] args) {
		//new Cat("大黃");
		//System.out.println(Cat.n1);
		Cat instance = Cat.getInstance();
		System.out.println(instance);
		//再次調用 getInstance
		Cat instance2 = Cat.getInstance();
		System.out.println(instance2);
		System.out.println(instance == instance2);//T
	}
}
//希望在程序運行過程中,只能創建一個 Cat 對象

//使用單例模式
class Cat {
	private String name;
	public static int n1 = 999;
	private static Cat cat ; //默認是 null
	//步驟
	//1.仍然構造器私有化
	//2.定義一個 static 靜態屬性對象
	//3.提供一個 public 的 static 方法,可以返回一個 Cat 對象
	//4.懶漢式,只有當用戶使用 getInstance 時,才返回 cat 對象, 後面再次調用時,會返回上次創建的 cat 對象
	// 從而保證了單例
	private Cat(String name) {
		System.out.println("構造器調用...");
		this.name = name;
	}
	public static Cat getInstance() {
		if(cat == null) {//如果還沒有創建 cat 對象
		cat = new Cat("小可愛");
		}
		return cat;
	}
	@Override
	public String toString() {

		return "Cat{" +
				"name='" + name + ''' +
				'}';
	}
}

【4】饿汉式VS懒汉式

  • 饿汉式 类加载时就创建了对象实例
  • 懒汉式 使用时才创建对象实例

请添加图片描述

5.final关键字

【1】基本介绍

啥时候用final关键字?

  • 不希望类被继承时 用final修饰
//如果我们要求 A 类不能被其他类继承
//可以使用 final 修饰 A 类
final class A { }
//class B extends A {} 报错
  • 不希望父类的某个方法被子类覆盖/重写(override)时 用final修饰
class C {
	//如果我们要求 hi 不能被子类重写
	//可以使用 final 修饰 hi 方法
	public final void hi() {}
}
class D extends C {
	// @Override
	// public void hi() {
	// System.out.println("重写了 C 类的 hi 方法..");
// } 这样就不能重写嘞!!!
}
  • 不希望类的某个属性的值被修改时 用final修饰
//当不希望类的的某个属性的值被修改,可以用 final 修饰
class E {
	public final double TAX_RATE = 0.08;//常量
}
  • 不希望某个局部变量被修改
//当不希望某个局部变量被修改,可以使用 final 修饰
class F {
	public void cry() {
	//这时,NUM 也称为 局部常量
	final double NUM = 0.01;
	//NUM = 0.9; 局部变量不能再被改了!
	System.out.println("NUM=" + NUM);
	}
}

【2】final使用注意事项和细节讨论

1.final修饰的属性又叫常量

一般用xx_xx_xx来命名

2.final修饰的属性在定义时必须赋初值 以后不能修改

2‘.赋初值的位置可以在如下位置之一——

  • 定义时 public final double TAX_RATE = 0.08;
  • 在构造器中 public 类名(){}
  • 在代码块中 [static]{}

3.final修饰的属性如果是静态的 那么初始化的位置——

  • 定义时
  • 在静态代码块中 static {}

不可以在构造器中赋值!

4.final类不能继承 但是可以实例化对象

5.如果类不是final类但是含有final方法 则方法虽然不能被重写 但是可以被继承

这不是肯定的嘛~不能被extends 或 @override 的只是带final的部分哦!

6.如果一个类是final类了 那么不必将方法修饰成final方法

7.final不能修饰构造方法(即构造器)

8.final与static搭配使用 效率更高!

class Demo{
    public static final int  i = 16;
    static{
        System.out.println("高效!");
    }
}

如此操作不会导致类加载!——所以效率更高嘛~~

底层编译器做了优化处理

9.包装类和String都是final类

其中 包装类有 Integer,Double,Float,Boolean

【3】final练习题

编写一个程序计算图形的面积 要求圆周率为3.14
赋值的位置3个方式都写一下~

代码如下——

public class FinalExercise01 {
	public static void main(String[] args) {
		Circle circle = new Circle(5.0);
		System.out.println("面积=" + circle.calArea());
	}
}

class Circle {
	private double radius;
	private final double PI= 3.14;//01 定义的时候赋值 这样赋值更多一些
	//构造器
	public Circle(double radius) {
		this.radius = radius;
        //02 构造器中赋值
		//PI = 3.14;
	}
	{
        //03 代码块中赋值
		//PI = 3.14;
	}
	public double calArea() {
		return PI * radius * radius;
	}
}

下面是第二题

public int addOne(final int x) { //下面的代码是否有误,为什么? 
	++x; //错误,原因是不能修改 final x 的值
	return x + 1; //这里是可以. 
	}
}

最后

以上就是机智水壶为你收集整理的3.3 面向对象编程高级 单例设计模式 final关键字-跟着韩老师学JavaSE4.单例设计模式5.final关键字的全部内容,希望文章能够帮你解决3.3 面向对象编程高级 单例设计模式 final关键字-跟着韩老师学JavaSE4.单例设计模式5.final关键字所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部