1. 设计模式 ★
23种-->就是前辈智慧的结晶(换一种方式实现功能)
1.1 单例模式
一个类对外只提供一个对象!
a. 构造器私有化(不让外界new对象)
b. 在本类内实例化一个对象,然后让外界可以获取到
① 懒汉式
方式四属于懒汉式
特点:只有你要的时候,我才给你准备对象
② 饿汉式
方式一二三属于饿汉式
特点:不管你要不要,类加载的时候,对象已经准备好
2. 枚举
一个类对外提供固定个数的对象!
2.1 JDK1.5之前 通过自己的逻辑
a. 必须将构造器私有化
b. 需要设置若干个公有的静态的常量
类中的对象,一定要设置为常量!不能被修改
类中如果有属性,属性不能提供set方法!(属性也不允许修改)
2.2 JDK1.5之后
引入了一个关键字enum,通过该关键字创建的类就是枚举类!
语法:【修饰符】 enum 类名{}
特点:
① 枚举类的构造器默认是私有的,并且必须是私有的!
② 直接写对象名即可(对象与对象之间采用逗号隔开,最后使用分号结束)!
③ 默认是采用无参构造器(后期可以设置)
④ 对象默认就是公有的静态的常量
⑤ 对象列表必须在类的首行
⑥ 如果显示的创建了有参构造器,没有无参构造器了
对象的创建就需要使用有参构造器
每个对象后添加小括号!
枚举类的父类
枚举类存在一个默认的父类Enum
方法:
name(); 获得对象的名称
toString(); 返回也是对象的名称
自定义的枚举类是可以再次重写的!
ordinal();返回当前对象的位置(角标)
static values();返回该枚举类所有的常量对象
static valueOf(String name);根据字符串的名称,返回常量对象
实现接口
语法: implements 接口名
特殊点:
枚举类提供的对象个数是确定的!
并且在类加载的时候,对象就已经产生!
所以,抽象方法的实现,可以将范围缩小到某个对象!
语法:常量对象【(实参列表)】{对父级做扩展} 类似于匿名内部类的写法
当当前枚举类中所有的常量对象,都对抽象方法做了实现,
那么公有的就可以删除
练习:
1. 定义季节的枚举类,然后并设置属性value(对季节的描述)!在测试类测试!
2. 定义星期的枚举类,然后并设置属性value(要做的事情)!在测试类测试!
3. 手动输入一个星期的名称(常量名),返回星期的常量对象!输出其value值!
3. 注解
注释:不参与编译和运行,是对代码的解释
注解:参与编译和运行的,具有功能的
3.1 注解的形式
@注解名【(参数)】
3.2 之前遇到的注解
文档注释内(了解):
@author 作者
@version 版本
@param 参数
@return 返回值
...
注释外(掌握):
@Override 添加在方法的上方
功能:检测当前方法是否满足重写
源码:
@Target(ElementType.METHOD)
记录该注解可以应用在什么地方!
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
@Overload 重载
@Deprecated 标记当前方法已过时
功能还是存在的,只是不再维护!(在后期升级不再考虑)
@SuppressWarnings({"unused","rawtypes", "unchecked"})
抑制警告(idea中还好) 警告黄线(无所谓),错误是红线(不允许出现)
后期会学到很多的注解(注解开发是趋势)
4. 单元测试 junit(第三方产品)
main方法也是可以测试的,但是有一个弊端就是一个类允许存在一个main方法
单元测试,一个类中可以创建多个程序的入口!
前提:
① 必须使用在公有的类以及公有的方法上
② 需要导包(将第三方产品的源码导入到本项目内)
在注解后面使用万能提示,选择junit4,导入(第一次下载会慢一些)
手动导入(暂时的):
a. 需要去网络自己下载jar包(class文件的压缩包)
junit-4.12.jar
hamcrest-core-1.3.jar
b. 在模块下new-->目录(lib)
c. 将刚刚下载的jar包粘贴进去
d. 在jar包上右键--> add as library
@Test 要求你的项目中么有自定义的Test类 ★
@Before 每个Test之前运行
@After 每个Test之后运行
@BeforeClass 在所有的Test之前运行一次
方法必须是静态
@AfterClass 在所有的Test之后运行一次
方法必须是静态
缺点:
① 默认不能手动输入
② 学IO流的时候,关于相对路径也是有自己的特点
③ 不能够启动线程
5. 包装类
5.1 主要是对基本数据类型的包装!
基本数据类型效率高!但是后期的知识有一部分是针对于面向对象设计的!
比如:
泛型就不能指定基本数据类型
集合中是不允许存储基本数据类型(只能存储对象)
个数:8个
byte Byte
short Short
int Integer
long Long
float Float
double Double
上述六个和数值有关的父类是 Number
char Character
boolean Boolean
这两个的父类时Object
5.2 使用
装箱:
基本数据类型-->包装类类型
手动装箱:
构造器
自动装箱:
直接赋值
拆箱
包装类类型-->基本数据类型
手动拆箱:
调用方法 xxxValue();
自动拆箱:
直接赋值
5.3 包装类的常用方法
a. 如何将字符串转为基本数据类型 ★
String str="45"; 转为int值
① 通过包装类的构造器
int i = new Integer(str);
② 通过包装类的静态方法
包装类的类名.parseXX(String)
b. 最值
Integer.MAX_VALUE和Integer.MIN_VALUE
5.4 自动装箱的原理
Integer i=10;//自动装箱 会默认调用Integer中的valueOf方法
自动装箱的核心(源码)
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
包装类对比相等
如果在默认值范围内,的自动装箱,则相等!
一旦有自己new的就不相等
如果不在范围内也是不相等的!
如果有基本数据类型参与对比,包装类类型就会自动拆箱,就变为了基本数据类型的对比
只要值是一样的,就是相等的
包装类对象的缓存问题
包装类 缓存对象
--------- -----------
Byte -128~127
Short -128~127
Integer -128~127
Long -128~127
Float 没有
Double 没有
Character 0~127
Boolean true和false