抽象类是否可以继承实体类
2016-05-13 18:33
351 查看
答案很明确,可以继承,但是前提是实体类必须有明确的构造函数。
其实Object就是个实体类,Java的API文档中,每个抽象类的条目里都明确写着直接或间接继承自Object,所以这点没有疑问。
关键在于这答案所说“实体类必须有明确的构造函数”
下面我们来写代码来实现:
class A{}
abstract class B extends A{}
结果完全正常,编译通过,似乎和“实体类由构造函数”完全没有关系。
下面我们来复习一下基础知识:
所有的class都必须有一个构造方法,如果你没有在代码里生命构造方法,系统会自动给你生成一个公有无参的构造方法,而只要你自己声明了一个构造方法,无论有参没参,私有共有,系统不再生成默认无惨构造方法。
所有的子类构造器(构造方法)要求在第一行代码中调用父类构造器,如果不写系统默认调用父类无参构造器。
所以:classA{
public 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的前缀,结果都没有变化。个人觉得“实体类必须有明确的构造函数”一句实在是无法把这个情况表达清楚,所以广大求职者还是写得清楚些好。
我喜欢的写法是“可以继承,但是和实体类的继承一样,也要求父类可继承,并且拥有子类可访问到的构造器。”
其实Object就是个实体类,Java的API文档中,每个抽象类的条目里都明确写着直接或间接继承自Object,所以这点没有疑问。
关键在于这答案所说“实体类必须有明确的构造函数”
下面我们来写代码来实现:
class A{}
abstract class B extends A{}
结果完全正常,编译通过,似乎和“实体类由构造函数”完全没有关系。
下面我们来复习一下基础知识:
所有的class都必须有一个构造方法,如果你没有在代码里生命构造方法,系统会自动给你生成一个公有无参的构造方法,而只要你自己声明了一个构造方法,无论有参没参,私有共有,系统不再生成默认无惨构造方法。
所有的子类构造器(构造方法)要求在第一行代码中调用父类构造器,如果不写系统默认调用父类无参构造器。
所以:classA{
public 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的前缀,结果都没有变化。个人觉得“实体类必须有明确的构造函数”一句实在是无法把这个情况表达清楚,所以广大求职者还是写得清楚些好。
我喜欢的写法是“可以继承,但是和实体类的继承一样,也要求父类可继承,并且拥有子类可访问到的构造器。”
相关文章推荐
- 【utorrent】ubuntu 安装utorrent
- 系统自带的搜索控制器和自己封装的带搜索记录的控制器
- BNUOJ 29376 沙漠之旅 // 第十一届北京师范大学程序设计竞赛决赛
- codeforces 339C 记忆化搜索
- NCCloud: Applying Network Coding for the Storage Repair in a Cloud-of-Clouds
- 发送一条普通广播 有序广播 Broadcast 和 Receiver
- 欢迎使用CSDN-markdown编辑器
- 类和对象
- 3d数学基础学习总结
- 面向对象的基本概念
- uva10276 hanoi tower troubles again
- python - num1 -初识python
- 第一个OC程序
- python的socket编程之udp编程
- php连接MongoDB
- SQLite 基本操作--查看数据表信息
- python的socket编程之udp编程
- 二分查找的递归写法和非递归写法
- python的socket编程之udp编程
- 写加密文件内容