问: 抽象类是否可继承实体类 (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/ronghua_liu/article/details/5908114
问: 抽象类是否可继承实体类 (concrete class)答: 抽象类是可以继承实体类,但前提是实体类必须有明确的构造函数 ---------------------------------------------------------------------------------------------------------------解释:答案很明确,可以继承。其实从Objec...
前言:对于很多初学者来说,我想可能很多人都会遇到的一个问题就是Java环境变量的配置问题。自己明明就是按照度娘上的教程去一步步配置的,但还是会有很多的人出现配置不成功的问题。所以今天在这里分享一下windows 10 系统下安装Java的教程,希望对Java初学者能有所帮助。
一. Java的下载与安装
作为初学者,要想学习Java语言,第一个条件就是要让电脑上具备有Java环境,那么怎么让电...
1998年12月8日,第二代Java平台的企业版J2EE发布。
1999年4月27日,HotSpot虚拟机发布。
2005年6月,在Java One大会上,Sun公司发布了Java SE 6。此时,Java的各种版本已经更名,已取消其中的数字2,如J2EE更名为JavaEE,J2SE更名为JavaSE,J2ME更名为JavaME。
2009年,甲骨文公司宣布收购Sun。
2014年3月Oracle发布正式版JDK8,JDK8改进比较多,最大的改进是Lambda表达式(以及因之带来的函数式接口,很多原有类都做
从 1995 年第一个版本发布到现在,Java 语言已经在跌宕起伏中走过了26年,最新的 Java 版本也已经迭代到 Java 16。
java是有一个庞大的生态系统,它的覆盖范围非常广,而且已经连续十几年位居开发语言的榜首,所以java是相对于其他语言来说,非常稳定的。
一、JAVA的市场
java有非常广泛的应用市场,它的生态系统几乎涵盖了目前市面上所有的软硬件,java几乎是万能的,你能想到的,java基本都能实现(虽然吹的有点大,但不可否认)。
web开发:
能做大型的互联网网站如,京..
Python中的
抽象类
是一个包含抽象方法(只有方法声明,没有实现)的类。
抽象类
不能被实例化,而是用作其他类的基类。它提供了一种定义接口的方式,要求
继承
它的子类必须实现抽象方法。
要创建
抽象类
,需要使用`abc`模块。下面是一个简单的示例:
```python
from abc import ABC, abstractmethod
class
Abstract
Class
(ABC):
@abstractmethod
def abstract_method(self):
def
conc
re
te
_method(self):
print("This is a
conc
re
te
method.")
class
Conc
re
te
Class
(Abstract
Class
):
def abstract_method(self):
print("Implementation of abstract method.")
# 无法实例化
抽象类
# abstract_obj = Abstract
Class
()
conc
re
te
_obj =
Conc
re
te
Class
()
conc
re
te
_obj.abstract_method() # 输出: Implementation of abstract method.
conc
re
te
_obj.
conc
re
te
_method() # 输出: This is a
conc
re
te
method.
在上面的示例中,`Abstract
Class
`是一个
抽象类
,其中包含一个抽象方法`abstract_method()`和一个具体方法`
conc
re
te
_method()`。子类`
Conc
re
te
Class
`
继承
了`Abstract
Class
`并实现了抽象方法。注意,如果子类没有实现抽象方法,则尝试实例化该子类会引发TypeError。
通过使用
抽象类
和抽象方法,可以确保子类按照规定的接口进行实现,提供了一种约束和规范的方式。