黑马程序员技术交流社区

标题: abstract [打印本页]

作者: 黑马-邢广耀    时间: 2013-1-8 19:17
标题: abstract
本帖最后由 张向辉 于 2013-1-16 12:06 编辑

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

作者: 王少雷    时间: 2013-1-8 19:21
可以有的,这个构造方法会在调用重写了的抽象类的方法时调用,是这个抽象类自己使用的,比如它可以设定一下自己的私有成员变量
作者: 李培根    时间: 2013-1-8 19:24
这个是有的,用于给子类对象初始化用的
作者: 肖志锋    时间: 2013-1-8 21:17
这个问题,你首先想想,子类是如何创建对象的?
是不是调用了父类的构造函数?假设这个抽象类没有构造函数,我想问的是你如何去子类实例化?
所以抽象类是有构造方法的,因为他必然需要子类去实现自己的抽象方法,然后去引用子类的对象。否则他的存在就没意义了。
作者: 希望的曙光    时间: 2013-1-8 22:18
这种为题:还有技术分啊!
抽象类是能写抽象函数的

作者: 王晓斌    时间: 2013-1-8 22:41
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.   }
复制代码

作者: 王阳    时间: 2013-1-8 22:49
必须有,不然子类如何创建呢? 继承里面最重要的一条就是,子类构造函数会调用父类构造函数, 不过就是抽象类不能创建实例对象而已,
作者: 罗利华    时间: 2013-1-8 23:36
这个完全有必要有,要不然怎么使用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();
        }
}
当然如果父类中是带参数的构造函数。那么就需要显式的传递参数来调用父类中的构造方法。
作者: 梁俊    时间: 2013-1-9 20:31
有,实现类new时,使用
作者: 王宝生    时间: 2013-1-9 21:33
首先回答你的问题:抽象类可以有构造函数,但不能有公共构造函数。
      抽象类为什么要有构造函数?因为在抽象类中可以定义实例字段,派生类型会继承这个基类的所有字段,也就是说,基类有什么实例字段,派生类型中肯定也有什么字段。当我们创建一个派生类型的实例时,必须先初始化超类中的字段,然后才初始化他自己的字段。而初始化一个类中的实例字段的方式,只有一种,那就是通过构造函数去初始化。现在你能明白为什么抽象类要有构造函数的原因了吧。
     现在 ,你也可以理解为什么接口不能有构造函数了吧,因为接口不能定义实例字段咯。

希望你能看懂我所说的。
作者: 王宝生    时间: 2013-1-9 21:34
所以说,关键点还是在于是否有实例字段。
作者: 唐长智    时间: 2013-1-9 22:39
抽象类作为上帝Object的子类是存在构造函数的,即使你没有定义抽象类的构造函数,java也会默认给你加上一个空参数的构造函数。抽象类通过子类的继承并覆写抽象方法来进行方法调用。
比较特殊的应该是接口,接口中所有的方法都是public和abstract的。并且没有构造函数。
简单的实验方法是写一个类,并定义其构造函数。看编译能否通过。
实验结果是:抽象类可以定义构造函数,而在接口中定义构造函数,编译器会报错。

作者: 李洪因    时间: 2013-1-16 12:58
抽象类是残缺的类,它的构造方法也是残缺的,同时抽象类又必须被继承,其子类只能重写抽象方法。如果自子类继承有构造方法的父类时又要调用其构造方法。所以抽象类中如有构造方法这是行不通的;




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2