java基础知识整理——接口、异常(三)
java基础知识整理——接口、异常(三)
-
- 1.接口
- 2.异常
1.接口
1.接口基本知识:
- 对类名:接口允许设置公共访问权限。
- 对方法而言,在实现 interfaces 时,默认可省略 abstract 关键字,并规定其可选的公共访问权限。
- 在定义常量时,默认采用 public static final 的形式。
- 当一个 class 实现 interface 时,则需确保该 class 实现了所有 interface 的 abstract 方法;若未完成,则需将其标记为此处 interface 依赖的 abstract class。
问题1: 接口中的默认方法和静态方法看着差不多,怎么区分呢?
新增了作为jdk1.8后增加的一项新特性的是,在接口中提供了具体系数的方法定义。它们可以直接应用于接口及其实现类中。这不仅确保了扩展系统功能的同时,并不会对现有继承关系和类库结构造成较大影响,并且显著提升了代码重用能力。
1.2 语法:
- 一个普通的方法定义为:public\: default指定返回值类型的方法名(参数列表)\{\,操作逻辑\,\}。
- 其中public访问修饰符可省略,默认为公共访问。
- 静态普通的方法定义为:public\: static指定返回值类型的方法名(参数列表)\{\,操作逻辑\,\}。
- 其中public访问修饰符可省略,默认为公共访问。
- 实例式的方法定义为:non\: static\: non\: public\: non\: protected\$指定返回值类型的方法名(参数列表){,操作逻辑,}$。
1.3 应用
默认方法:
- 在实现类中必须通过接口引用进行访问。
- 可以在实现类中进行功能的重新编写或功能的继承。
- 当对功能进行重新编写时(即删除
default关键字),则应避免直接使用父类中的super()引发的功能继承。 - 而对于功能的继承(即函数名相同但参数不同的情况),则无法仅通过 interfaces 接口引用的方式完成功能调用。
- 当对功能进行重新编写时(即删除
- 可以在实现类中进行功能的重新编写或功能的继承。
- 当对某个功能进行重新编写时(即删除
default标识符),则可通过以下方式:- 调用 interfaces.super.默认功能 来执行原有定义好的默认功能操作。

静态方法:
在实现类中必须通过接口名称进行访问。
对于接口中的静态方法来说,实现类无法继承它们并直接应用。
对于静态方法而言,在实现类中无法进行重写操作;然而,在同一个接口中可以定义多个具有相同格式的静态方法,并且它们彼此独立。
场景说明:若期望更多接口的扩展方式能在无实例对象生成时被调用,则应优先选择静态方法;反之,在采用默认方式时则能更直接地利用接口中的功能。
问题2:子接口能继承父接口的所有成员吗?
- 当实现类仅有一个父类时,则能够依次继承自该父类中的常量、纯虚函数以及默认实现的方法,并且不能包含静态成员函数。
- 对于具有多个父类的情况,则仅能继承自各个父类所定义的纯虚函数。那么为何这种方法可行呢?这是因为所有纯虚函数在接口中都没有实现体,在这种情况下就无法区分具体的实现细节。
第3题:当继承父类与实现的接口存在相同成员时,如何确定调用的是哪一个?
答:对于常量无法判断,但是成员方法和静态方法会优先继承父类的。
2.异常
1.异常类的关系

2.常见异常类型及原因分析:
- ArithmeticException 算术异常:在执行算术运算时可能会出现错误(如除以零的情况)。
- NumberFormatException 数字格式化问题:涉及数据类型转换的过程中(如无法满足数据格式要求),可能会导致无法将字符串正确转换为相应的数值类型。
String one = "ab123";
Integer.parseInt(one); //报错
- ArrayIndexOutOfBoundsException 数组越界索引异常
- NullPointerException 空引用异常发生于未初始化的对象或不存在的对象情况下。
- ClassCastException 类型转换失败通常发生在向下转型过程中,导致目标对象无法正常完成转换。
class Father{
}
class Son extends Father{
}
class Brother extends Father{
}
class Test{
public static void main(String[] args){
Father one = new Son();
Brother two = (Brother)one; //ClassCastException
}
}
当嵌套类数组通过显式上层转型接口传递给父类对象时所引发的ArrayStoreException是一种特殊的运行时异常。此类异常通常发生在当嵌入式容器尝试将子容器中的元素注入到外层容器中而这些元素的数据类型与外层容器期望的数据类型之间存在不匹配关系的情况下
class Father{
}
class Son extends Father{
}
class Test{
public static void main(String[] args){
Son[] sons = new Son[10];
Father[] fats = sons;
fats[0] = new Father(); //ArrayStoreException
}
}
- InputMismatchException 输入格式错误异常:接收的数据与预期格式不一致(例如,在程序中使用input.nextInt()来获取数据时),而控制台输入的是abc。
- FileNotFoundException 文件未找到异常:在操作文件内容时发现该文件不存在。
3.关于try-catch
问题1:try…catch 里面定义的变量外部可以使用吗?
答:不可以,里面的变量相当于局部变量,只能在其代码中使用。
问题2:既然Exception是父类,是不是平时工作的时候只用它就行了?
建议:虽然Exception作为异常类的基础类目,在大多数编程语言中都继承自Systemption这一基本类别。然而,在实际应用中我们发现采用基于多种Exception类型的针对性处理方案能够显著提升系统的可靠性和易用性
问题3:ArithmethicException为何无需显式导入而InputMismatchException需手动引入?
ArithmeticException的全称是... java.lang.ArithmeticException;该包属于默认加载范围,默认情况下会自动解析相关类文件内容并将其整合进类库系统中,默认情况下会自动解析相关类文件内容并将其整合进类库系统中,默认情况下会自动解析相关类文件内容并将其整合进类库系统中,默认情况下会自动解析相关类文件内容并将其整合进类库系统中,默认情况下会自动解析相关类文件内容并将其整合进类库系统中。而... InputMismatchException其完整名称为... java.util.InputMismatchException 由于该指定路径并未预先配置为标准路径集合 未被预置的标准路径集合 未被预置的标准路径集合 未被预置的标准路径集合 未被预置的标准路径集合 所以必须主动添加相应的引用信息方能正常调用
问题4:异常输出的顺序与catch块定义的位置有关吗?
异常输出的顺序仅取决于产生异常的具体位置。然而,在采用多重catch机制进行异常捕获时需要注意以下几点:一是大范围(父类)应后置以避免覆盖前面的异常;二是由于将父类置于前面会导致后续的所有异常也被其捕获从而失去独立性。
4.异常处理中的返回操作
- 主要采用两种方式:调用System.exit(参数)与使用return返回值。
- 调用System.exit(参数)的方式是终止当前运行的Java虚拟机,并接受一个状态码作为输入;若该状态码不为零,则会导致程序异常终止。
- 使用return返回值的方式其区别在于,在任何包含finally关键字的try语句中(如try...catch...finally),无论return位于try...catch...或位于finally块中的哪一位置,在执行完所有代码后才会进行返回。
public static void main(String[] args){
System.out.println(getResult());
}
public static int getResult(){
int temp = 10;
try{
System.out.println("try");
return temp + 1;
}catch(Exception e){
System.out.println("catch");
return temp + 2;
}finally{
System.out.println("finally");
return temp + 3;
}
}
输出结果:
try
finally
13
public static void main(String[] args){
System.out.println(getResult());
}
public static int getResult(){
int temp = 10;
try{
System.out.println("try");
return temp + 1;
}catch(Exception e){
System.out.println("catch");
return temp + 2;
}finally{
System.out.println("finally");
}
}
输出结果:
try
finally
11
5.thorws和throw的区别
throws
- 该声明可能触发 throw 异常
- 语法定义为 throws 异常类型列表
- 旨在告知调用者该方法可能导致哪些异常,并需采取相应处理措施
- 说明位于函数参数列表之后
- throws 后可列举多个具体类型的 throw 异常名称
- 反映可能存在 throw 异常的可能性
- 这并非必然
throw
- 抛出指定类型的异常对象
- 其语法格式为:new 异常类型(参数列表)
- 这种机制通常用于在代码块内部处理逻辑错误时的异常抛出
- 它说明通常位于方法体内定义
- 每次只能生成一个异常实例
- 若调用方未处理该CheckedException...(此处示例中缺少完整语句)
可以考虑将"..."部分补充完整以保持完整性和一致性
或者根据上下文适当扩展描述内容
确保改写后的内容与原文意思高度一致并保持专业性
同时尽量减少冗余信息的引入以维持文本流畅度
6.关于自定义异常的常见问题
问题1:自定义异常属于检查异常还是非检查异常?
答:看继承的父类是属于哪一种,即为哪一种。
问题2:返回消息、将对象转换为字符串和打印堆栈信息在异常处理中的区别是什么?
答案
例如除0时,调用e.toString() 会显示:
java.lang.ArithmeticException:/ by zero
e.getMessage(): 获得异常描述信息。
例如除0时,调用e.getMessage() 会显示:
/ by zero
e drummart(): 输出异常产生的调用栈信息, 包含以下内容: 异常类型. 详细说明. 以及错误发生的位置等.
例如除0时,调用e.printStackTrace() 会显示:
java.lang.ArithmeticException:/ by zero
at demo.Test.main(Test.java:15)
问题3:自定义异常只能抛出后才能写在catch里么?
回答:听起来没错哦。自定义类型的异常必须通过throw语句抛出才能被捕获。此外,在普通方法中使用throw语句并在主方法中进行catch操作时也无法自动被捕获和处理。
