Java笔记(3)

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 ---- 参数化类型 


泛型技术 对象 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 c)  ----- 将目标集合c的内容添加到当前set ,? extends E 目标集合是E的子类型 
Set set = new HashSet();
List list = new ArrayList();
set.addAll(list); // list 中 Integer 自动转换为 Number


范例二
TreeSet(Comparator comparator) 
Set set = new TreeSet(); // 默认需要苹果比较器排序 


class FruitComparator implements Comparator {}
Set set = new TreeSet(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




可变参数 ----- 用来编写框架
原理: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、将演员实例类 写入配置文件 


工厂 + 反射 + 配置文件  --- 编写便于扩展、便于维护程序

你可能感兴趣的:(Java,笔记)