关于自定义异常类与子类中重载父类方法的思考
自定义异常类
同学问了一个关于异常的问题,让一个类继承Exception,然后这个子类有一个构造方法,参数并非String message,原本以为挺简单的,但是当我想起了super只能放首行的时候就一下给我整不会了,在此记录一下。
一、code
1.解决方案:
先上解决方案:
public class MyException extends Exception {
private String detailMessage;
public MyException(boolean flag) {
super();
String msg = "false";
if (flag){
msg = "true";
}
this.detailMessage = msg;
}
@Override
public String getMessage() {
return detailMessage;
}
}
2.分析:
(1)继承关系:
(2)Exception源码:
package java.lang;
public class Exception extends Throwable {
static final long serialVersionUID = -3387516993124229948L;
public Exception() {
super();
}
public Exception(String message) {
super(message);
}
public Exception(String message, Throwable cause) {
super(message, cause);
}
public Exception(Throwable cause) {
super(cause);
}
protected Exception(String message, Throwable cause,
boolean enableSuppression,
boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
(3)Throwable源码(省略了无关内容):
public class Throwable implements Serializable {
private String detailMessage;
public String getMessage() {
return detailMessage;
}
public String getLocalizedMessage() {
return getMessage();
}
}
私以为这段getLocalizedMessage()写得极为精妙,在整个Throwable类的内部和外部,属性detailMessage的获取只能通过getMessage,这直接为我后面Override时只用处理getMessage奠定了基础。
参考其他的Exception的子类:
public class ReflectiveOperationException extends Exception {
static final long serialVersionUID = 123456789L;
public ReflectiveOperationException() {
super();
}
public ReflectiveOperationException(String message) {
super(message);
}
public ReflectiveOperationException(String message, Throwable cause) {
super(message, cause);
}
public ReflectiveOperationException(Throwable cause) {
super(cause);
}
}
它的构造器全部都是它的父类Exception有的,所以只能另想办法。
经分析Throwable后,发现想要在自定义的Exception子类自己特有的构造方法中设置message,其实只要override它的父类(Exception)的父类(Throwable)的getMessage()方法即可。
经这么一遭,突然发现自己好像不懂继承了orz。
二、子类中重载父类方法
确定一下在子类中override方法A后,父类中所有关于方法A的调用都调的是子类重写的那个。
1.Person类
public class Person {
private String name;
public String getName() {
System.out.println("person's getName()");
return name;
}
public String getNameTwo(){
return getName();
}
}
2.Student类
public class Student extends Person {
private String name;
public Student(String name) {
super();
this.name = name;
}
@Override
public String getName() {
System.out.println("student's getName()");
return name;
}
}
3.Test
public class Test {
public static void main(String[] args) {
Student student = new Student("aaa");
System.out.println(student.getNameTwo());
}
}
测试结果:
调用顺序:
1.先调用Person的getNameTwo():
2.发现getName()被override重写了,调用Student的getName():