各位小伙伴们大家好,欢迎来到这个小扎扎的《Java核心技术 卷Ⅰ》笔记专栏,在这个系列专栏中我将记录浅学这本书所得收获,鉴于 看到就是学到、学到就是赚到 精神,这波简直就是血赚
💡涉及的知识点速通
- 🛫 关于包你都知道什么?
- 🪂 包名该如何定义?
- 🪂 什么是无名包?
- 🪂 关于import关键字应该知道什么?
- 🛫 什么是单例设计模式?
- 🪂 饿汉式单例模式
- 🪂 懒汉式单例模式
- 🪂 两种模式的区别
🛫 关于包你都知道什么?
🪂 包名该如何定义?
为什么要引用包的概念呢?使用包的最主要的原因就是为了保证类名的唯一性,因为使用到类的时候会带上它的包名,一个包中又不会存在一个签名一样的方法,方法签名的概念参考这篇博客的方法重写与重载问题部分。
一般来说,包的命名方式都是采用因特网域名的逆序形式,因为因特网的域名肯定是唯一的。比如说:域名为horstmann.com可以将其包名命名为com.horstman,再追加上工程名为com.horstman.bean,如果再加上类名为com.horstman.bean.Employee,这就组成了这个Employee类的完全限定名
还有在认知上比较重要的一点就是,从编译器的角度上来看,嵌套的包与包之间并没有任何的关系,每一个包都是独立的一些类的集合。例如java.util包和java.util.jar包之间就毫无关系
🪂 什么是无名包?
说完包的命名,我们来说一说该如何将一个类放在指定的包中,在源文件的第一行使用package语句指定类所在的包位置,这一步基本上所有的IDE工具在创建类的时候都会自动生成(所以我们就关注的很少)
如果不使用package指定包位置的话,这个类就直属于无名包,无名包是最上层的包结构,不使用package指定的类指定的类直属于无名包,其他的类在无名包下的指定包目录下间接属于无名包
🪂 关于import关键字应该知道什么?
一个类可以使用它所属包中的所有类,以及其他包里的public类,这里的使用指的是,通过实例化对象或者类名调用等方式操作类中的属性。使用其他包里的public类的方式一共有两种,一种就是使用该类的全限定名,另外一种就是import 如果需要使用到这个包里的很多类的话,不必一个类一个类的import,可以使用通配符 * 实现 正如我们所知,Java的核心类库中存在很多的命名相同的类,如果你import的两个包中存在名称相同的类,此时使用这个类会用到哪个?如果这两个包中的同名类都需要使用的话又该怎么办? import除了可以导类之外还可以具体到类中的静态属性,使用import导入类中的static方法字段之后就可以直接使用该静态属性,而无需使用类名调用
🛫 什么是单例设计模式?
所谓类的单例设计模式,就是采取一定的方法保证在这整个系统中一个类只能存在一个实例对象,而且该类中只提供一个获得它的实例对象的方法。想要完成以上的构想,首先就必须将类构造器的访问权限设置为private防止随意在类的外部通过new创建实例对象,类外部无法创建实例对象所以只能通过类内部的静态方法,所以在类内部使用静态方法创建并返回该类的对象,由于静态方法内部只能访问静态资源,所以该类对应的对象变量也要定义为静态的
单例设计模式也为两种,饿汉式和懒汉式
🪂 饿汉式单例模式
所谓的饿汉式就像是一个饥饿的人的心态一样,他想一到家就已经有人做好了饭可以直接吃。对应到Java就是提前创建好该类的实例对象,使用类调动静态方法的时候直接返回这个已经创建好的对象,所以说使用这种静态方法创建的对象是同一个,使用==判断地址一致
🪂 懒汉式单例模式
所谓的懒汉式就像是一个懒惰的人一样,等到他饿的时候才去看自己有没有做饭,有过有的话就直接吃,没有的话就做完再吃。对应到代码实现就是,在静态方法中判断实例对象变量是否为null,null的话就new个对象返回,不为null的话直接返回
🪂 两种模式的区别
所谓的饿汉式和懒汉式的区别就是创建对象的时间不同,饿汉式是类加载的时候就创建好调用就返回,懒汉式则是在静态方法内部判断后创建并返回。于是带来第一个不同点:饿汉模式在类加载的时候就会创建对象,这样的话就会长时间加载对象导致内存资源的耗费;而懒汉模式只有在调用静态方法的时候才会创建对象,这样的话就会延迟创建对象性能就可以得到提高
但是懒汉模式也并不是都是好处,因为懒汉式涉及到了一个判断的过程,于是就导致它在多线程并发的环境下会出现安全问题,而饿汉模式是线程安全的。如果想要保证懒汉模式的线程安全,可以在getInstance方法的声明上加synchronize关键字,锁住方法体使之安全