抽象类是否可继承实体类

抽象类是否可继承实体类 题目如下:问:  抽象类是否可继承实体类 (concrete class)答: 抽象类是可以继承实体类,但前提是实体类必须有明确的构造函数 ——————-答案很明确,可以继承。其实从Object就是个实体类,java的API文档里,每个抽象类的条目里都明确写着直接或间接继承自Object,所以这点是没有疑问的。关键在于这答案里所说的“前提是实体类必…

大家好,又见面了,我是你们的朋友全栈君。

 

题目如下:

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

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

 ——————-

答案很明确,可以继承。其实从Object就是个实体类,java的API文档里,每个抽象类的条目里都明确写着直接或间接继承自Object,所以这点是没有疑问的。

关键在于这答案里所说的“前提是实体类必须有明确的构造函数”一句,是什么意思。

一般学习者会写的简单试验代码:

class A{}

abstract class B extends A{} 

结果完全正常,编译通过。似乎和“实体类必须有明确的构造函数”完全没有关系。

这个问题涉及到两个个基础知识:

1. 

所有的class都必须有一个构造方法,如果你没有在代码里声明构造方法,系统会自动给你生成一个公有无参的构造方法。而只要你自己声明了一个构造方法,无论有参无参,私有公有,系统就不再帮你生成默认无参构造器了。

2.

所有的子类构造器都要求在第一行代码中调用父类构造器,如果不写,系统默认去调用父类的无参构造器。

 

所以,如果把系统默认配给的方法也算进去,class A{}的代码实际上是

class A{

  public A(){}

 

B继承 A 的时候,则是

abstract class B extends A{

  public B(){

    super();

  }

要试验出这继承规则的内部情况,也很简单,在最上面那个简单试验代码里,加上个私有构造器,有参无参都行。

class A{

  private A(){} 

}

这个时候,如基础知识(1) 中所说,系统不再给你默认无参构造器, B的构造器根据(2)中的规则去调用super(),却找不到A的无参构造器,所以导致abstract class B extends A{} 编译不能通过。(因为A中没有任何构造器可供子类调用,其实这个时候A只能够供内部类继承,我用的Eclipse的3.4版本会建议给B改名,但是这解决不了这个问题。)

现在,你应该了解了资料给的那句语焉不详的“实体类必须有明确的构造函数”的含义:

1.没写构造器的,那是拥有默认无参公有构造函数的,子类可以什么都不写,让默认构造器去调用它。这是最初那两行代码的情况。

2.写了子类可访问的无参构造器的,也是一样,子类里可以什么都不写,用默认机制调用。

3.写了 有参构造器却没写无参构造器的,父类里没有子类可访问的无参构造器,子类必须在子类构造器里的第一句写明,调用父类有参构造器,并把参数传进去。

4.声明为final的以及所有构造器都不在子类访问权限之内的类无法继承

 

其实只要是在类的继承中,无论抽象还是实体,都需要符合这个规则的。在这个继承试验中随时删掉或是加上abstract的前缀,结果都没有变化。个人觉得“实体类必须有明确的构造函数”一句实在是无法把这个情况表达清楚,所以广大求职者还是写得清楚些好。

我喜欢的写法是“可以继承,但是和实体类的继承一样,也要求父类可继承,并且拥有子类可访问到的构造器。” 

———————

原文:https://blog.csdn.net/ckw1988/article/details/4639514 
 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/147207.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • UINT16_uint16是什么数据类型

    UINT16_uint16是什么数据类型记得之前在刷笔试题的时候就看见过这个问题,发现当时上网百度后又忘了。最近在看CryEngine3引擎代码的时候又晕了,趁现在赶紧记下来~在查看CE3的代码时我发现了这个变量,TFlowNodeIdm_flowNodeId;心想这是什么鬼?(请理解一个菜鸟没啥经验)然后果断在VS下按F12查看定义,连着按了几次我终于捋清其中的奥妙。所以我干脆把uint8,uint32

    2025年9月26日
    2
  • Pytorch 转置卷积

    Pytorch 转置卷积环境使用Kaggle里免费建立的Notebook教程使用李沐老师的动手学深度学习网站和视频讲解小技巧:当遇到函数看不懂的时候可以按查看函数详解。卷积不会增大输入的高和宽,通常要么不变,要么减半。而转置卷积则可以用来增大输入高宽。假设忽略通道,步幅为1且填充为0。输入张量形状为nh×nwn_h\timesn_wnh​×nw​,卷积核形状为kh×kwk_h\timesk_wkh​×kw​。共产生nhnwn_hn_wnh​nw​个中间结果。每个中间结果都是一个(nh+k

    2022年6月21日
    27
  • 项目实战|史上最简单的springboot 整合elk教程,实现日志收集(带视频哦)

    项目实战|史上最简单的springboot 整合elk教程,实现日志收集(带视频哦)项目实战|史上最简单的springboot整合elk教程,实现日志收集

    2022年6月14日
    27
  • 前端基础(HTML,CSS,JavaScript)知识笔记,附:前端基础面试题!!

    前端基础(HTML,CSS,JavaScript)知识笔记,附:前端基础面试题!!前言HTML,CSS,JavaScript是前端入门必须学习的知识,也是最基础的知识。文章主要分享包括(HTML,CSS,JS)前端基础知识笔记,学习路线图,最后附前端基础面试题。HTML知识点1.html基本结构html标签是由<>包围的关键词。html标签通常成对出现,分为标签开头和标签结尾。有部分标签是没有结束标签的,为单标签,单标签必须使用/结尾。页面所有的内容,都在html标签中。html标签分为三部分:标签名称,标签内容,标签属性。html

    2022年6月15日
    28
  • 【小白币看】数字货币火了这么久你还不知道如何挖矿?

    【小白币看】数字货币火了这么久你还不知道如何挖矿?​1什么是虚拟货币挖矿?挖矿指的是通过电脑CPU(内存)、GPU(显卡)或专业的矿机参与网络记账形成工作量证明POW,根据工作量证明的占比获得相应的奖励。目前,通过挖矿可以获得的虚拟货币常有:BTC(比特币)、ETH(以太坊)、ETC(以太经典)、ZEC(zcash零币)、SC(SIACOIN)等,上述过程简称挖矿。如果上述的文字解释有点复杂,可以看看下面小编图举的例子。2虚拟货币挖矿演变的三大过…

    2022年6月4日
    42
  • 视频识别车牌号(Python)

    视频识别车牌号(Python)提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言 使用步骤 总结一、前言视频识别车牌号(有视频和代码)二、使用步骤直接上代码#导入所需要的库fromhyperlprimport*importcv2importnumpyasnp#定义保存图片函数#image:要保存的图片名字#addr;图片地址与相片名字的前部分#num:相片,名字的后缀。int类型defsave_image(i..

    2022年5月20日
    85

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号