Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 爪哇:为什么;这是我的建议;是否不被覆盖?_Java_Constructor_Overriding_This_Final - Fatal编程技术网

Java 爪哇:为什么;这是我的建议;是否不被覆盖?

Java 爪哇:为什么;这是我的建议;是否不被覆盖?,java,constructor,overriding,this,final,Java,Constructor,Overriding,This,Final,请参见以下示例: 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

请参见以下示例:

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
问题1:java似乎没有为“this(1)”执行后期绑定。编译时已决定。请确认

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


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

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

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

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

B() {
    super();
}

不能重写构造函数。他们根本不遵循继承规则。它们不能遵循固有性规则,因为构建对象需要一个简单的顺序

e、 在你的例子中,如果你可以重写A(int)构造函数,A()会调用B(int),但是B(int)隐式调用super(),super()是A(),你有无限递归

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

如果构造函数是final的,比如
static final
方法,你也不能隐藏它们,但是你可以,所以我想说它们也是
final

问题2:这不是关于构造函数,而是关于这个。这总是指类或超类中存在的方法/字段,而不是子类中的方法/字段。这是有道理的,因为父对象不知道子对象的实现


问题3:某种程度上,构造函数是一种特殊的方法,重写它们没有意义,因为它们是链接的

Java不会重写构造函数

ao=新的B();
它将调用B(),其中它将调用super()

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

答复:

Q1:java似乎没有对“this(1)”执行后期绑定。编译时已决定。请确认。

是的,只有在编译时才决定构造函数

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

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

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

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

编辑:
子类从其超类继承所有成员(字段、方法和嵌套类)。构造函数不是成员,因此它们不会被子类继承,但是可以从子类调用超类的构造函数

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

因此,对
B()
的调用将调用构造函数
a()
,后者将调用
a(1)

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

“this()”未被重写“没有任何意义,您的任何其他问题也没有任何意义


这里发生的一切是
B
的构造函数都隐式地调用
super()
,因为您没有编写任何其他代码,
super()
A()
,它调用
this(1)

相关:这并不能解决问题。他知道
A::A()
被隐式调用。他不明白为什么
A::A()中的
this(1)
调用
A::A(1)
而不是
B::B(1)
A
B