4

请参见下面的示例:

class A {
   A() { this(1); }
   A(int i) { System.out.println("A" );  }
}

class B extends A {
    B() {}
    B(int i) {  System.out.println("B" );  }
}

public class Test
{
    public static void main(String[] args)   {        
       A o =  new B();
    }
}

输出:

A

Q1:似乎 java 没有为“this(1)”执行后期绑定。这是在编译时决定的。请确认。

Q2:Java 不对任何构造函数执行后期绑定。请确认。

Q3:这是否意味着构造函数是隐式最终的?

4

6 回答 6

7

您不能覆盖构造函数。他们根本不遵循继承规则。他们不能遵循继承规则,因为您需要一个简单的顺序来构造您的对象。

例如,在您的示例中,如果您可以覆盖 A(int) 构造函数,A() 将调用 B(int),但 B(int) 隐式调用 super(),即 A(),并且您具有无限递归。

构造函数调用 overrable 方法通常被认为是不好的做法。因此,让构造函数自动执行此操作将是一个非常糟糕的主意。

如果构造函数是最终的,就像static final方法一样,你也不能隐藏它们,但你可以,所以我会说它们都是final

于 2012-06-07T07:51:58.717 回答
2

Java 不会覆盖构造函数。

A o = new B(); 它将调用 B(),其中将调用 super()。

A()将被调用,在这里你正在调用this(1)这意味着它会调用A(1)所以没什么奇怪的。当你谈论构造函数时,一切都是在编译时决定的。

答案:

Q1:Seems java does not perform late binding for "this(1)". It has been decided at compile-time.Please confirm.

是的,仅在编译时决定构造函数。

Q2:Java does not perform late binding on any constructors. Please confirm.

因为没有覆盖所以没有后期绑定。

Q3:Does this mean constructors are implicitly final?

不,它们不是最终的,但你不能覆盖它们。

编辑: A subclass inherits all the members (fields, methods, and nested classes) from its superclass. Constructors are not members, so they are not inherited by subclasses, but the constructor of the superclass can be invoked from the subclass参考 Java 文档

于 2012-06-07T08:00:45.303 回答
1

Q1:是的

Q2:这与构造函数无关,更多的是关于这个。这总是指类或超类中存在的方法/字段,而不是子类中的方法/字段。这是有道理的,因为父母不知道孩子的实施

Q3:构造函数是一种特殊的方法,重写它们是没有意义的,因为它们是链式的

于 2012-06-07T07:52:33.150 回答
0

创建子类的实例时,必须调用超类的构造函数。

如果您未指定构造函数,则会为您调用默认(无参数)构造函数。

换句话说, , 中的无参数构造函数B实际上执行为:

B() {
    super();
}
于 2012-06-07T07:51:17.280 回答
0

当您实例化一个子类构造函数时,它首先调用其超类的默认构造函数,然后再执行它自己的任务。这是隐式或通过super()引用完成的。

所以调用B()将调用构造函数A(),它将调用A(1)

同样,如果您调用B(2)输出将是(它将调用默认构造函数 A() 然后 A(1)

A
B
于 2012-06-07T08:05:15.587 回答
0

'"this()" is not overridden' 没有任何意义,您的任何其他问题也没有任何意义。

这里发生的所有事情都是 for 的构造函数B都隐式调用super(),因为您没有编写任何其他代码,并且super()isA()调用this(1).

于 2012-06-08T01:07:58.997 回答