接口/内部类/异常处理
interface
接口和类是并列的两个结构
如何定义接口:
JDK7以前:只能定义全局常量和抽象方法
全局常量:public static final,可以省略,会默认加上
抽象方法:public abstract
JDK8:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法
接口中定义的静态方法,只能通过接口来调用。
通过实现类的对象,可以调用接口中的默认方法,默认方法,子类拿来可以直接调。
如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的方法,那么子类在没有重写此方法的情况下,默认调用的是父类中的同名同参数的方法 。 --> 类优先原则
如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法,那么在实现类没有重写此方法的情况下,报错。 --> 接口冲突
接口通过类去实现(implements)的方式来使用。
如果实现类覆盖了接口中的所有抽象方法,则此实现类就可以实例化
如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍为一个抽象类,如果实现类重写了接口中的默认方法,调用时,仍然调用的是重写以后的方法
JAVA 可以实现多接口
内部类
分类:成员内部类(静态、非静态) vs 局部内部类(方法内、代码块内、构造器内)
成员内部类:
可以被final修饰,表明此类不能被继承
可以被absract修饰
可以被四种不同修饰符修饰
局部内部类的使用:
在局部内的方法中(比如 show),如果调用局部内部类所声明的方法(比如 : method ) 中的局部变量的话,要求此局部变量声明为final的。
面试题:
抽象类和接口的异同?
相同点:不能实例化;都可以包括抽象方法;
不同点:
把抽象类和接口(Java 7 ,java8 ,java9)的定义、内部结构解释说明
类: 单继承 接口:多继承; 类与接口: 多实现
异常处理
体系结构:
总父类:Trowable
java.lang.error :一般不编写针对性的代码进行处理。
java.lang.Exception :可以进行异常的处理
编译时异常(check)
运行时异常(uncheck) --- RuntimeException
try-catch-finally
catch 中的异常类型,如果没有子父类关系,则无顺序要求
如果有子类关系,则要求子类一定要父类上面
常用的两种处理方法:
getMessage () ; // String
printStackTrace () : // void
在try中声明的变量,出了try就用不了了
finally 中声明的是一定会被执行的代码。即使catch中又出现异常了。 try中有return语句的情况,catch中有return语句的情况。
像数据库连接、输入输出流、socket连接,JVM是不能自动回收的。我们需要手动的进行资源的回收,此时的资源释放,就需要放在finally中
使用try-catch 处理编译时异常,是得程序在编译时就不报错,但是运行时仍可报错。相当于我们使用try-catch 将一个编译时可能出现的异常,延迟到运行时出现。
throws + 异常类型
一旦当方法体执行时,出现异常,仍会在异常代码处生成一个异常类的对象,此对象满足throws后异常类型时,就会被抛出。异常代码后续的代码,就不再执行。
try-catch : 真正的将异常处理掉了
throws: 只是将异常抛给了方法的调用者。并没有真正地将异常处理掉。
开发中如何选择:
如果父类中被重写的方法没有throws方法处理异常,则子类重写的方法也不能使用throws,意味着如果子类 重写的方法中有异常,必须使用try-catch
执行的方法中,先后又调用了另外的几个方法,这几个方法是递进关系进行的。我们建议这几个方法使用throws的方式进行处理。而执行的方法a可以考虑try-catch的方式进行处理。
关于异常对象的产生:
系统自动生成的异常对象
手动的生成一个异常对象,并抛出“throw”
只有异常体系的对象才可以 throew new 异常类类名 () ;
throw 和 thorws 的区别 :
throw是抛,throws 是抓
throw 表示抛出一个异常类的对象,生成异常对象的过程。声明在方法体内
throws 属于异常处理的一种方式,声明在方法的声明处