抽象类是否可继承实体类 (concrete class)?????

答: 抽象类是可以继承实体类,但前提是实体类必须有明确的构造函数

这个答案我没看懂

在网上查了下,终于找到一个解释非常清楚到位的答案,

即:可以继承,但是和实体类的继承一样,也要求父类可继承,并且拥有子类可访问到的构造器。

请参看以下文章

转自:http://blog.csdn.net/ckw1988/archive/2009/10/07/4639514.aspx

Code:
  1.  关于“抽象类是否可继承实体类”的辨析。  
  2.   
  3. 一道java 常见面试题,网上找到的几乎每个 java 面试笔试题大全或集锦里都能找到这道题。  
  4.   
  5. 题目如下:  
  6.   
  7.   
  8. 问:  抽象类是否可继承实体类 (concrete class)  
  9.   
  10. 答: 抽象类是可以继承实体类,但前提是实体类必须有明确的构造函数  
  11.   
  12.   
  13.  -------------------  
  14.   
  15.   
  16. 答案很明确,可以继承。其实从Object就是个实体类,java的API文档里,每个抽象类的条目里都明确写着直接或间接继承自Object,所以这点是没有疑问的。  
  17.   
  18.   
  19. 关键在于这答案里所说的“前提是实体类必须有明确的构造函数”一句,是什么意思。  
  20.   
  21.   
  22. 一般学习者会写的简单试验代码:  
  23.   
  24.   
  25. class A{}  
  26.   
  27. abstract class B extends A{}   
  28.   
  29.   
  30. 结果完全正常,编译通过。似乎和“实体类必须有明确的构造函数”完全没有关系。  
  31.   
  32.   
  33. 这个问题涉及到两个个基础知识:  
  34.   
  35. 1.   
  36.   
  37. 所有的class都必须有一个构造方法,如果你没有在代码里声明构造方法,系统会自动给你生成一个公有无参的构造方法。而只要你自己声明了一个构造方法,无论有参无参,私有公有,系统就不再帮你生成默认无参构造器了。  
  38.   
  39. 2.  
  40.   
  41. 所有的子类构造器都要求在第一行代码中调用父类构造器,如果不写,系统默认去调用父类的无参构造器。  
  42.   
  43.    
  44.   
  45.   
  46. 所以,如果把系统默认配给的方法也算进去,class A{}的代码实际上是  
  47.   
  48. class A{  
  49.   
  50.   public A(){}  
  51.   
  52. }   
  53.   
  54.    
  55.   
  56. B继承 A 的时候,则是  
  57.   
  58. abstract class B extends A{  
  59.   
  60.   public B(){  
  61.   
  62.     super();  
  63.   
  64.   }  
  65.   
  66. }   
  67.   
  68.   
  69. 要试验出这继承规则的内部情况,也很简单,在最上面那个简单试验代码里,加上个私有构造器,有参无参都行。  
  70.   
  71. class A{  
  72.   
  73.   private A(){}  
  74.   
  75. }  
  76.   
  77. 这个时候,如基础知识(1) 中所说,系统不再给你默认无参构造器, B的构造器根据(2)中的规则去调用 super(),却找不到A的无参构造器,所以导致abstract class B extends A{} 编译不能通过。(因为A中没有任何构造器可供子类调用,其实这个时候A只能够供内部类继承,我用的Eclipse的3.4版本会建议给B改名,但是这解决不了这个问题。)  
  78.   
  79.   
  80. 现在,你应该了解了资料给的那句语焉不详的“实体类必须有明确的构造函数”的含义:  
  81.   
  82. 1.没写构造器的,那是拥有默认无参公有构造函数的,子类可以什么都不写,让默认构造器去调用它。这是最初那两行代码的情况。  
  83.   
  84. 2.写了子类可访问的无参构造器的,也是一样,子类里可以什么都不写,用默认机制调用。  
  85.   
  86. 3.写了 有参构造器却没写无参构造器的,父类里没有子类可访问的无参构造器,子类必须在子类构造器里的第一句写明,调用父类有参构造器,并把参数传进去。  
  87.   
  88. 4.声明为final的以及所有构造器都不在子类访问权限之内的类无法继承  
  89.   
  90.    
  91.   
  92. 其实只要是在类的继承中,无论抽象还是实体,都需要符合这个规则的。在这个继承试验中随时删掉或是加上abstract的前缀,结果都没有变化。个人觉得“实体类必须有明确的构造函数”一句实在是无法把这个情况表达清楚,所以广大求职者还是写得清楚些好。  
  93.   
  94.   
  95. 我喜欢的写法是“可以继承,但是和实体类的继承一样,也要求父类可继承,并且拥有子类可访问到的构造器。”   
  96.   
  97.   
  98. ---------------------  
  99.   
  100.   
  101.  如果有哪位朋友发现本文的纰漏,还望不吝赐教。在此谢过。  
  102.   
  103.   
  104. 另:如需转载请注明出处。   

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值