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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马-邢广耀 中级黑马   /  2013-1-8 19:17  /  2279 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-1-16 12:06 编辑

抽象类可不可以有构造函数?为什么?
在论坛上有类似的问题,可是有的说有,加技术分了,有的说没有,也加技术分了,迷茫了,求大神能解惑

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

12 个回复

正序浏览
抽象类是残缺的类,它的构造方法也是残缺的,同时抽象类又必须被继承,其子类只能重写抽象方法。如果自子类继承有构造方法的父类时又要调用其构造方法。所以抽象类中如有构造方法这是行不通的;
回复 使用道具 举报
抽象类作为上帝Object的子类是存在构造函数的,即使你没有定义抽象类的构造函数,java也会默认给你加上一个空参数的构造函数。抽象类通过子类的继承并覆写抽象方法来进行方法调用。
比较特殊的应该是接口,接口中所有的方法都是public和abstract的。并且没有构造函数。
简单的实验方法是写一个类,并定义其构造函数。看编译能否通过。
实验结果是:抽象类可以定义构造函数,而在接口中定义构造函数,编译器会报错。

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
所以说,关键点还是在于是否有实例字段。
回复 使用道具 举报
首先回答你的问题:抽象类可以有构造函数,但不能有公共构造函数。
      抽象类为什么要有构造函数?因为在抽象类中可以定义实例字段,派生类型会继承这个基类的所有字段,也就是说,基类有什么实例字段,派生类型中肯定也有什么字段。当我们创建一个派生类型的实例时,必须先初始化超类中的字段,然后才初始化他自己的字段。而初始化一个类中的实例字段的方式,只有一种,那就是通过构造函数去初始化。现在你能明白为什么抽象类要有构造函数的原因了吧。
     现在 ,你也可以理解为什么接口不能有构造函数了吧,因为接口不能定义实例字段咯。

希望你能看懂我所说的。

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
梁俊 黑马帝 2013-1-9 20:31:46
9#
有,实现类new时,使用
回复 使用道具 举报
这个完全有必要有,要不然怎么使用extends继承父类啊,
当子类实例化的时候,它会调用父类中默认的空构造函数。
如下面的例子:
abstract class AbstractClass {
        AbstractClass(){
                System.out.println("AbstractClass...");
        }
}

public class AbstractExtend extends AbstractClass {
        AbstractExtend() {
                System.out.println("AbstractExtend...");
        }

        public static void main(String[] args) {
                AbstractExtend a = new AbstractExtend();
        }
}
当然如果父类中是带参数的构造函数。那么就需要显式的传递参数来调用父类中的构造方法。

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
必须有,不然子类如何创建呢? 继承里面最重要的一条就是,子类构造函数会调用父类构造函数, 不过就是抽象类不能创建实例对象而已,
回复 使用道具 举报
1、抽象类是可以有构造函数的。很多人认为,构造函数用于实例化一个对象(或建立一个对象的实例),而抽象类不能被实例化,所以抽象类不应该有公共的构造函数。但不应该有“公共”的构造函数,和不应该有构造函数,这是两个不同的概念。
2、既然抽象类是可以,甚至有时候应该有构造函数,那抽象类的构造函数的作用是什么?我觉得至少有两个:
(1)初始化抽象类的成员;
(2)为继承自它的子类使用。举例如下:
  1. //定义一个抽象类
  2. abstract class Person
  3.   {   
  4.         Person(int i) {}
  5.   }

  6. public class Student extends Person
  7.   {
  8.    Student()
  9.         {
  10.      super(int i);//必须显式的调用父类构造方法,super代表父类对象
  11.     }
  12.   }
复制代码

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
这种为题:还有技术分啊!
抽象类是能写抽象函数的
回复 使用道具 举报
这个问题,你首先想想,子类是如何创建对象的?
是不是调用了父类的构造函数?假设这个抽象类没有构造函数,我想问的是你如何去子类实例化?
所以抽象类是有构造方法的,因为他必然需要子类去实现自己的抽象方法,然后去引用子类的对象。否则他的存在就没意义了。
回复 使用道具 举报
这个是有的,用于给子类对象初始化用的
回复 使用道具 举报
可以有的,这个构造方法会在调用重写了的抽象类的方法时调用,是这个抽象类自己使用的,比如它可以设定一下自己的私有成员变量
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马