学习java的第五周,本周学习的有接口、异常、集合、泛型、Collections类,枚举、包装类
接口
http://t.csdn.cn/83Dlahttp://t.csdn.cn/83Dla
抽象类与抽象方法
抽象类vs普通类
抽象类不能被实例化,但可以创建一个引用变量,其类型是一个抽象类,指向非抽象的子类实例
普通类可以被实例化
抽象方法vs普通方法:有无方法体
抽象类与抽象方法的使用
抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象类
如果子类没有实现父类的所有抽象方法,子类必须被定义为抽象类
没有抽象构造方法,也没有抽象静态方法
抽象类中可以有非抽象的构造方法,创建子类的实例时可能调用
接口
在java中类与类之间是单根继承(一个类只能有一个直接父类)一个类只能继承一个类,但是一个类可以实现多个接口。多个接口之间使用","分隔
接口中的方法只能是抽象方法,默认修饰符是 public abstract
一个类实现了一个接口,必须重写接口中的所有抽象方法,如果不重写,那么实现了类也要定义为抽象类
接口的特性
接口不可以被实例化
实现类必须实现接口的所有方法
实现类可以实现多个接口
implements、多个接口使用逗号隔开
接口中的变量都是静态常量(public static final)
接口创建对象的方式
直接通过接口的实现类构造方法创建对象
USBFan usbf = new USBFan();
usbf.electric();
usbf.data();
通过向上转型创建实现类对象
向上转型:父类(接口)的引用指向实现类的实例
USB usb = new USBFan();
usb.electric();
向下转型
usb = new USBMouse();
usb.electric();
usb.data();
接口的引用不能调用实现类中特有的方法,需要进行向下转型
在向下转型过程中容易出现类型转换异常可以使用instenceof关键字进行类型判断,避免异常
if (usb instanceof USBMouse) {
USBMouse usbs = (USBMouse)usb;
usbs.test();
} else if (usb instanceof USBFan) {
USBFan usbs = (USBFan) usb;
usbs.qwer();
}
面向接口编程
关心实现类有何能力,而不关心实现细节
接口是一种能力
体现在接口的方法上
面向接口的约定而不考虑接口的具体实现
接口是一种约定
有些接口只有名称
接口的使用
接口中的成员变量
默认都是public static final的,必须显式初始化
接口中的方法
默认都是public abstract的
接口没有构造方法,不能被实例化
一个接口不能实现另一个接口,但可以继承多个其他接口
一个类必须实现接口抽象方法(implements),除非这个类也是抽象类
抽象类vs接口
相同点
代表系统的抽象层
都不能被实例化
都能包含抽象方法
用于描述系统提供的服务,不必提供具体实现
不同点
在抽象类中可以为部分方法提供默认实现,而接口中只能包含抽象方法
抽象类便于复用,接口便于代码维护
一个类只能继承一个直接的父类,但可以实现多个接口
使用原则
接口做系统与外界交互的窗口
接口提供服务
接口本身一旦制定,就不允许随意修改
抽象类可完成部分功能实现,还有部分功能可作为系统的扩展点
java中的接口
属性全都是全局静态常量
方法都是全局抽象方法
无构造方法
一个类可以实现多个接口,非抽象类实现接口时必须实现接口中的全部方法
抽象类利于代码复用,接口利于代码维护
接口中的方法—定定义好之后就不要轻易的去修改因为修改接口中的方法,接口的实现类都要对修改的方法进行重新操作,非常麻烦一个类要想新增一个功能,只需要新建一个接口,然后让这个类实现这个新建的接口就可以用这个接口定义的功能
异常
http://t.csdn.cn/Q6MjKhttp://t.csdn.cn/Q6MjK
什么是异常
异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序
什么是异常处理
Java编程语言使用异常处理机制为程序提供了错误处理的能力
Java中如何进行异常处理
Java的异常处理是通过5个关键字来实现的:try、catch、 finally、throw、throws
捕获异常
try----执行可能产生的异常代码
catch----捕获异常
finally-----无论是否发生异常,代码总能执行
声明异常
throws----声明方法可能要抛出各种异常
抛出异常
throw----手动抛出异常
使用try-catch块捕获异常
将可能产生异常的代码放入到try语句结构中,可能会有如下三种情况
1)try结构中的代码不会产生异常,那么catch结构中的代码就不会执行
2)try结构中的代码产生了异常,并且catch结构里的代码能够处理这个异常
那么catch处理完异常后,程序继续往下执行
3)try结构中的代码产生了异常,但是catch结构的代码不能处理这个异常,程序就会被中断
try-catch-finally块
try结构中的代码产生了异常,但是catch结构的代码不能处理这个异常,依然会中断程序的执行,但是我希望不管产生的异常能不能处理, "程序执行完毕"这行代码都会输出
解决方法 在catch结构后面添加一个finally语句块,不管前面的异常有没有处理,finally语句块中的代码都会执行finally语句块中的代码都会执finally语句块中的代码唯一不执行的情况是在前面的try结构或者catch结构中存在退出系统的语句System.exit(1)。
在try结构中或者catch结构中存在return,finally结构里的语句仍然会执行
try结构或者catch结构中的代码,在执行到return语句时,会先去看有没有finally语句,有--输出里面的代码,在返回执行return,没有执行return
printStackTrace()的堆栈跟踪功能显示出程序运行到当前类的执行流程
多重catch块
引发多种类型的异常,可以在try结构后面写多个catch语句块排列catch 语句的顺序:先子类后父类发生异常时按顺序逐个匹配,只执行第一个与异常类型匹配的catch语句
Exception e属于是顶尖硬货,啥都能处理,要放在最后的位置
常见的异常类型
void printStackTrace()-----输出异常的堆栈信息、
String getMessage()-----返回异常信息描述字符串,是printStackTrace()输出信息的一部分
Exception -----异常层次结构的父类
ArithmeticException-----算术错误情形,如以零作除数
ArrayIndexOutOfBoundsException-----数组下标越界
NullPointerException-----尝试访问 null 对象成员
ClassNotFoundException-----不能加载所需的类
IllegalArgumentException-----方法接收到非法参数
ClassCastException-----对象强制类型转换出错
NumberFormatException-----数字格式转换异常,如把"abc"转换成数字
声明异常
throws声明某个方法可能抛出的各种异常,多个异常用逗号隔开
如果在一个方法体中抛出了异常,如何通知调用者?
方式1:调用者处理异常
方式2:调用者继续声明异常
main()方法声明的异常由Java虚拟机处理
抛出异常
使用throw抛出异常
throw与throws
throw
生成并抛出异常
位于方法体内部,可作为单独语句使用
抛出一个异常对象,且只能是一个
throws
声明方法内抛出了异常
必须跟在方法参数列表后面,不能单独使用
声明抛出异常类型,可以跟多个异常
自定义异常
当JDK 中的异常类型不能满足程序的需要时,可以自定义异常类
使用自定义异常的步骤
1.定义异常类(继承Throwable类、继承Excepion 或者RuntimeException)
2.编写构造方法、继承父类的实现
3.实例化自定义异常对象
4.使用throw抛出
异常链
A方法调用B方法时,B方法却抛出了异常。那A方法继续抛出原有的异常还是抛出一个新异常呢?
抛出原有的异常
A方法与B方法进行了关联,不便于代码的修改和扩展
抛出新的异常
异常链创建了新的异常但却保留了原有异常的信息
异常处理原则
异常处理与性能
异常只能用于非正常情况
不要将过于庞大的代码块放在try中
在catch中指定具体的异常类型
需要对捕获的异常做处理
集合
http://t.csdn.cn/zjTV6http://t.csdn.cn/zjTV6
Java集合框架包含的内容
Collection 接口存储一组 不唯一,无序的对象
List 接口存储一组不唯一,有序(插入顺序)的对象
Set 接口存储一组唯一,无序的对象
Map接口存储一组键值对象,提供key到value的映射
List接口的实现类
ArrayList实现了长度可变的数组,在内存中分配连续的空间,遍历元素和随机访问元素的效率比较高
LinkedList采用链表存储方式,插入、删除元素时效率比较高
ArrayList
ArrayList实现了长度可变的数组,在内存中分配连续的空间,遍历元素和随机访问元素的效率比较高
ArrayList类是List接口的一个具体实现类
ArrayList对象实现了可变大小的数组
随机访问和遍历元素时,它提供更好的性能
ArrayList常用方法
boolean add(Object o)
在列表的末尾顺序添加元素,起始索引位置从0开始
void add(int index,Object o)
在指定的索引位置添加元素。索引位置必须介于0和列表中元素个数之间
int size()
返回列表中的元素个数
Object get(int index)
返回指定索引位置处的元素。取出的元素是Object类型,使用前需要进行强制类型转换
boolean contains(Object o)
判断列表中是否存在指定元素
boolean remove(Object o)
从列表中删除元素
Object remove(int index)
从列表中删除指定位置元素,起始索引位置从0开始
LinkedList
LinkedList采用链表存储方式,插入、删除元素时效率比较高
LinkedList类是List接口的一个具体实现类
LinkedList 类用于创建链表数据结构
插入或者删除元素时,它提供更好的性能
Set
Set接口存储一组唯一,无序的对象
HashSet是Set接口常用的实现类
循环方式
增强for循环
Iterator关键字
LinkedList常用方法
void addFirst(Object o)
在列表的首部添加元素
void addLast(Object o)
在列表的末尾添加元素
Object getFirst()
返回列表中的第一个元素
Object getLast()
返回列表中的最后一个元素
Object removeFirst()
删除并返回列表中的第一个元素
Object removeLast()
删除并返回列表中的最后一个元素
Map
Map接口专门处理键值映射数据的存储,可以根据键实现对值的操作
http://t.csdn.cn/EDDVh
http://t.csdn.cn/EDDVh
泛型
将对象的类型作为参数,指定到其他类或者方法上,从而保证类型转换的安全性和稳定性,本质是参数化类型
泛型集合可以约束集合内的元素类型
典型泛型集合ArrayList<E>、HashMap<K,V>
<E>、<K,V>表示该泛型集合中的元素类型
泛型集合中的数据不再转换为Object
泛型的好处
类型安全
消除强制类型转换
潜在的性能收益
Collections类
Java集合框架将针对不同数据结构算法的实现都保存在工具类中
Collections和Collection不同,前者是集合的操作类,后者是集合接口
Collections类常用方法
sort():排序 binarySearch():查找 max()\min():查找最大\最小值
枚举
枚举的优点
类型安全
易于输入
代码清晰
包装类
包装类把基本类型数据转换为对象 每个基本类型在java.lang包中都有一个相应的包装类
包装类的作用
提供了一系列实用的方法
集合不允许存放基本数据类型数据,存放数字时,要用包装类型
包装类的构造方法
所有包装类都可以将与之对应的基本数据类型作为参数,来构造他们的实例
除Character类外,其他包装类可将一个字符串作为参数构造它们的实例Number类型包装类使用字符串作为参数构造实力的时候,字符串需要能够转化成数字的字符串,否则就会报错(NumberFormatException)数据格式化异常
Boolean类构造方法参数为String类型时,若该字符串内容为true(不考虑大小写),则该Boolean对象表示true,否则表示false
当Number包装类构造方法参数为String 类型时,字符串不能为null,且该字符串必须可解析为相应的基本数据类型的数据,否则编译不通过,运行时会抛出NumberFormatException异常