黑马程序员技术交流社区

标题: [已解决]关于子类和父类构造方法关系的疑问 [打印本页]

作者: 张洁    时间: 2012-6-4 13:28
标题: [已解决]关于子类和父类构造方法关系的疑问
本帖最后由 张洁 于 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);有什么效果呢?

作者: 陆建平    时间: 2012-6-4 13:42
因为调用了super(message)给父类负了值,所以子类与父类的message是一样的;如果调用super()就无法给父类的message赋值了。调用super(message)就是为了给父类赋值。
作者: 胡团乐    时间: 2012-6-4 14:39
本帖最后由 胡团乐 于 2012-6-4 14:40 编辑

super(message);
这个调用表示的是 父类的构造方法:
public Exception(String message){
        this.message = message;    }
实际上调用super(message);返回的就是 this.message = message;
作者: 付信榕    时间: 2012-6-4 14:57
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的公共方法所得的结果是子类期望的)










欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2