概述
大佬给推荐的韩顺平老师的课程 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关键字所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复