A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 多多 中级黑马   /  2013-9-8 22:43  /  2257 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 潘才新 于 2013-9-12 23:24 编辑

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

4 个回复

倒序浏览
本帖最后由 苏联兵 于 2013-9-9 14:38 编辑

可以继承,但是和实体类的继承一样,也要求父类可继承,并且拥有子类可访问到的构造器。
class Person
{
        Person()
        {
           System.out.println("抽象类可以继承具体类");
        }
}

abstract class Study extends Person
{
        abstract void study();
}
class Mike extends Study
{
        void study()
        {
           System.out.println("学习Java");
        }
}
class Jock extends Study
{
        void study()
        {
           System.out.println("学习C语言");
        }
}
class Parte extends Study
{
        void study()
        {
           System.out.println("学习html");
        }
}





class AbstractDemo
{
        public static void main(String[] args)
        {
                Study m = new Mike();
                m.study();

                Study j = new Jock();
                j.study();

                Study p = new Parte();
                p.study();
        }
}
所有的class都必须有一个构造方法,如果你没有在代码里声明构造方法,系统会自动给你生成一个共有无参的构造方法,而你只要自己声明了一个构造方法,无论有参无参,私有公有,系统就不再帮你生成默认无参构造器,所有的子类构造器都要求在第一行中调用父类构造器,如果不写,系统就默认去调用父类的无参构造器。
  1. class A()
  2. {
  3.         public A(){}
  4. }

  5. //B继承A的时候,则是
  6. abstract class B extends A
  7. {
  8.         public B(){
  9.                 super();
  10.         }
  11. }
  12. //要想知道继承规则的内部情况,在上面加个私有构造器,有无参都行。
  13. classA{
  14.     private A(){}
  15. }/*
  16.   这个时候系统就不再给你默认的无参构造器,B的构造器去调用super(),找不到A的无参构造器
  17.   所以导致abstract class B extends A{}编译不能通过,(因为A中没有任何无参构造器可供子类调用,其实这个时候A只能够提供内部类继承,)

  18. */
复制代码
所以现在你应该了解“实体类必须有明确的构造函数”的含义:
1,没写构造器的,那就是拥有默认无参公有构造函数的,子类可以什么都不写,让默认构造器去调用它。这是最初那两行代码的情况。
2,写了子类可访问的无参构造器的,也是一样,子类里可以什么都不写,用默认机制调用。
3,写了有参构造器却没写无参构造器的,父类里没有子类可访问的无参构造器,子类必须在子类构造器里的第一句写明,调用父类有参构造器,并把参数传进去。
4,声明为final的以及所有构造器都不再=在子类访问权限之内的类无法继承。
其实只要是在类的继承中无论抽象还是实体,都需要符合这个规定,上面的代码中随时删掉或加上abstract的前提,结果没有变化,个人觉得“实体类必须有明确的构造函数”这一句是在是无法把这个情况表达清楚。

评分

参与人数 1技术分 +1 收起 理由
黄文伯 + 1 很给力!

查看全部评分

回复 使用道具 举报
本帖最后由 吕振中 于 2013-9-9 08:33 编辑

可以被继承的。
但需要注意:继承后的子类还是一个抽象类,不可以被New关键皱起键字所实例化,可以通过其它子类继承此类后,并对抽象类进行覆盖,由其他类来实例化。

评分

参与人数 1黑马币 +3 收起 理由
黄文伯 + 3 赞一个!

查看全部评分

回复 使用道具 举报
亲,如问题已解决请将分类的“未解决”改为“已解决”。
以后的问题贴也要及时更改分类哦~
回复 使用道具 举报
抽象类和普通类对于继承没什么区别,只是多了抽象方法而已,只是在被继承的时候会不一样
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马