day1 - day2 XML 技术 (语法、约束、解析)
约束和解析 DTD Schema DOM SAX STAX
JAXP 、XMLPULL
day3 java基础加强 (第一部分) ---- 第二部分 day25
Java5.0 新特性
反射技术
第二部分 day25
动态代理
注解技术
多线程编程
网络socket
最新Java7.0 ----> Java1.0 Java1.1 ---- > Java1.2 (Java2 将 java分为 j2se j2ee j2me) --> java1.3 --- java1.4 --- java5.0 (将分为三个版本 改名 javase javaee javame) --- > java6.0 ---- java7.0
泛型 --- 通用类型
由来 : java语言 开发者 一批C++ 工程师 ,在c++ 语法中 模板技术 ----- java泛型由来
应用 : 1、类型安全检查 2、编写通用java程序(java框架)
JDK5 之前集合对象使用问题: 1、向集合添加任何类型对象 2、从集合取出对象时,数据类型丢失,使用与类型相关方法,强制类型转换
* 程序存在安全隐患
泛型语法: List<泛型类型> 规定 List集合中元素类型 ,取出集合中元素时,获得具体数据类型元素(不需要进行类型强制转换 )
* 泛型技术 只是 编译器阶段技术,为javac命令 起到类型安全检查作用 ,生成.class文件后,泛型信息将会被 擦除
List<String> ---- 参数化类型
泛型技术 对象 List 、Set 、Map中元素 进行类型安全约束
* 掌握 遍历 使用 类型安全 List 、Set 、Map
使用泛型的对象进行类型转换时,等号两端对象使用泛型类型 必须一致!
使用泛型编写一些通用java程序 : 结合反射技术一起使用 ----- 自定义泛型
1、定义泛型方法,必须在方法的返回值之前进行 泛型类型声明 <泛型类型>
* 编写一个通过数组交换元素方法
* 编写一个通过数组倒序方法
2、在类名后声明类的泛型,当类的泛型使用后,该类中所有方法都可以直接使用泛型 ------ 在类名后 <泛型类型> ---- 不对static方法生效
* 对应泛型类型参数起名 T E K V ---- 泛型类型可以以任意大写字母命名,建议你使用有意义的字母
T Template E Element K key V value
泛型通配符 ---- > ?
泛型 : 任意类型
?:任意泛型类型
通过上下边界,限制通配符类型范围:
? extends Number ----> Number任意子类型 (包含Number)
? super String ---- > String任意父类型 (包含String)
* 上下边界不能同时使用
? extends Object super Integer ----- 没有这么写的
上下边界应用:
范例一
Set 中 addAll(Collection<? extends E> c) ----- 将目标集合c的内容添加到当前set ,? extends E 目标集合是E的子类型
Set<Number> set = new HashSet<Number>();
List<Integer> list = new ArrayList<Integer>();
set.addAll(list); // list 中 Integer 自动转换为 Number
范例二
TreeSet(Comparator<? super E> comparator)
Set<Apple> set = new TreeSet<Apple>(); // 默认需要苹果比较器排序
class FruitComparator implements Comparator<Fruit> {}
Set<Apple> set = new TreeSet<Apple>(new FruitComparator()); // 需要Apple比较器 ,传入 Fruit比较器
小结 泛型
1、 泛型用来在编译阶段 对集合对象进行类型安全检查 ---- 遍历 类型安全List Set Map
2、 泛型技术 结合 反射 编写通用java程序 ---- 定义通过数组交换位置方法、倒序方法 --- 抽取泛型类中
3、 泛型的通配符 和 上下边界 --- 在javaAPI中有很多应用,了解即可
枚举 ----- 用来对一定范围内的值 进行取值
枚举语法 : enum 枚举类名称 { 枚举对象实例,枚举对象实例... ; }
* 可读性良好、阻止非法数据
案例:员工和角色案例 ----枚举技术由来
* 应用 :多个固定取值范围中 取一个值 , 三选一效果
Java数据类型有几种:两大种 引用数据类型 原始数据类型
引用数据类型 :interface class 数组 enum
原始数据类型 :8种
每一个枚举值 在编译.class文件后,成为枚举成员对象(常量)
枚举类构造器 必须private 的
JDK5 switch 可以接受五种数据 类型 byte 、short 、int 、char、enum
JDK7 switch 可以接受六种 : 多了一种String
单例设计模式写法
1、私有构造器
2、private static 成员对象
3、public static 获得成员对象方法
* 懒汉式 和 饿汉式
饿汉:在创建对象时 直接进行初始化
懒汉:在获取对象时 进行初始化
* 在枚举实例定义过程中,向枚举构造器传入参数,通过匿名内部类实现枚举中抽象方法
星期输出中文案例:两种写法
枚举 API
从Enum 继承了很多方法 :
1、name 获得对象名称
2、ordinal 获得对象 下标
3、valueOf(Class,String) 将String类型 枚举对象名称 转换对应Class类型枚举对象
在javac执行编译后,在.class文件中生成两个新的方法
4、values 获得所有枚举对象实例数组
5、valueOf(String) 将String类型 枚举名称 --- 转换 枚举对象
* 能力: 可以枚举实例、下标、名称直接 互相转换
静态导入 static import 导入 某个类静态成员 (属性和方法),导入静态成员,在类中可以直接使用
* 虽然静态导入 简化编程,可读性变差 ,导入冲突方法,静态导入不可用
掌握JDK5 之前 自动装拆箱 效果代码写法
foreach循环语句 (for/in语句)
引入原因:替换Iterator复杂写法,本质就是Iterator
foreach语句主要应用:
1、遍历数组
2、遍历Collection 集合对象
如果一个对象 使用forin语句中,该对象 必须满足两个条件
1、类 必须实现 Iterable 接口
2、类 实现 iterater 方法
* 编写Car 让 Car对象用于forin 语句
for/in 实现 就是 Iterator !!!!!!!!!
移除练习
”abc”,”bcd”,”asf”,”ceg”,”daf”,”dfs” 移除所有包含a 字符串
使用迭代器和for/in 进行list循环 ,删除元素时 : java.util.ConcurrentModificationException
1、解决方案:使用Iterator自带 remove方法
2、如果只删除一个元素,可以forin语句删除元素后,通过break跳出循环
3、使用解决这类异常线程安全集合 CopyOnWriteArrayList<E>
可变参数 ----- 用来编写框架
原理:int... args 相当于 int[] args , 调用可变参数方法时,传入任意个数参数,任意个数参数都会被保存参数数组中
例如:add(int... args)
add(10,20) ----- > add(new int[]{10,20});
add(20,30,40) ----- > add(new int[]{20,30,40});
add() ------- add(new int[] {});
* 可变参数只能处于参数列表的最后, 所以一个方法最多只能有一个长度可变的参数
如果你想编写高效,功能强大java程序 必须使用反射技术 。
* 反射技术应用:编写框架,通用性很强程序
Class
获得Class对象的三种方法
1、已知类 --- 类名.class获得
2、已知对象 ---- 对象.getClass获得
3、完整类名String格式 ---- Class.forName(完整类名)
* 最常用第三种
通过类字节码对象获得构造器、成员变量、方法 ---- 都各有两个方法
1、获得所有 getConstructors()
2、获得指定 getConstructor(Class<?>... parameterTypes) ---- 参数 构造方法 参数类型字节码对象
Constructor ---- 通过Constructor 创建 字节码对应类 对象
* newInstance(Object... initargs)
在使用Constructor,newInstance() 无参数构造器 ------ 等价于
Field
Field[] fields = c.getDeclaredFields(); 获得当前类声明所有成员变量 包括private
Field name = c. getDeclaredField("name"); 获得当前类中指定名称 成员变量 包括private
* 如何操作private 属性 设置 属性可访问 field.setAccessable(true);
通过Field中 get(Object) 获得指定对象属性值 set(Object,value) 设置指定对象属性值
Method
getDeclaredMethods() 获得所有当前类声明方法
getDeclaredMethod(String name, Class<?>... parameterTypes) 获得指定名称方法
通过Method类 提供 invoke(Object obj,Object... args) 执行方法
案例:晚会案例
1、编写晚会程序,测试程序
2、为了程序更好维护和扩展 , 做什么与怎么做 分离
问题:在晚会类 维护所有出演演员 ---- 不想修改晚会类 ---- 工厂结构 (中介)
3、用工厂 将 做什么 与 怎么做 进行解耦合
4、将演员实例类 写入配置文件
工厂 + 反射 + 配置文件 --- 编写便于扩展、便于维护程序
约束和解析 DTD Schema DOM SAX STAX
JAXP 、XMLPULL
day3 java基础加强 (第一部分) ---- 第二部分 day25
Java5.0 新特性
反射技术
第二部分 day25
动态代理
注解技术
多线程编程
网络socket
最新Java7.0 ----> Java1.0 Java1.1 ---- > Java1.2 (Java2 将 java分为 j2se j2ee j2me) --> java1.3 --- java1.4 --- java5.0 (将分为三个版本 改名 javase javaee javame) --- > java6.0 ---- java7.0
泛型 --- 通用类型
由来 : java语言 开发者 一批C++ 工程师 ,在c++ 语法中 模板技术 ----- java泛型由来
应用 : 1、类型安全检查 2、编写通用java程序(java框架)
JDK5 之前集合对象使用问题: 1、向集合添加任何类型对象 2、从集合取出对象时,数据类型丢失,使用与类型相关方法,强制类型转换
* 程序存在安全隐患
泛型语法: List<泛型类型> 规定 List集合中元素类型 ,取出集合中元素时,获得具体数据类型元素(不需要进行类型强制转换 )
* 泛型技术 只是 编译器阶段技术,为javac命令 起到类型安全检查作用 ,生成.class文件后,泛型信息将会被 擦除
List<String> ---- 参数化类型
泛型技术 对象 List 、Set 、Map中元素 进行类型安全约束
* 掌握 遍历 使用 类型安全 List 、Set 、Map
使用泛型的对象进行类型转换时,等号两端对象使用泛型类型 必须一致!
使用泛型编写一些通用java程序 : 结合反射技术一起使用 ----- 自定义泛型
1、定义泛型方法,必须在方法的返回值之前进行 泛型类型声明 <泛型类型>
* 编写一个通过数组交换元素方法
* 编写一个通过数组倒序方法
2、在类名后声明类的泛型,当类的泛型使用后,该类中所有方法都可以直接使用泛型 ------ 在类名后 <泛型类型> ---- 不对static方法生效
* 对应泛型类型参数起名 T E K V ---- 泛型类型可以以任意大写字母命名,建议你使用有意义的字母
T Template E Element K key V value
泛型通配符 ---- > ?
泛型 : 任意类型
?:任意泛型类型
通过上下边界,限制通配符类型范围:
? extends Number ----> Number任意子类型 (包含Number)
? super String ---- > String任意父类型 (包含String)
* 上下边界不能同时使用
? extends Object super Integer ----- 没有这么写的
上下边界应用:
范例一
Set 中 addAll(Collection<? extends E> c) ----- 将目标集合c的内容添加到当前set ,? extends E 目标集合是E的子类型
Set<Number> set = new HashSet<Number>();
List<Integer> list = new ArrayList<Integer>();
set.addAll(list); // list 中 Integer 自动转换为 Number
范例二
TreeSet(Comparator<? super E> comparator)
Set<Apple> set = new TreeSet<Apple>(); // 默认需要苹果比较器排序
class FruitComparator implements Comparator<Fruit> {}
Set<Apple> set = new TreeSet<Apple>(new FruitComparator()); // 需要Apple比较器 ,传入 Fruit比较器
小结 泛型
1、 泛型用来在编译阶段 对集合对象进行类型安全检查 ---- 遍历 类型安全List Set Map
2、 泛型技术 结合 反射 编写通用java程序 ---- 定义通过数组交换位置方法、倒序方法 --- 抽取泛型类中
3、 泛型的通配符 和 上下边界 --- 在javaAPI中有很多应用,了解即可
枚举 ----- 用来对一定范围内的值 进行取值
枚举语法 : enum 枚举类名称 { 枚举对象实例,枚举对象实例... ; }
* 可读性良好、阻止非法数据
案例:员工和角色案例 ----枚举技术由来
* 应用 :多个固定取值范围中 取一个值 , 三选一效果
Java数据类型有几种:两大种 引用数据类型 原始数据类型
引用数据类型 :interface class 数组 enum
原始数据类型 :8种
每一个枚举值 在编译.class文件后,成为枚举成员对象(常量)
枚举类构造器 必须private 的
JDK5 switch 可以接受五种数据 类型 byte 、short 、int 、char、enum
JDK7 switch 可以接受六种 : 多了一种String
单例设计模式写法
1、私有构造器
2、private static 成员对象
3、public static 获得成员对象方法
* 懒汉式 和 饿汉式
饿汉:在创建对象时 直接进行初始化
懒汉:在获取对象时 进行初始化
* 在枚举实例定义过程中,向枚举构造器传入参数,通过匿名内部类实现枚举中抽象方法
星期输出中文案例:两种写法
枚举 API
从Enum 继承了很多方法 :
1、name 获得对象名称
2、ordinal 获得对象 下标
3、valueOf(Class,String) 将String类型 枚举对象名称 转换对应Class类型枚举对象
在javac执行编译后,在.class文件中生成两个新的方法
4、values 获得所有枚举对象实例数组
5、valueOf(String) 将String类型 枚举名称 --- 转换 枚举对象
* 能力: 可以枚举实例、下标、名称直接 互相转换
静态导入 static import 导入 某个类静态成员 (属性和方法),导入静态成员,在类中可以直接使用
* 虽然静态导入 简化编程,可读性变差 ,导入冲突方法,静态导入不可用
掌握JDK5 之前 自动装拆箱 效果代码写法
foreach循环语句 (for/in语句)
引入原因:替换Iterator复杂写法,本质就是Iterator
foreach语句主要应用:
1、遍历数组
2、遍历Collection 集合对象
如果一个对象 使用forin语句中,该对象 必须满足两个条件
1、类 必须实现 Iterable 接口
2、类 实现 iterater 方法
* 编写Car 让 Car对象用于forin 语句
for/in 实现 就是 Iterator !!!!!!!!!
移除练习
”abc”,”bcd”,”asf”,”ceg”,”daf”,”dfs” 移除所有包含a 字符串
使用迭代器和for/in 进行list循环 ,删除元素时 : java.util.ConcurrentModificationException
1、解决方案:使用Iterator自带 remove方法
2、如果只删除一个元素,可以forin语句删除元素后,通过break跳出循环
3、使用解决这类异常线程安全集合 CopyOnWriteArrayList<E>
可变参数 ----- 用来编写框架
原理:int... args 相当于 int[] args , 调用可变参数方法时,传入任意个数参数,任意个数参数都会被保存参数数组中
例如:add(int... args)
add(10,20) ----- > add(new int[]{10,20});
add(20,30,40) ----- > add(new int[]{20,30,40});
add() ------- add(new int[] {});
* 可变参数只能处于参数列表的最后, 所以一个方法最多只能有一个长度可变的参数
如果你想编写高效,功能强大java程序 必须使用反射技术 。
* 反射技术应用:编写框架,通用性很强程序
Class
获得Class对象的三种方法
1、已知类 --- 类名.class获得
2、已知对象 ---- 对象.getClass获得
3、完整类名String格式 ---- Class.forName(完整类名)
* 最常用第三种
通过类字节码对象获得构造器、成员变量、方法 ---- 都各有两个方法
1、获得所有 getConstructors()
2、获得指定 getConstructor(Class<?>... parameterTypes) ---- 参数 构造方法 参数类型字节码对象
Constructor ---- 通过Constructor 创建 字节码对应类 对象
* newInstance(Object... initargs)
在使用Constructor,newInstance() 无参数构造器 ------ 等价于
Field
Field[] fields = c.getDeclaredFields(); 获得当前类声明所有成员变量 包括private
Field name = c. getDeclaredField("name"); 获得当前类中指定名称 成员变量 包括private
* 如何操作private 属性 设置 属性可访问 field.setAccessable(true);
通过Field中 get(Object) 获得指定对象属性值 set(Object,value) 设置指定对象属性值
Method
getDeclaredMethods() 获得所有当前类声明方法
getDeclaredMethod(String name, Class<?>... parameterTypes) 获得指定名称方法
通过Method类 提供 invoke(Object obj,Object... args) 执行方法
案例:晚会案例
1、编写晚会程序,测试程序
2、为了程序更好维护和扩展 , 做什么与怎么做 分离
问题:在晚会类 维护所有出演演员 ---- 不想修改晚会类 ---- 工厂结构 (中介)
3、用工厂 将 做什么 与 怎么做 进行解耦合
4、将演员实例类 写入配置文件
工厂 + 反射 + 配置文件 --- 编写便于扩展、便于维护程序