学习内容:
异常, 数组, 常用类, 集合, IO流, 线程, 反射, 网络编程
1 类与类之间的关系
类与类之间的关系: 泛化(继承), 实现, 依赖, 关联, 聚合, 组合
1)泛化
就是继承, 子类继承父类, 子接口继承父接口
2)实现
一个类实现了某个接口
3)依赖
在A类中, 使用B类作为方法的返回值类型, 作为方法的形参类型, 作为局部变量的类型, 称A类依赖B类
4)关联
在A类中,使用B类定义了成员变量, 称A类关联B类
5)聚合
聚合是关联的一种, A类由若干的B类组成,但是A类不能决定B类的生命周期, 称A是由B聚合而成
6)组合
是关联的一种, A类由若干B类组成, A类可以决定B的生命周期
类与类之间的关系:
is a , 子类 is a 父类, 是一种继承关系, 父类是通用类(一般类),子类是特殊类, 也只有符合is a 关系的两个类才可以使用继承
like a , 类 like a 接口, 是一种实现关系
has a, A类 has a B类, 是一种关联关系
2 内部类
可以在A类的类体中定义一个B类, 称B类为内部类, 称A类为外部类
内部类编译之后也会生成单独的字节码文件: 外部类名$内部类名.class
内部类分为:
成员内部类, 静态内部类, 局部内部类, 匿名内部类
class A{
//成员内部类
class B1 {}
//静态内部类
static class B2{}
void method1 () {
//局部内部类
class B3{}
}
}
2.1 成员内部类
是属于某个外部类对象的
class Outer{
int xx = 10 ; //实例变量
class Inner{} //成员内部类
}
2.2 静态内部类
class Outer{
static int xx = 10 ; //静态变量
static class Inner{} //静态内部类
}
2.3 局部内部类
class Outer{
public void m1(){
int xx = 123; //局部变量
class Inner{}; //局部内部类
}
}
2.4 匿名内部类
匿名内部类就是没有类名的内部类
匿名内部类的定义与匿名内部类对象的创建是一起的
应用场景:
当某个成员内部类只使用一次时, 可以使用匿名内部类
抽象类的引用/接口引用可以指向匿名内部类对象
3 异常
3.1 异常概述
异常就是在程序的运行过程中出现的不正常现象.
之前遇到的异常:
空指针异常: NullPointerException
类型转换异常: ClassCastException
算术异常: ArithmeticException
在Java中, 对出现的异常现象使用类进行描述, 异常相关的类:
什么是受检异常?
在方法定义时, 通过throws声明抛出的异常就是受检异常. 在调用方法时,必须对这个受检异常进行预处理,否则编译报错.
3.2 异常处理
3.2.1 try…catch捕获处理
语法:
try{
可能产生异常的代码块
如何代码块中的某条语句产生了异常, 立即跳转到对应的catch子句执行, 这条语句后面try代码块不再执行
代码块中可能会产生多个异常, 可以通过多个catch子句进行分别捕获处理
}catch( 异常类型1 e1){
对异常类型1的异常进行处理
} catch( 异常类型2 e1){
对异常类型2的异常进行处理
在开发时,一般的处理方式就是把异常栈的跟踪信息打印到屏幕上; 部署后,一般把异常打印到日志文件中.
}finally{
不管是否产生异常, finally子句总是会执行
一般在finally子句中用来释放系统资源
}
try…catch…finally中的各个子句都不能单独使用, 可以是try…catch…, 可以是try…finally, 也可以是try…catch…finally.
final,finalize, finally的区别
3.2.2 throws抛出
语法:
[方法修饰符] 返回值类型 方法名(参数列表) throws 异常类型{
方法体
}
throws与try…catch的选择?
1)如果作为方法的调用者, 被调用的方法声明抛出了异常, 一般进行try…catch捕获处理
2)如果作为方法的定义者, 在方法体中,可以throw抛出一个异常对象, 方法声明位置需要通过thorws声明抛出一个异常, 提醒当前方法的调用者,可能会出现异常.
3)作为方法的定义者, 如果在方法体中调用了其他方法, 被调用的方法有异常抛出, 也可以在方法的声明位置继续声明抛出该异常, 谁调用谁处理
3.3 方法覆盖中的异常
方法覆盖的原则:
1)方法签名(方法名与参数列表)必须一致.
2)方法的返回值类型, 如果不是引用类型也必须相同, 如果是引用类型, 子类方法的返回值类型可以是父类方法返回值类型的子类型.
3)子类方法的访问权限可以比父类方法的访问权限更宽泛.
如果父类方法使用public修饰,子类方法只能使用public修饰
如果父类方法使用protected修饰,子类方法可以使用protected/public修饰
如果父类方法没有访问权限修饰符,子类和父类如果在同一个包中, 子类方法可以使用protected/public修饰,也可以没有权限修饰符; 如果子类和父类不在同一个包中, 不能覆盖.
如果父类方法使用private修饰, 不能覆盖
4)如果父类方法没有声明抛出异常, 子类方法也不能声明抛出异常; 如果父类方法声明抛出了异常,子类方法可以声明抛出相同的异常, 也可以声明抛出父类方法异常的子异常, 也可以不抛出异常
3.4 异常在开发中的实际应用
自定义异常
1)定义一个类继承Exception
2)提供两个构造方法
3)通过throw抛出一个异常对象
4)throw所在的方法通过throws声明一个异常
5)调用方法时,对异常进行处理