问: 抽象类是否可继承实体类 (concrete class)
答: 抽象类是可以继承实体类,但前提是实体类必须有明确的构造函数
答案很明确,可以继承。其实从Object就是个实体类,java的API文档里,每个抽象类的条目里都明确写着直接或间接继承自Object,所以这点是没有疑问的。
关键在于这答案里所说的“前提是实体类必须有明确的构造函数”一句,是什么意思。
一般学习者会写的简单试验代码:
class A{}
abstract class B extends A{}
结果完全正常,编译通过。似乎和“实体类必须有明确的构造函数”完全没有关系。
这个问题涉及到两个个基础知识:
所有的class都必须有一个构造方法,如果你没有在代码里声明构造方法,系统会自动给你生成一个公有无参的构造方法。而只要你自己声明了一个构造方法,无论有参无参,私有公有,系统就不再帮你生成默认无参构造器了。
所有的子类构造器都要求在第一行代码中调用父类构造器,如果不写,系统默认去调用父类的无参构造器。
所以,如果把系统默认配给的方法也算进去,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的前缀,结果都没有变化。个人觉得“实体类必须有明确的构造函数”一句实在是无法把这个情况表达清楚,所以广大求职者还是写得清楚些好。
可以这么写“可以继承,但是和实体类的继承一样,也要求父类可继承,并且拥有子类可访问到的构造器。”
版权声明:本文为博主原创文章,未经博主允许不得转载。
分享到:
相关推荐
抽象类是否可继承实体类 - 开心的日志 - 轻松一刻学习
根据给定的信息,我们可以深入探讨C++中的抽象类与继承机制。...综上所述,通过合理的抽象类设计和继承机制,可以有效地提高代码的可维护性和扩展性,同时也能更好地支持面向对象编程中的多态特性。
这种继承方式允许抽象类继承实体类的属性和方法,然后可以添加抽象方法或者额外的方法来扩展功能,为子类提供更通用的接口。 总结上述知识点: 1. 在Windows操作系统中,可以通过控制面板的“鼠标”设置项调整鼠标...
抽象类是否可继承实体类(concrete class)? - 接口可以继承接口,实现多继承。 - 抽象类可以实现接口,但不能实现其他抽象类。 - 抽象类可以继承实体类,实现继承和多态。 5、是否可以继承 String 类? 答案:不...
抽象类是否可继承实体类(concrete class)? 第二十三,启动一个线程是用run()还是start()? 第二十四,构造器Constructor是否可被override? 第二十五,是否可以继承String类? 第二十六,当一个...
抽象类是否可继承实体类(concrete class)?(等级1级) 18.2.Anonymous Inner Class (匿名内部类)是否可以extends(继承)其它类?是否可以 implements(实现)interface(接口)?(等级1级) 19.写出长度为10的队列,使该...
22. **接口是否可继承接口,抽象类是否可实现接口,抽象类是否可继承实体类**: - 接口可以继承接口。 - 抽象类可以实现接口。 - 抽象类可以继承实体类。 23. **启动线程用run()还是start()**: - 使用start()...
抽象类是否可继承实体类(concrete class)?** - 接口可以继承接口。 - 抽象类可以实现接口。 - 抽象类可以继承实体类。 23. **启动一个线程是用run()还是start()?** - 使用`start()`启动线程,`run()`方法由...
抽象类是否可继承实体类(concrete class)? 接口可以继承接口。抽象类可以实现接口。抽象类可以继承实体类。 23. 启动一个线程是用 run()还是 start()? 启动一个线程是用 start() 方法,而不是 run() 方法。 ...
抽象类是否可继承实体类(concrete class)?** - 接口可以继承接口。 - 抽象类可以实现接口。 - 抽象类可以继承实体类。 23. **启动一个线程是用run()还是start()?** - 应该使用`start()`方法,这会调用`run()`,...
抽象类不能直接创建实例,因为它们代表了一种通用的概念,而非具体的实体。 2. **抽象类的实例化**: - 抽象类不能被实例化,这意味着我们不能使用`new`关键字创建抽象类的对象。抽象类的存在是为了被其他类继承,...
- **抽象类是否可继承实体类?** 可以,抽象类同样可以继承非抽象类(实体类)。 ### 10. 数据库表操作 - 将一个已经属于某个数据库的表添加到另一个数据库中是不正确的操作。通常情况下,一个表只能属于一个...
抽象类是否可继承实体类(concrete class)? - **接口**:可以继承其他接口。 - **抽象类**:可以实现接口,也可以继承其他抽象类或实体类。 #### 40. 启动一个线程是用run()还是start()? - **run()**:直接调用...
抽象类是否可继承实体类(concrete class)? **解析**: - 接口不可以继承接口,但可以扩展(extends)其他接口。 - 抽象类可以实现接口。 - 抽象类可以继承具体的类。 ### 8. 冒泡排序算法 **题目**: 冒泡排序在最...
- **抽象类是否可继承实体类?**可以,抽象类可以从具体类继承,只要满足相应的语言规则即可。 ### 9. 访问修饰符的含义 - **private**表示私有成员,只能在类的内部访问;**protected**表示受保护成员,在类内部...
抽象类是否可继承实体类**: - 接口可以继承接口。 - 抽象类可以实现接口。 - 抽象类可以继承实体类。 50. **abstract的method是否可同时是static或native或synchronized**: - `abstract`方法不能是`static`...