1.反射
Person p = new Student();
List<Student> list = new ArrayList();//编译时是List类型,但是运行时实际上是ArrayList
public void test(Object o){}
为什么要使用反射
安全性会高,在用户运行时就可以知道要返回什么类型
反射的步骤
1.获取Class对象
共有3种方式:
1.实例对象可以直接调用它的getClass方法;
Class class2 = new Server().getClass();
2.类可以直接通过类的class属性去获取Class对象;
Class class1 = ServerSocket.class;
3.如果不知道具体的类或实例,可以通过Class的forName静态方法
Class.forName("com.briup.chap11.Server"); //注意要传入包名+类名的权限定名,否则会报ClassNotFound异常
2.获取Class中的方法————通过API
2.集合
集合实际上就是一种容器
在util包底下,代表一种工具,而事实上集合就是一种存放对象的工具
1.集合体系
iterator
-->collection
-->Set-----需要注意TreeSet的排序规则
-->HashSet
不需要指定排序规则
通过HashCode短路与equals来进行排序
-->TreeSet
需要指定排序
自然排序 让元素自身具备比较性
客户端排序 让Set集合具有比较性
需要导入util包,实现Comparable接口,但是需要使用匿名内部类来定义,因为只需要使用一次
-->List-----需要注意几个实现类的特性比较
-->ArrayList
-->LinkedList
-->Vector
本质上ArrayList是由数组作为底层实现,查找快
LinkedList和Vector利用链表实现,操作(增删改)快
但LinkedList不安全,效率高
Vector安全,效率低
-->Queue
-->map-----内部接口Entry<Key,Value>
-->HashMap
键和值都可以为null,不安全,效率高
-->TreeMap
-->HashTable
键和值不可以为null,较为安全,效率低
3.泛型
泛型只是在编译中起作用,在运行时会自动将泛型信息擦除
因此,泛型不是类
4.异常
给用户提供一个有用的信息
应当注意两个关键字
1.throws 跟在方法体前面,参数列表后面
2.throw 在哪产生,在哪抛出,一般不去处理
5.线程——主要为了解决多并发问题
1.生命周期
1.新建
1>继承thread类 2>实现Runnable接口
2.就绪
线程启动.start();
3.运行
4.阻塞
5.死亡
6.IO流
1.字符流 BufferReader-->包装字符流
如果只有字节流的情况下,需要用桥流InputStreamReader转换成字符流
new BufferReader(new InputStreamReader(socket.getInputStream()))
2.字节流 FileInputStream
new FileInputStream(File)
3.对象流 Object
最常用的是序列化,需要实现序列化接口-->Serializable