我说一下,不对请指正:
“随着计算机的进步,‘不安全’的程序设计已成为造成编程代价高昂的罪魁祸首之一。”“初始化”和“清除”是这些安全问题的其中两个。许多C程序的错误都是由于程序员忘记初始化一个变量造成的。对于现成的库,若用户不知道如何初始化库的一个组件,就往往会出现这一类的错误。清除是另一个特殊的问题,因为用完一个元素后,由于不再关心,所以很容易把它忘记。这样一来,那个元素占用的资源会一直保留下去,极易产生资源(主要是内存)用尽的后果。
C++为我们引入了“构建器”的概念。这是一种特殊的方法,在一个对象创建之后自动调用。Java也沿用了这个概念,但新增了自己的“垃圾收集器”,能在资源不再需要的时候自动释放它们。本章将讨论初始化和清除的问题,以及Java如何提供它们的支持。4.1 用构建器自动初始化
对于方法的创建,可将其想象成为自己写的每个类都调用一次initialize()。这个名字提醒我们在使用对象之前,应首先进行这样的调用。但不幸的是,这也意味着用户必须记住调用方法。在Java中,由于提供了名为“构建器”的一种特殊方法,所以类的设计者可担保每个对象都会得到正确的初始化。若某个类有一个构建器,那么在创建对象时,Java会自动调用那个构建器——甚至在用户毫不知觉的情况下。所以说这是可以担保的!
接着的一个问题是如何命名这个方法。存在两方面的问题。第一个是我们使用的任何名字都可能与打算为某个类成员使用的名字冲突。第二是由于编译器的责任是调用构建器,所以它必须知道要调用是哪个方法。C++采取的方案看来是最简单的,且更有逻辑性,所以也在Java里得到了应用:构建器的名字与类名相同。这样一来,可保证象这样的一个方法会在初始化期间自动调用。(以上摘自think in java)
由于所以的类都继承自java.lang.Object,当你生成的新类,无论如何,其最终父类应该是Object类,当你的类不提供构造函数时,系统会为你构造一个default构造函数,其方法体为空。并且由于Object自己带有的构造函数Object()不为abstract,所以你的类也不可以为abstract。再来讨论一下有没有必要让构造方法为抽象的。
1、你想让构造方法抽象,无非是想强迫子类必须有构造函数,由于java的原则,即使当子类没有构造函数时,系统会生成一个default构造函数,这个子类显式的构造一个空方法体的构造函数不是一个意思吗?
2、根据java类继承的原则,子类必须实现父类的abstract函数,也就是说必须函数名、参数形式都完全相同(即覆写),由于构造函数必须与类名相同,而子类与父类的类名怎么会相同呢?所以,子类即使实现父类的构造函数,其构造函数只会成为子类的一个方法而已,而不是子类的构造函数。
说了一大堆,不知道我说清楚了没有,或者,也许我说得不对,请指正。

解决方案 »

  1.   

    我想这是为了 继承和工厂构造 考虑的,如果定义了抽象构造函数,那么子类或者工厂都必须显式实现这个构造函数,那么就限制了类构造的灵活度。
    UPUPUP
      

  2.   

    抽象方法根据实现类不同而不同
    所以java定义抽象构造函数无法保证抽象类一定被构造
    再例如子类的构造函数必须实现super(...)
    而super(...)这个实现又依赖于这个子类,那不是无限循环了么?
    如果java不强制super(...)那无法保证抽象类一定被构造
    如果你说例如<init>这样强制构造
    那和非抽象的构造函数没有区别了不是么