2012-06-16 35 views
5

在这本书我读国中总结overiding构造教科书的部分不决策意识

“从技术上讲,构造函数不能overidden因为它们具有相同的名称与当前类的文本。新的构造函数创建的,而不是。被继承了该系统工作正常; ......“

我不明白的部分是,当他们这样说:

”当你的类的constuc tor方法被调用,所有超类的相同签名的构造方法也被调用。因此,初始化可以发生一类的所有部分你继承”

我不明白的是相同的签名部分....它配备防空火炮向我,好像所有构造函数必须具有相同的签名,然后当你初始化一个子类对象时,它的所有超类将自动被调用,而不必为每个子类调用super(arg1,arg2)....这就是他们说的吗?

+0

哪本教科书? – UmNyobe

+0

现在,我在21天内坚持使用Sams Teach Yourself Java 2。稍后将赶上java的新功能。但这是他们在说什么? –

+0

嗯,你是正确的混淆,因为它是不正确的... – UmNyobe

回答

2

当你的类的构造函数被调用时,所有超类的具有相同签名的构造函数方法也被调用。因此,初始化可能发生在您继承的类的所有部分上

这是不正确的。首先,关于术语的注释:构造函数不是方法,所以术语“构造函数方法”没有任何意义。

虽然确实调用了超类构造函数,但它不需要具有相同的签名。如果一个子类的构造开始于超类构造函数调用表达式如

class Student extends Person { 
    public Student(String name) { 
     super(name, Occupation.STUDENT); 
    } 
} 

超类构造中调用匹配参数计数和类型。您完全免费将您传递给该构造函数的参数。

如果子类构造函数没有以超级构造函数调用表达式开始,编译器会为您插入对超类的可访问零参数构造函数的调用,或者如果没有这样的构造函数,则会引发编译错误。

将由Sams的Java 2 21天,现在

你都知道的Java 2是一个十年已经过时?任何这本旧书都会教你过时的东西,你最好尽快忘记。为什么不使用更现代化的书?

10

那不是如果它是默认构造函数(即无参数构造函数),那么超类的构造函数只会自动调用。

如果您的超类s没有默认的构造函数,那么你必须用super(args..)明确地调用你选择的构造函数。

例如,这是完全正常的,尽管事实是BearManPig的构造比Animal不同的签名:

public class Animal { 
    public Animal() { 
    } 
} 

public class BearManPig extends Animal { 
    public BearManPig(String string) { 
    } 
} 

那是因为有一个Java中的默认的无参数的构造函数。

现在,当没有默认的构造函数时,您必须明确指出要调用哪一个。例如,这工作:

// DOESN'T COMPILE 
public class Animal { 
    public Animal(String string) { 
    } 

    public Animal(String string0, String string1) { 
    } 
} 

public class BearManPig extends Animal { 
    // There is no default constructor, stupid Java can't figure out what to do 
    public BearManPig(String string) { 
    } 
} 

但这:

// does compile 
public class Animal { 
    public Animal(String string) { 
    } 

    public Animal(String string0, String string1) { 
    } 
} 

public class BearManPig extends Animal { 
    public BearManPig(String string) { 
    super(string); // I've told Java what to do 
    } 
} 
+0

嗯谢谢@Tim Pote,这是我的想法,但我读了这段文字,它让我困惑。 –

4

所有超类不需要具有相同的构造函数的签名。
当您创建新对象时,如果没有定义构造函数,Java将不会调用超类的参数构造函数。如果您没有定义任何其他构造函数,则Java不提供参数构造函数。
如果您定义了任何其他构造函数,则必须在子类构造函数内调用它(在第一行)。
This可能会有所帮助。