一、抽象类:
访问修饰符 abstract class 类名{
}
抽象类和普通类的区别:
1、 抽象类不能被实例化
2、 抽象类一般含有抽象方法
抽象方法:在抽象类中只有方法签名(方法声明),没有方法实现,具体实现在继承了该抽象类的子类中实现
3、 抽象类可以没有抽象方法,但是一旦某个类有了一个抽象方法,那么该类一定是一个抽象类
4、 抽象类的特殊形式:没有抽象方法的类和所有方法都是抽象方法的类
5、 子类一旦继承抽象类,一定要实现该抽象类的抽象方法
抽象类的特殊形式:
1、 抽象类中所有的方法都是普通方法:
用于:父类本身不适合直接创建对象的情况
2、 抽象类中所有的方法都是抽象方法:(接口)
用于:定义规范或者标准
如果抽象类中都是抽象方法,这种特殊形式实际上就是接口
二、接口中所有的方法默认都是 public abstract XXXX 类型,所以抽象类中如果所有的方法都是抽象方法实际上该抽象类就是接口形式了。
接口:使用关键字 interface 定义接口,接口中只有方法声明,没有方法实现,因为接口中所有的方法默认的修饰都是public abstract,接口中的方法由实现该接口的类去实现。接口中所有的变量都是常量,在接口中声明变量默认修饰符是public static final Int num = 10;
接口不能直接new,应该创建接口实现类的实例
三、Final关键字
可以修饰类、属性、方法
修饰类表示该类不能被继承
修饰属性表示该属性一旦被赋值在运行过程中不能再被修改。
修饰方法:表示该方法不能被子类重写
Final、finally、finalize关键字的区别:
Static和final的区别:
四、内部类
把一个类定义在另一个类的内部就称为内部类
内部类可以访问外部类的所有成员,包括使用private关键字修饰的成员
如果要创建内部类的对象,必须先创建外部类的对象,因为内部类是外部类的一个成员
如果内部类中有和外部类重名的成员,在内部类中访问外部类的重名成员,使用外部类类名.this.成员名
五、异常
异常由两部分组成:
检查性异常,如果不处理,会导致编译不通过
非检查性异常,可以处理也可以不处理,又称为运行时异常
异常的处理:
1、 直接处理异常
使用关键字try-catch-finally结构
Try{
}
Catch(Exception e){
}
Finally{
}
如果try中出现异常执行顺序是:try-catch-finally
如果try中没有出现异常,执行顺序是:try-finally
Try{
//可能会出现异常的代码
}
Catch(XXException ex1){
}
Catch(XXException ex2){
}
Catch(……){
}
Finally{
}
如果捕捉多个异常,会先处理首先匹配到的异常,比如,try中首先出现了ArrayIndexOutOfBoundsException,会匹配该异常,如果没有匹配到对应的异常信息,那么这个时候就相当于没有处理异常。通常需要在所有catch的最后加一个catch(Exception ex),使用异常的父类来处理try中可能出现的异常,且Exception只能放在最后一个
注意:如果try、catch中出现return语句,这个时候会先执行try-catch-finally结构,最后执行return语句
笔试题:finally代码在try和catch有return语句时会不会执行:
会执行,在try或者catch的return之前执行
2、 抛出异常
Throws关键字声明异常,在定义方法是通过throws关键明确声明该方法需要抛出的异常
Public XX XX() throws XXException
Throw关键字创建异常对象 throw new XXException(){
}
Throws 和throw关键字的区别:
相同点:都用来处理异常
Throws是声明要抛出的异常类型
Throw是抛出一个创建的异常对象
Throws位于方法声明部分
Throw位于方法体中
Throws后面可以抛出多个异常类型
Throw只能是一个
检查性异常在父子类之间要符合以下条件:子类如果重写了父类中抛出异常的方法,子类抛出的异常不能比父类更多,或者不能比父类更宽泛的异常
以上说法不适用于RuntimeException异常类型
3、 自定义异常
Public class XXException extends Exception{
}
自定义异常都需要继承自Exception类