JAVA复习
一、面向对象
继承
主要作用:让类与类产生了父子的关系,子对父类的的属性和方法进行引用
封装
对对象的属性,方法进行统一的管理,利于代码的复用,更好的体现万物皆对象。
多态
继承和实现接口都是多态的体现,多态主要是为了对原有的方法进行扩展和维护
抽象类与接口
区别:
抽象类中既有抽象方法,也有非抽象方法,抽象类中如果有一个方法是抽象方法,那这个类就是抽象类,抽象类要求继承他的子类必须实现所有的抽象方法
接口:接口中所有的方法都是抽象方法,实现他的子类必须实现其所有的抽象方法
方法重写和重载
区别:
方法重写又称覆盖,要求要写的方法和父类的方法必须完全一至
方法重载:要求方法名相同,参数类型不同,修饰符比和原方法一致或比原先的权限大,对返回值没有要求。
二、集合
结构:
java.util
接口 Collection<E>
-
所有超级接口:
- Iterable<E>
java.util
接口 List<E>
-
所有超级接口:
- Collection<E>, Iterable<E>
-
所有已知实现类:
- , ArrayList, LinkedList, Vector
java.util
接口 Set<E>
-
所有超级接口:
- Collection<E>, Iterable<E>
-
所有已知子接口:
- SortedSet<E>
-
所有已知实现类:
- , HashSet, LinkedHashSet, TreeSet
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
java.util
接口 Map<K,V>
-
所有已知实现类:
- HashMap, Hashtable, LinkedHashMap, TreeMap
List.Set.Map各自特性:
List存储的是不唯一的、有序的集合元素。
Set存储的是唯一的、无序的集合元素。
Map是以键值对的形式存储元素。
总结:
List
集合接口List、Set继承自接口collection.接口collection继承自Iterator接口
List的实现类有ArrayList,Vector,LinkedList。
各自特性:
ArrayList 以数组方法存储数据,是不同步的,非线程安全的,操作数据速度较快
Vector存储数据是使用的是同步的方法,是线程安全的,操作数据速度较慢
LinkedList 是以链表的形式存储数据,存储进去的数据是按自然顺序排列的,取出的时候也是按自然顺序排列,因为是链表的形式存储,所以操作时面的数据速度较快,但查询数据较慢
Set
Set的实现类有HashSet,TreeSet,LinkedHashSet
各自特性:
HashSet是按Hash算法存储一组唯一的,无序的元素,内部实现了equals()和和hashCode()方法
TreeSet在存储的数据的时候,会先对数据过行排序后再进行存储,实现了Comparable接口,并复写了Compare和CompareTo方法
LinkedHashSet:存储数据的时候按自然顺序存储一组唯一的,有序的元素
Map
Map的实现类有:HashMap,HashTable,TreeMap,LinkedHashMap;
HashMap 以键值对的形式 存储键为唯一,值不唯一的集合元素,父类为AbstractMap,非线程安全,键可以允许一个空键
HashTable 以键值对的形式 存储键为唯一,值不唯一的集合元素,父类为Dictionary是线程安全 来自于1.2之前
TreeMap:以键值对的形式,存储数据的时候会先对元素进行排序后再储存
LinkedHashMap::以键值对的形式,按自然顺序储存集合元素
三、范型
范型的使用:
当一个集合需要固定类型的值,而不想要其它类型的时候,可以将这个集合定义为范型。在执行添加方法的时候必须添加定义好的数据类型,如果定义别的类型,则会编译异常。在取出范型集合元素的时候不用再对类型进行强制转换
使用注意:范型在编译完成后,字节码文件会去掉范型的定义。这时如果使用反射向集合中添加值,则可以不受范型类型限制。
四、文件流
文件流类型:Reader Writer InputStream OutputStream
Reader 字符流读取---对字符文件操作---对应的缓存流BufferedReader
Writer 字符流写入---对字符文件操作---对应的缓存流BufferedReader
InputStream 字节流读取---对二进制文件操作---对应的缓存流BufferedReader
OutputStream 字节流写入---对二进制文件操作---对应的缓存流BufferedReader
InputStreamReader 将输入流转换为字符流(主要用于字符设置或更改字符编码)
OutputStreamWriter 将字符流转换为字节流输出(主要用于字符设置或更改字符编码)
Reader实现类
FileReader StringReader CharArrayReader
Writer实现类
CharArrayWriter,OutputStreamWriter,StringWriter ,FileWriterPrintWriter
PrintWriter
将字符流文件写到不同的目标当中(控制台、输出字符流、输出字节流、文件)
InputStream
ByteArrayInputStream,FileInputStream,ObjectInputStream,SequenceInputStream,StringBufferInputStream
SequenceInputStream 组合流,可以将多个输入流通过输入流整合成一个输入流,对输入流进行操作
PipedInputStream 管道输入流 主要用到两个线程这之前传输文件或数据
OutputStream
ByteArrayOutputStream
,DataOutputStream
,PrintStream
PrintStream
将字节流文件写到不同的目标当中(控制台、输出字节流、文件)
PipedoututStream 管道输入流 主要用到两个线程这之前传输文件或数据
五、异常
结构:
java.lang
类 Throwable
java.lang.Object java.lang.Throwable
-
所有已实现的接口:
- Serializable
异常与错误的区别:
Error异常是一般是系统异常,不是不可修复,但是修复起来非常困难的,遇到此类的异常一般程序都不再往下执行,常用的错误异常有OutOfMemoryError
Exception 异常一般是由程序设计不当而引起的,是可以修复的异常
Exception分为运行时异常和非运行异常
非运行异常必须要被处理,抛出或try处理
运行异常可以不抛出或处理,但程序如果遇到运行时异常的时候会报错,终止程序的进行,如果不抛出,一般用来提醒调用人的调用错误,常见的运行时异常有:
NullPointerException、indexOutOfException、metodNotFoundException等
异常处理:
try处理
1、try{}catch{}fannlly{}
2、try{}catch{}
3、try{}finnally{}
4、throw
throws throws处理
throw 用于方法中 抛出异常、后面跟的是对象
throws 用于方法后面,用于声明异常、后面跟的是方法实体,声明的多个异常之间用逗号分隔
六、反射
反射就使用方法,通过字节码将一个对象中的所有元素映射成相应的类。
取得有参构造 类的字节码.getContractor(构靠中参数字节码.....);
取得无参构造 类的字节码.getContractor();
取得方法 类的字节码.getMethod();
取得参数 类的字节码.getDeclaredFields(); 修饰符私有的也可以取得 但是设置setAccessible为true
取得参数 类的字节码.getFields(); 修饰符 必须取得公有的才可以取得
取得包 getPackage();
数组反射(通过对象Array进行反射读取)
如果数组的位数(都是一维或二维)并且类型一致的话,那么这两个数组的字节码相同
数组反射示例:
- int[] a = new int[] { 1, 2, 3 };
- String[] b = new String[] { "a", "c", "b" };
- System.out.println(Arrays.asList(a));
- System.out.println(Arrays.asList(b));
- Class cl = a.getClass();
- if (cl.isArray()) {
- for (int i = 0; i < Array.getLength(a); i++) {
- System.out.println(Array.get(a, i));
- }
- }
基本类型不是Object类型,数组和String都是object类型,二维数组是Object类型,因为二维数组里面存放的一个数组,数组是object类型的
因为int是基础类型而不是Object类型,在jdk1.5中该方法要求传入一个Object数组,因为不是Object数组,所以会返回jdk1.4处理,并返回一个数组对象。
而String是object所以此方法会直接将String数组转换成List并打印出来
七、动态代理
代理:就是对某个对象的某个方法使用代理的对象,进行方法增强,对方法增加特定的代理功能,以及对原方法参数进行改变,实现对原方法的控制
代理的核心方法是invoketionHander对象的invoke方法,当对象执行特定方法的时候,会找到invoketionHander对象的invoke()方法,并执行
添加代码可以在原方法的前面、后面、前面和后面、异常产生时添加代理方法
示例:
Collection coll = (Collection)Proxy.newProxyInstance(Collection.class
.getClassLoader(), new Class[]{Collection.class},
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
Object o = method.invoke(list, args);
return o;
}
});
coll.add("aa");
八、注解
九、类加载器
十、网络编程
十一、多线程
十二、内部类
十三、枚举
十四、设计模式