首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微博
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com ToB IT社区-企服评测·应用市场
»
论坛
›
大数据
›
数据仓库与分析
›
【Java底子】10章、单例模式、final关键字的利用本领和 ...
返回列表
发新帖
【Java底子】10章、单例模式、final关键字的利用本领和利用细节、单例模式-懒汉式、单例模式-饿汉式【3】
[复制链接]
发表于 2025-10-2 10:54:40
|
显示全部楼层
|
阅读模式
跟着一位很锋利的老师学完了java底子,现开始举行javaSE复盘总结知识点,盼望可以给java底子单薄的友友提供一点参考,一起学习Java低级知识,共同进步,打好底层逻辑底子,爱上Java编程❤️❤️❤️
(本文章中知识点如有差别的见解,欢迎品评区留言)
1、单例模式
11、根本先容
1.1.1、什么是操持模式
什么是单例模式
单例(单个的实例)
所谓类的单例操持模式,就是采取肯定的方法包管在整个软件体系中,对某个类只能存在一个对象实例,而且该类只提供一个取得对象实例的方法。
单例模式有两种方式:(1)饿汉式 (2)懒汉式
1.1.2、应用实例
1.1.2.1、单例模式-饿汉式
package com.fhsedu.single_;
//有一个类,GirFriend
//只能有一个女朋友
class GirlFriend {
private String name;
//为了能够在静态方法中,返回gf对象,需要将其修饰为static
private static GirlFriend gf = new GirlFriend("小红红");
//如何保障我们只能创建一个GirlFriend对象
//步骤【单例模式-饿汉式】
//1、将构造器私有化
//2、在类的内部直接创建
//3、提供一个公共static方法,返回gf对象
private GirlFriend(String name) {
this.name = name;
}
public static GirlFriend getInstance() {
return gf;
}
@Override
public String toString() {
return "GirlFriend{" +
"name='" + name + '\'' +
'}';
}
}
public class SingleTon01 {
public static void main(String[] args) {
//通过方法可以获取对象
GirlFriend instance1 = GirlFriend.getInstance();
System.out.println(instance1);
GirlFriend instance2 = GirlFriend.getInstance();
System.out.println(instance2);
System.out.println(instance1.hashCode() + " " + instance2.hashCode());//相同
}
}
复制
代码
饿汉式办理有大概造成创建了对象,但是没有利用,带来的弊端
1.1.2.2、单例模式-懒汉式
不管是懒汉式照旧饿汉式都是在类中都是创建一个详细的实例
代码
演示
package com.fhsedu.single_;
//演示懒汉模式的单例
//希望在程序运行过程中,只能创建一个Cat对象
class Cat {
private String name;
public static int n1 = 999;
private static Cat cat;
//步骤
//1、仍然让构造器私有化
//2、定义一个static静态属性对象
//3、提供一个public的static方法,可以返回一个Cat对象
//4、懒汉式,只有当用户使用getInstance时,才返回cat对象,后面再次调用时会返回上次创建的cat对象
// 从而保证了单例
private Cat (String name) {
this.name = name;
}
public static Cat getInstance() {
System.out.println("构造器被调用...");
if (cat == null){//如果没有创建cat对象
cat = new Cat("小可爱");
n1++;
}
return cat;
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
'}';
}
}
public class SingleTon02 {
public static void main(String[] args) {
//此时初始化为 999
System.out.println(Cat.n1);
//Cat为null 执行 new Cat 和 n++
Cat cat1 = Cat.getInstance();
//此时 n == 1000
System.out.println(cat1);//默认是null
System.out.println(cat1 + "" + cat1.hashCode());
//再次调用getInstance,此时还是之前的那只猫吗?
//初始化第2只猫,但是指向的还是之前的那只
Cat cat2 = Cat.getInstance();
//n1 == 1000
System.out.println(Cat.n1);
System.out.println(cat2 + "" + cat2.hashCode());
Cat cat3 = Cat.getInstance();
System.out.println(cat3 + "" + cat3.hashCode());
//n1 == 1000
System.out.println(Cat.n1);
}
}
复制
代码
饿汉式细节:
此时没有创建对象
(Runtime中的单例模式-饿汉式)
1.1.2.3、区别
饿汉式存在题目:在类加载时间就创建,大概存在资源浪费题目
懒汉式存在题目:线程
安全
题目
4.1.2.4、小结
单例模式的两种起首方式1)饿汉式 2)懒汉式
饿汉/懒汉式创建的过程
要求,可以自己独立写出单例模式
2、final关键字
演示:如果我们以为这个类很告急不盼望被继续和重写
代码演示:
拒接继续本类
拒接重写父类方法
拒绝修改本类中的属性
package com.fhsedu.final_;
public class Final01 {
public static void main(String[] args) {
E e = new E();
// e.TAX_RATE = 200;//
}
}
//如果我们要求A类不能被其他类继承
//可以使用final修饰 A类
final class A {}
//class B extends A{}
class C{
//如果我们要求hi不能被子类重写
//可以使用final修饰 hi方法
public final void hi() {
}
}
class D extends C{
/*@Override
public void hi() {
System.out.println("重写了C类的hi方法..");
}*/
}
//当不希望类的某个属性的值被修改
class E{
public final double TAX_RATE = 0.08;
}
//当不希望某个局部变量被修改,可以使用final
class F{
public void cry() {
//这时,NUM 也称为局部常量
final double NUM = .01;
// NUM = .9;
System.out.println("NUM=" + NUM);
}
}
复制代码
2.1、final细节
final修饰的常量一样平常为大写
final修饰常量时,必须初始化属性
final可以实例化但不能继续(类)
2.1.1、细节一
(把握)
2.1.2、细节二
不要多此一举
final class AAA{
//一般来说,如果一个类已经是final类了,就没有必要将方法设置为final方法了
//public final void hi(){}//多此一举,已经不能继承该类了,可定不能重写该方法
}
复制代码
有无final做对比:
看此时没有加载static静态代码块的内容,底层举行了优化:
没有加上final:
(输出n1 和 static中的内容)
加上final后
(没有了static的内容)
缘故原由:
类加载的五个阶段:
载入、验证、准备、分析 和 初始化
阶段
静态属性和静态代码块是按照次序实行的;此时静态属性先加载
又由于静态属性之前有final,以是在类加载的准备阶段就被赋予了界说的值,而不实行分析和初始化的阶段。
因此静态代码块不再实行(原来在初始化阶段实行)
detail 02
//包装类,String 是final类,不能继续类
2.2、finalExercise
package com.fhsedu.final_;
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
//构造器
public Circle(double radius) {
// PI = 3.14;//可以在这三个位置初始化,但是只能初始化一次
this.radius = radius;
}
{
PI = 3.14;
};
public double calArea() {
return PI * radius * radius;
}
}
复制代码
题二
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
回复
使用道具
举报
返回列表
tsx81428
+ 我要发帖
登录后关闭弹窗
登录参与点评抽奖 加入IT实名职场社区
去登录
微信订阅号
微信服务号
微信客服(加群)
H5
小程序
快速回复
返回顶部
返回列表