目录
泛型
1. 泛型是JDK1.5之后的特性。泛型限定了集合中的数据类型,保证了程序的安全性
泛型在JDK1.7之后,new后面的泛型可以省略成一个<>:ArrayList<String> list = new ArrayList<>();
2. 泛型的规则: <大写字母A> A:代表传入的实际数据类型
- T: Type
- E: Element
- K: key
- V: value
3. 在类中使用泛型: 在类名后加上<大写字母>。如果类中有多个泛型,需要使用,隔开 <T,K> 。 eg:public class Demo03 <T,K>
4. 接口使用泛型分为两种情况
- 接口中是声明泛型,实现类也声明泛型,那么需要在实现类后面<T>,并且在实现类的接口后面加<T>
- 接口的实现类泛型确定
5. 方法中的泛型:在方法的返回值前添加<大写字母>,在参数列表和方法体中就可以使用
6. 上限下限范围:注意:上限下限不能同时存在于一个<>中
- <? extends xx类名/接口> 上限:?的范围应该是xx类名/接口的子类或者子接口 eg:ArrayList<? extends Number> list
- <? super xx类名/接口> 下限: ?的范围应该是xx类名/接口的父类或者父接口
- <? Super String> :代表泛型必须是String类的父类
不定参数:语法糖
可变参数 在参数后面加上...,当有多个参数时,可变参数必须放在最后一位,底层还是使用可变数组,只是让开发人员用的爽,感觉甜蜜-语法糖
枚举
- 枚举其实就是一个类
- 枚举的使用方式:使用关键字enum来修饰 在枚举中添加首字母为大写的枚举名称,如果有多个,使用,隔开即可。枚举的内容必须放在枚举的首行。
- 枚举如果想使用有参的构造方法,必须提供无参构造方法。 因为枚举的内容,假设是Spring,那么就是 public static final Season Spring = new Season(); Spring(3):就是调用了有参构造
- 记住:枚举除了第一行只能写枚举内容,构造方法必须使用private修饰之外,其他的只是一种特殊的类。
反射:低耦合,高内聚
1. 反射:在运行状态中的一个类,可以获取这个类的属性和方法,也可以获取对象的属性和方法,而且可以调用对象的属性和方法。这个过程就是java中的反射机制。
2. 要使用反射,首先需要获取到类的字节码文件。获取字节码的三种情况:Class类 就是代表类的类
- 通过 类名.class
- 通过 对象名.getClass()
- 通过 Class.forName(类的全路径);
3. 获取字符串对应的对象
1.根据字符串内容获取对应的字节码:Class.forName
2.根据字节码的getConstructor(构造方法的参数类型)方法获取对应的构造方法:clz.getConstructor(char[].class);getConstructor:只能获取public修饰的构造方法;getDeclaredConstructor:获取所有修饰符修饰的构造方法
3.通过构造方法的值调用.newInstance(实参)来创建对象:c.newInstance(new char[]{'u','z','i'});
4. 反射的劣势
1.破坏了原有面向对象的封装性,无论公有还是私有的内容,都可以获取
2.可以绕过泛型的约束
注解
1. 给计算机使用.注解的顶级父类: Annotation
@override
@SuppressWarnings 压制警告
2. 定义一个注解:
@interface 注解名{
}
3. 注解的体中(花括号里面)只能包含:基本数据类型、Class、String、注解、枚举和包含他们的一维数组
4. 元注解:给注解进行注解
@Target:限定注解的使用范围
@Retention给注解限定级别
@Inherited 限定子类也要遵循注解
@Documented表示注解会生成到文档中
JDK1.5 自动装箱 自动拆箱
1. 包装类:将基本数据类型转换为引用数据类型
装箱(封箱):将基本数据类型转换为引用数据类型
拆箱:将引用数据类型转换为基本数据类型
2. 自动装箱底层调用valueOf方法,Integer in = 10;
Short Integer Long Character 在一定范围内有固定值,超出范围创建新的对象
Float Double 直接创建对象
Byte Boolean 永远是固定值
java分为两大类型:基本数据类型 引用数据类型。基本数据类型仅仅表示数值
包装类:将基本数据类型包装成引用数据类型
引用类型---产生对象,对象可以提供各种各样的方法来操作数据
基本类型---定义变量,变量没有方法或者属性来快速边界的操作
byte | short | int | long | float | double | char | boolean | void |
Byte | Short | Integer | Long | Float | Double | Character | Boolean | Void |
int和char对应的类型发生了变化,其他的类型都是把首字母大写
*1.自动装箱(封箱):自动将基本数据类型转换为引用数据类型。底层调用的是了对应类身上的valueOf方法---静态方法
面试:底层
Short Integer Long Character的valueOf方法:指定一个 -128 到127的范围,如果在这个范围内,返回一个固定的值,如果超出范围,创建新的对象。
Float,Double 的valueOf方法是:直接创建新的对象
Byte Boolean 永远是固定值。Boolean只有两个值(TRUE FALSE)
2.自动拆箱:自动将引用数据类型转换为基本数据类型,底层是调用了对应对象身上的***Value方法---成员方法
4.自动封箱/拆箱都是jdk1.5的特性之一
3.包装类的哈希码值是固定的。
System.out.println(in2.hashCode());——10
System.out.println(dou1.hashCode());——300063655
4.字符串直接转换为基本数据类型 XXX.parseXXX()
5.字符串怎么转换为字符? "".charAt() toCharArray[]
6.补充:包装类在进行计算时,会自动转换为基本数据类型
Integer in2 = new Integer(10);
System.out.println(in2 + 20);——30
7.NaN和任何数都不相等 :System.out.println((0.0 / 0) == (0.0 / 0));——false
8.// 判断数字是否是NaN
1.Double的类方法 :System.out.println(Double.isNaN(0.0 / 0));——true
2.Double的对象方法: System.out.println(new Double(0.0 / 0).isNaN());——true
正无穷 :System.out.println(1.0 / 0);——Infinity
负无穷 :System.out.println(-1.0 / 0);—— -Infinity