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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马振兴 中级黑马   /  2012-9-13 20:11  /  2933 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 马振兴 于 2012-9-15 00:15 编辑

为什么子类覆盖父类,必须保证子类权限大于等于父类权限,否则编译会失败?

6 个回复

倒序浏览
覆盖,必须要继承
所以可以这样比喻…
父亲,祖传了一个瓶子(成员方法),用protected盒子装起来(默认大小),子类继承了父类祖传的瓶子(成员方法),但是拿一个比瓶子默认大小的private怎么装的下…
回复 使用道具 举报
本帖最后由 杨震 于 2012-9-13 20:24 编辑

我个人看法是这样的:

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

具体我也不知道,只是个人猜想
回复 使用道具 举报
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中的方法还有什么意义?
回复 使用道具 举报
里氏代换原则(Lsp)中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石.根据这个面向对象的基本原则来说,假如你子类的访问权限比父类小,那么必然有的地方能使用父类,但是换成了子类的话,访问不了子类的属性或方法,出现问题.这就是违反了"任何基类可以出现的地方,子类一定可以出现"的原则.
回复 使用道具 举报
为什么子类覆盖父类,必须保证子类权限大于等于父类权限,否则编译会失败?

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

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

子类继承父类同理,要覆盖父类中的方法,必须保证子类的权限大于等于父类权限,这个权限在现实生活中相当于取得上级的同意,可以覆盖父类中方法的一种特殊权益。
回复 使用道具 举报
      方法覆盖要遵循“两同两小一大”的原则,“两同”即方法名相同、形参列表相同;“两小”指子类方法返回值类型应比
父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;“一大”是
指子类方法访问权限应比父类方法的访问权限更大或相等;
      按照上面的原则进行代码编写,就不会出错。上面的几个回答很形象的说明了这个问题。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马