1. 静态导入:
1) import语句可以导入一个类或者某个包中的所有类
2) import static语句导入一个类中的某个静态方法或者所有静态方法
2. 可变参数:一个方法接受的参数个数不固定
1) 只能出现在参数列表的最后
2) …位于变量类型和变量名,前后有无空格都可以
3) 调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体重以数组的形式访问可变参数
3. 增强for循环
1) 语法:for(type 变量名 : 集合变量名){…}
2) 注意事项:
i. 迭代变量必须在()中定义
ii. 集合变量可以是数组或实现了Iterable接口的集合类
4. 基本数据类型的自动拆箱与装箱
1) 自动装箱:Integer num1 = 12;
2) 自动拆箱:System.out.println(num1 + 12);
3) 基本数据类型的对象缓存:在-128~127之间的都相等,会产生缓存,不在创建对象,大于127的不会产生缓存
4) 享元模式:有很多个小的对象,它们有很多的属性相同,那么就把它们变成一个对象,那些不同的属性变成方法的参数,称之为外部状态,相同的属性称为内部状态。
5. 枚举
1) 理解:枚举就是让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错,枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标
2) 总结:枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象
3) 应用:
i. 枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法
ii. 枚举元素必须位于枚举体中的最开始部分,枚举元素列表后要有分号与其他成员分割,把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误
4) 带构造方法的枚举:
i. 构造方法必须定义成私有化
ii. 如果有多个构造方法,根据传入的参数确定使用哪个构造方法
iii. 枚举元素MON和MON()的效果一样,都是调用默认的构造方法
6. 注解:(见下文)
7. 泛型:(见下文)
二、反射
1) Class类:
i. Class类代表Java类,对应各个类在内存中的字节码
ii. 字节码:一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以它们在内存中的内容是不同的,这一个个的空间可以分别用一个个的对象表示
iii. 获取字节码对应的实例对象:
类名.class
对象.getClass()
Class.forName(“类名”)
iv. 九个预定义Class实例对象:boolean.class、char.class、byte.class、short.class、int.class、long.class、float.class、double.class、void.class
2) 反射:
i. 理解:反射就是把Java类中的各种成分映射成相应的java类
ii. 一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示,变量(Field)、方法(Method)、构造方法(Constructor)、包(Package)
3) Constructor类:
i. Constructor类代表某个类中的一个构造方法
ii. 得到某个类所有的构造方法:Constructor[] constructors = Class.forName(“java.lang.String”).getConstrutors();
iii. 得到某一个构造方法:Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);
iv. 创建实例对象:
通常方法:String str = new String(new StringBuffer(“abc”));
反射方法:String str = (String)constructor.newInstance(new StringBuffer(“abc”));
v. Class.newInstance()方法:该方法内部先得到默认的构造方法,然后,用该构造方法创建实例对象
4) Field类:
i. Field类代表某个类中的一个成员变量
ii. 得到的Field对象对应到类上面的成员变量
5) Method类:
i. Method类代表某个类中的一个成员方法
ii. 得到类中的某一个方法:Method charAt = Class.forName(“java.lang.String”).getMethod(“charAt”,int.class);
iii. 调用方法:
通常方式:System.out.println(str.charAt(1));
反射方式:System.out.println(charAt.invoke(str,1));(如果传递给Method对象的invoke()方法的第一个参数为null,说明该Method对象对应的是一个静态方法)
6) 数组的反射:
i. 具有相同维数和元素数据类型的数组属于同一个类型,即具有相同的Class实例对象
ii. 代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class
iii. 基本类型的一维数组可以被当做Object类型使用,不能当作Object[]类型使用;非基本类型的一维数组,既可以当作Object类型使用,又可以当作Object[]类型使用
7) 反射的作用:实现框架功能
i. 框架与工具类的区别:工具类被用户的类调用,框架则是调用用户提供的类