黑马程序员技术交流社区

标题: 关于覆盖 [打印本页]

作者: 马振兴    时间: 2012-9-13 20:11
标题: 关于覆盖
本帖最后由 马振兴 于 2012-9-15 00:15 编辑

为什么子类覆盖父类,必须保证子类权限大于等于父类权限,否则编译会失败?
作者: 马睿    时间: 2012-9-13 20:19
覆盖,必须要继承
所以可以这样比喻…
父亲,祖传了一个瓶子(成员方法),用protected盒子装起来(默认大小),子类继承了父类祖传的瓶子(成员方法),但是拿一个比瓶子默认大小的private怎么装的下…

作者: 杨震    时间: 2012-9-13 20:23
本帖最后由 杨震 于 2012-9-13 20:24 编辑

我个人看法是这样的:

假如没有那个限制的话,比如说父类有个方法method是public的,而子类重写这个方法将其变成了protected甚至是private的,如果编译可以通过,
将来进行多态引用Father father = new Son();然后调用method也就是father.method(),这个时候就发生多态,也就是实际调用子类的重写的受保护的或者私有的method,很显然该重写访求有private或protected保护,没有权限,这就实现不了多态,那重写方法就没有意义了,重写方法更重要的是为多态服务

具体我也不知道,只是个人猜想
作者: 孙岳    时间: 2012-9-13 20:35
class A{
     void test(){}
}
class B extends A{
     private void test(){}
}
class C extends B{}
如果这样的话,
A a = new C();
a是没有权限访问B中的test()函数的,但是却有权限访问A中的test()函数,这样就乱了。
B覆盖A中的方法还有什么意义?
作者: 程金    时间: 2012-9-13 20:53
里氏代换原则(Lsp)中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石.根据这个面向对象的基本原则来说,假如你子类的访问权限比父类小,那么必然有的地方能使用父类,但是换成了子类的话,访问不了子类的属性或方法,出现问题.这就是违反了"任何基类可以出现的地方,子类一定可以出现"的原则.
作者: 杨千里    时间: 2012-9-13 20:55
为什么子类覆盖父类,必须保证子类权限大于等于父类权限,否则编译会失败?

关于这个问题,你可以换个角度来理解,在一个体系中,子类继承父类,就相当于在一个单位,或者一个公司中,下属和上级的关系:

“下属想要用到上级的一些资料特权等,必须取得上级的同意,如果不经过上级的同意,你越权......,难道你想造反不成?”

子类继承父类同理,要覆盖父类中的方法,必须保证子类的权限大于等于父类权限,这个权限在现实生活中相当于取得上级的同意,可以覆盖父类中方法的一种特殊权益。
作者: 高俊杰    时间: 2012-9-13 22:28
      方法覆盖要遵循“两同两小一大”的原则,“两同”即方法名相同、形参列表相同;“两小”指子类方法返回值类型应比
父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;“一大”是
指子类方法访问权限应比父类方法的访问权限更大或相等;
      按照上面的原则进行代码编写,就不会出错。上面的几个回答很形象的说明了这个问题。




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