`

抽象类可以继承实体类吗?

 
阅读更多

一道Java 常见面试题,网上找到的几乎每个 java 面试笔试题大全或集锦里都能找到这道题。

 

题目如下:

问: 抽象类是否可继承实体类 (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的前缀,结果都没有变化。个人觉得“实体类必须有明确的构造函数”一句实在是无法把这个情况表达清楚,所以广大求职者还是写得清楚些好。

 

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

我笔试的时候只答的“可以继承”。心想所有的类都从Object类继承吧,掉了后半句。

分享到:
评论

相关推荐

    c++抽象类继承

    一个student类,lectureTeatre类,继承抽象module类,通过继承来实现接口

    抽象类是否可继承实体类 - 开心的日志

    抽象类是否可继承实体类 - 开心的日志 - 轻松一刻学习

    asp.Net经典面试33条题及答案

    1, .NET中类和结构的区别? 2, 死锁的必要条件?怎么克服? 3, 接口是否可以继承接口?...抽象类是否可以继承实体类? 4, 构造器Constructor是否可以被继承?是否可以被Override? ......

    面向对象思想 实体类是我们根

    实体类是我们根据现实生活中的对象抽象出来的类,它的对象能很好地反应我们的生活。它很好地利用继承和封装等 OO 技术。

    2013年最全的JAVA面试题集,内部资料,绝对能帮助到你,不要后悔哦。

    抽象类是否可继承实体类(concrete class)?(等级1级) 18.2.Anonymous Inner Class (匿名内部类)是否可以extends(继承)其它类?是否可以 implements(实现)interface(接口)?(等级1级) 19.写出长度为10的队列,使该...

    java 面对对象编程.pdf.zip

    接口和抽象类有什么共同点和区别? 深拷贝和浅拷贝区别了解吗?什么是引用拷贝? Java 常见类 Object Object 类的常见方法有哪些? == 和 equals() 的区别 hashCode() 有什么用? 为什么要有 hashCode? 为什么重写 ...

    java面试题及答案.doc

    抽象类是否可继承实体类 22. Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 23. 它们有何区别? 24. 构造器Constructor是否可被override? 25. 是否可以继承String类? 26. ...

    变态级JAVA程序员面试32问

    抽象类是否可继承实体类(concrete class)?  第二十三,启动一个线程是用run()还是start()?  第二十四,构造器Constructor是否可被override?  第二十五,是否可以继承String类?  第二十六,当一个...

    .net抽象工厂+存储过程添加数据

    3、在连接的数据库中继承抽象工厂,重写抽象工厂里的接口方法,返回到数据访问层。 4、在接口层声明一个数据访问层的方法,实现时在数据访问层并继承接口层。 5、创建实体。 6、业务逻辑层调用数据访问层里的方法 7...

    千方百计笔试题大全

    抽象类是否可继承实体类(concrete class)? 12 41、Java 的接口和C++的虚类的相同和不同处。 12 42、一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 12 43、说出一些常用的类,包,接口,请...

    java面试宝典

    抽象类是否可继承实体类(concrete class)? 12 41、Java 的接口和C++的虚类的相同和不同处。 12 42、一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 12 43、说出一些常用的类,包,接口,请...

    net学习笔记及其他代码应用

    抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。 41.构造器Constructor是否可被override? 答:构造器Constructor不能被继承,因此不能重写Overriding,但可以被...

    java面试题

    抽象类是否可以继承实体类? 答:接口可以继承接口,抽象类可以实现接口,抽象类可以继承实体类。 引用传递和值传递? 答:引用传递:形参改变影响实参 值传递:形参改变不影响实参 当一个线程进入一个对象的...

    JAVA面试题最全集

    72.EJB分为几类?什么是BMP,CMP? 73.什么是JNDI? 74.ADO是什么?ActiveX数据对象,是一个应用级程序接口. 75.四种JDBC方式?目前的版本? 76.EJB有哪几种?区别是什么? 77.JavaBean与EJB有什么区别? 78.软件开发...

    java基础题 很全面

    抽象类是否可继承实体类(concrete class)? 10 27. List, Set, Map是否继承自Collection接口? 10 28. abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized? 10 29. 数组有没有length()...

    JAVA面试题 对JAVA面试有帮助!

    抽象类是否可继承实体类(concrete class)?  第二十三,启动一个线程是用run()还是start()?  第二十四,构造器Constructor是否可被override?  第二十五,是否可以继承String类?  第二十六,当一个线程进入一...

    java 面试题 总结

    对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以...

    超级有影响力霸气的Java面试题大全文档

    对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以...

    DFrame后台框架、ORM、C# ORM

    将会“Models”命名空间下的所有已集成DFrame.Model.DBModel抽象类的实体类,写入到MSSQLServer的"test1"数据库。 实体字段设定: [DFrame.Model.DBField(NotNull = true,DBFieldKey =DFrame.Model.Enums....

    面向对象的概念的Object表单设计与应用.docx

    客观世界里的任何实体都可以被看作是对象。 也可以指某些概念。 从编程的角度来看,对象是一种将数据和操作过程结合在一起 的数据结构,或者是一种具有属性(数据)和方法(过程和函数)的集合体。事 实上程序中的对象...

Global site tag (gtag.js) - Google Analytics