A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 张洁 于 2012-6-5 21:38 编辑

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);有什么效果呢?

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1 非常抱歉,來晚了...

查看全部评分

3 个回复

正序浏览
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的公共方法所得的结果是子类期望的)





评分

参与人数 1技术分 +1 收起 理由
赵志勇 + 1 很给力!

查看全部评分

回复 使用道具 举报
本帖最后由 胡团乐 于 2012-6-4 14:40 编辑

super(message);
这个调用表示的是 父类的构造方法:
public Exception(String message){
        this.message = message;    }
实际上调用super(message);返回的就是 this.message = message;
回复 使用道具 举报
因为调用了super(message)给父类负了值,所以子类与父类的message是一样的;如果调用super()就无法给父类的message赋值了。调用super(message)就是为了给父类赋值。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马