关于自定义异常类与子类中重载父类方法的思考

自定义异常类

同学问了一个关于异常的问题,让一个类继承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():
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值