`

抽象类是否可继承具体类?

阅读更多
转帖:http://blog.csdn.net/ckw1988/archive/2009/10/07/4639514.aspx

关于“抽象类是否可继承实体类”的辨析。  
  
一道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的前缀,结果都没有变化。个人觉得“实体类必须有明确的构造函数”一句实在是无法把这个情况表达清楚,所以广大求职者还是写得清楚些好。  
  
  
我喜欢的写法是“可以继承,但是和实体类的继承一样,也要求父类可继承,并且拥有子类可访问到的构造器。”   
  
  
---------------------  
  
  
如果有哪位朋友发现本文的纰漏,还望不吝赐教。在此谢过。  

分享到:
评论
1 楼 yxyysu 2011-09-09  
写的很好,很清楚。

相关推荐

    c++抽象类继承

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

    dot Net中抽象类与接口的区别

    抽象类不能实现多继承。 • 接口只能定义抽象规则;抽象类既可以定义规则,还可能提供已实现的成员。 • 接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。 • 接口可以用于支持回调;抽象类...

    抽象类和接口的区别

    因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。 抽象类不一定必须含有抽象方法。比如: 复制代码 public abstract class Dog { //普通方法 void bark() { } //抽象方法 abstract void ...

    python继承和抽象类的实现方法

    本文实例讲述了python继承和抽象类的实现方法。分享给大家供大家参考。 具体实现方法如下: 复制代码 代码如下:#!/usr/local/bin/python # Fig 9.9: fig09_09.py # Creating a class hierarchy with an abstract ...

    基于Java抽象类和接口实现疯狂动物城

    本项目主要包括项目开发环境搭建、不同功能的类的设计、抽象类的设计、接口的设计、及其继承抽象类重写和接口实现类等具体功能的实现。 ●工程项目搭建与游戏初始化功能实现(2学时) ; ●动物城成员列表与动物信息...

    C#接口抽象类区别实例

    (8) 抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的 (9) 如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中...

    Java抽象类.pdf

    同时,抽象类也可以提高程序的可扩展性和可维护性。 Java抽象类示例 Animal类是一个抽象类,它有一个私有的name属性和一个构造方法来初始化这个属性。另外,Animal类中还有一个非抽象的方法getName(),它可以被所有...

    第五章[1].包、继承、抽象类以及接口 PPT

    第五章[1].包、继承、抽象类以及接口

    抽象类、继承、接口(重写重载)练习

    请同学们,合理利用抽象类、继承、接口设计并实现上述功能。体会抽象类与接口种的不同。并且单独使用一个DeomTest作为入口类,要求汽车、飞机都使用交通工具类型的引用变量调用出行方法,表现出多态的特性。

    java:接口和抽象类练习

    在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 抽象类除了不能实例化对象之外,...

    抽象、多态、继承.zip

    java语言中,用abstract 关键字来修饰一个类时,这个类叫做抽象类 简单来说,多态是具有表现多种形态的能力的特征 同一个实现接口,使用不同的实例而执行不同操作 子类继承了父类,就继承了父类的成员方法和属性。 ...

    面向对象程序设计与实践-Java抽象类和接口[33页].pptx

    抽象类的特点 5-1关联知识 (1)抽象类中可以有抽象方法,也可以有非抽象方法 (2)抽象类必须被继承 (3)抽象类本身不能实例化,即不能使用new运算创建对象。只有它的非抽象子类可以创建对象,而抽象类定义的对象...

    西南科技大学Java程序设计与实践 实验三 类的继承与多态的应用

    2、在第 1 题的基础上,在抽象类中增加一个 drawSquare()方法,具体类中实现 这个方法。 三、实验要求: 1、将第 1 题抽象类名改为 Figure,三角形改为“等腰直角三角形”,各具体类名称 分别为 RightTriangle、...

    abstract class

    abstract class 抽象类--不具体的类 1) 抽象方法,只有行为的概念,没有... 4) 抽象类只能被继承,一个具体类继承一个抽象类,必须实 现所有抽象方法。 5) 抽象方法和抽象类非常适合作为系统的分析和设计的工具。

    Java学习笔记---15.面向对象编程10-Java中final关键字,抽象类与接口

    //B类继承自A类,但B未声明为抽象类,则必须要复写A类中所有的抽象方法 class Student extends Person { public void fun() { System.out.println("抽象方法中,Name = "+super.NAME); } } public class ...

    介绍Java的抽象类和接口的使用.docx

    有这么多类继承Animal类,那Animal类的say()方法这样写合适吗?因为每种动物说话的方式都不同,而动物又是这么宽泛的一个概念,我们通常会new Dog()或new People(),但很少会去new Animal()。 所以Animal类的say()...

    java面试宝典

    java面试题型大全 1. Java基础部分 4 1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?... 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法? 8

    java面试总结

    一. Java基础部分 7 1、一个".java"源文件中是否可以包括多个类(不是内部类... 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法? 15 21、写clone()方法时,通常都有一行代码,是什么? 15

    Java面试宝典

    抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法? 15 21、写clone()方法时,通常都有一行代码,是什么? 15 22、面向对象的特征有哪些方面 15 23、java中实现多态的机制是什么? 17 24...

    详解Android中的Context抽象类

    (2)该类是一个抽象(abstract class)类,Android提供了该抽象类的具体实现类(后面我们会讲到是ContextIml类)。 (3)通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作,例如:启动一个Activity,发送...

Global site tag (gtag.js) - Google Analytics