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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 薛飞 中级黑马   /  2013-4-3 18:31  /  1889 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 薛飞 于 2013-4-3 20:11 编辑

继承的利弊和使用原则:

    * 继承数的层次不可太多
    * 继承数的上层为抽象层

            (1)定义了下层子类都用友的相同属性和方法,并且尽可能默认实现,从而提高重用性
            (2)代表系统的接口,描述系统所能提供的服务

    * 继承关系最大的弱点:打破封装
    * 精心设计专门用于被继承的类

            (1)对这些类必须提供良好的文档说明
            (2)尽可能的封装父类的实现细节,把代表时间细节的属性和方法定义为private类型
            (3)如果某些实现细节必须被子类访问,定义为protected类型
            (4)把不允许子类覆盖的方法定义为final类型
            (5)父类的构造方法不允许调用可被子类覆盖的方法 //?????????????此点如何理解,为什么父类的构造函数不允许调用可被子类覆盖的方法?如果调用了,会出现什么结果?编译器会报错吗?有什么弊端?举例说明???????????
            (6)如果某些类不是专门为了继承而设计,那么随意继承它是不安全的

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

6 个回复

倒序浏览
我用个生活中的一个道理给你解释哈,不晓得合不合理。
比如说一个父亲学历是小学文化就度过了一辈子,但他的儿子却读了很多书,儿子继承了他爸的一些习性,能正常吃饭、睡觉等,但他的学历是大学文化,他肯定在他爸的文化基础上,还有更多的学识。但他爸不能就不会他儿子学的知识啊、、、
这个是哪个老师讲的哦,我都忘了、、、、

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
林声荣 发表于 2013-4-3 18:41
我用个生活中的一个道理给你解释哈,不晓得合不合理。
比如说一个父亲学历是小学文化就度过了一辈子,但他 ...

父类的构造方法不允许调用可被子类覆盖的方法。这里是调用可以被子类覆盖的方法,但并不是子类的方法,还是父类的,只是可以被覆盖而已。按照你的理解,假设父类有学历方法。但这个学历方法,父类爸爸学历小学,子类儿子覆盖为大学。那为什么爸爸不能调用自己的学历呢?????
回复 使用道具 举报
我只想说楼主你提出的问题,其实很简单
父类是不能调用子类的方法的,给你打个不是很恰当比方,父类就是父亲,子类是儿子,
儿子继承了父亲的说话的功能,你觉得他父亲说的和儿子说的一样吗?
其实这个问题还必须从为什么有继承说起,继承就是问了让一些复杂的东西简单化,
子类继承父类,如果觉得父类的方法不理想可以复写掉,而且子类还可以有自己的方法,
这样,子类的功能就比较强大了

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
同问。
  1. class A{
  2.          public A(){
  3.                 this.function();
  4.         }
  5.         public void function(){
  6.                 System.out.println("A中有方法");
  7.         }
  8. }
  9. class B extends A{
  10.         public void function(){
  11.                 System.out.println("B中的方法");
  12.         }
  13. }
  14. public class Test01 {

  15.         public static void main(String[] args) {
  16.                 A a = new B();
  17.                 a.function();
  18.                
  19.         }
  20. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
吃饭间突然明白,恍然大悟,这个就是传说中的,继承打破封装后,出现的安全隐患。如果父类的构造函数调用了可被子类覆盖的方法,假设父类中的这个方法返回一个boolean型的ture,而父类构造函数在得到ture值后就进入操作系统的底层。而如果被子类复写后,而这个复写后的方法返回boolean型的false,那父类的构造函数在就无法进入操作系统的底层,从而出现不可预知的错误。同样,对于父类中的其他方法是否可以调用可被子类覆盖的方法??第六点的“如果某些类不是专门为了继承而设计,那么随意继承它是不安全的”正回答了这个问题。可以把第六点反过来理解就是,父类中的方法不允许调用父类中的可被子类覆盖的其他方法,这种调用的核心原理同上述就第五点所分析的,也同样会出现不可预知的安全隐患。当然这种反过来是不符合正常的事物逻辑,所以他才正过来讲,也就是第六点。
OK 谢谢大家的回答
回复 使用道具 举报
本帖最后由 薛飞 于 2013-4-3 20:26 编辑
何俊森 发表于 2013-4-3 20:00
同问。

这个我理解了,你举得的例子不能很显著的表现出,此中调用可能出现的严重安全隐患。假设父类的构造函数调用了可被子类覆盖的方法,而构造函数在调用到这个方法后,用这个方法的结果做判断后进行别的操作。假如父类调用的方法被子类重载后结果发生变化,父类再调用的方法的话,判断有可能发生改变,就可能出现安全隐患。故不允许。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马