1.如果定义了自定义构造函数,则默认构造函数不会被创建。
2.子类的构造函数中必须调用父类的构造函数,如果父类又没有参数的构造函数,或者默认构造函数,则系统会自动调用无参构造函数
3.如果父类中没有午餐构造函数,则必须手动调用。
4.finalize函数是protected void的
5.finalize函数是不可控的,如果想真的析构则用try catch finally 来执行析构
6.构造器也是Static,尽管没有被显示的写出来。
7.静态方法没有多态效果,6中已经说过构造器是隐含静态的,所以没有多态的效果。
多态错误的一个特例:
class Glyph
{
void draw()
{
System.out.println("Glyph.draw()");
}
Glyph()
{
System.out.println("Glyph() before draw()");
draw();
System.out.println("Glyph() after draw()");
}
}
class RoundGlyph extends Glyph
{
private int radius = 1;
RoundGlyph(int r)
{
radius = r;
System.out.println("RoundGlyph.RoundGlyph, Radius = " + radius);
}
void draw()
{
System.out.println("RoundGlyph.draw, radius = " + radius);
}
}
public class NewTest
{
public static void main(String[] args)
{
new RoundGlyph(5);
}
}
//output
Glyph() before draw()
<span style="color:#ff0000;">RoundGlyph.draw, radius = 0</span>
Glyph() after draw()
RoundGlyph.RoundGlyph, Raduus = 5
由于draw方法的多态效果,在父类构造的时候调用draw函数实际上调用的是子类的函数。但是由于父类在构造的时候子类的radius还没有被执行初始化,所以结果为0.所以在编写构造函数的时候要尽量遵循下面的规则:用尽可能简单的方法使对象进入正常状态,如果可以的话,避免调用其他方法。在构造器内唯一能能够安全调用的那些方法是父类中得final得方法。也可以是private得方法,他们自动属于final的,这些方法不能被覆盖,因为也就不会出现上述令人惊讶的问题。
<完>