class MyException extends Exception{//自定义异常
private Date date;
public MyException(String message,Date date){
super(message);
this.date = date;
}
public Date getDate(){
return this.date;
}
}
这里有点疑惑:
父类 Exception构造方法中Exception(String message)与子类public MyException(String message,Date date)的message值是同一个吗?
如果说是同一个值,那是不是直接就可以继承到这个值了?
那么,为什么不调用父类无参数的super()构造方法呢?
调用super(message);有什么效果呢?
楼主的疑惑我曾经也有过,现在就想明白了。先回答父类 Exception构造方法中Exception(String message)与子类public MyException(String message,Date date)的message值是同一个吗?如果说是同一个值,那是不是直接就可以继承到这个值了?
答是:同一个传进来的的参数message值,但是子类 MyException 是继承不了这个值的因为父类 Exception的message私有化了,
连子类都是看不见有这个message存在。
详解如下:
在定义一个类时,通常是 class A
{
私有成员变量 s(不会被子类继承);
设置 s 的公共方法(public 方法 可以被子类继承并使用);
获得 s 属性值的公共方法(public 方法 可以被子类继承并使用);
构造方法;
其他;
}
父类Exception里有private String Message;(私有,不会被子类MyException继承,只能在父类中使用)
子类中如果不调用super(message);则要额外private String Message;可以看出和父类的private String Message重复了,内存中有两份的Message,浪费。
这时就想能不能共用父类的Message了。发现可以:就是构造赋初值时调用super(message);要操纵使用它时就调用从父类继承过来的设置 Message的公共方法
获得 Message 属性值的公共方法。效果就像子类也定义了Message和其设置,获取的方法一样,提高了字父类的代码的复用性。所以,即使Message是私用的,不能被子类继承,但是通过上面的思想一样可以试想子类父类共用一份私用成员,达到提高效率的目的。
再回答 : 那么,为什么不调用父类无参数的super()构造方法呢?(1,父类无参数的super()在子类中不用显示写出,会默认有的,2,调用的话就达不到上面讲的目的了,多写很多重复代码)
调用super(message);有什么效果呢?(效果是:父类的Message按子类传入的参数初始化,满足子类的初始化要求,保证子类后面调用操作Message的公共方法所得的结果是子类期望的)
|