的所有事情很少首先要注意:
首先得到的一些想法访问修饰符:
关于私有构造:
防止子类(E xtending)。如果你只做一个私人的构造函数(只有有一个构造函数),没有类可以扩展你的类,因为它不能调用构造函数super()
。 read more
而且一点关于构造函数:
- 构造函数永远不会继承 - 他们是特定于 类定义它们。
- 如果没有构造函数实现,默认构造函数将隐式加入 编译器。
- 在子类中没有调用
super()
编译器会自动将这些添加到所有构造函数中。
- 当构造子类的新对象时,超类的构造函数 始终首先调用。
- 构造函数的调用可能是隐式的或显式的。
- 显式调用超类的构造函数:
super()
- 必须是子类构造函数中的第一条语句。
没有任何的构造函数MG
:
在这一行public class MG extends Car {
月食显示错误:
Implicit super constructor Car()
is not visible for default constructor. Must define an explicit constructor.
因为继承的,你需要将值传递给父类的构造。
而对于这个new MG(7);
:
The constructor MG(int) is undefined
因为你DONOT有任何参数的构造函数中MG
类。
UPDATE:
你说你的问题,你只需要知道行号7,11,12,13和14,但我会回答所有的线。然后,其他人谁在寻找的答案也可以理解
如果您取消注释行号7:
当我们创建一个子类永远是父母的构造得到完成的对象和孩子的构造稍后运行。
当您运行程序时,首先在主要方法new MG(7);
对象中寻找MG
中的匹配构造函数,即MG(int x) {}
。里面有super()
这是编译器加了一个。然后编译器在父类中查找默认构造函数,因为默认构造函数是private
,所以找不到它。
要解决这个问题:MG(int x) {super(x);}
如果您取消注释行号8:
当你运行该程序,首先在main方法new MG(7);
对象寻找在MG
,这是找到匹配的构造。
MG(int x) {super()}
如果你添加了super()
或者编译器不会添加这个。在这两个之间没有什么不同:
MG(int x) {}
MG(int x) {super()}
如果您取消注释行号9:
这条线是罚款(没有错误)。第一个编译器寻找构造函数(MG(int x) { super(x); }
for object(new MG(7);
))然后在构造函数里面调用super(x)
它有一个参数并且与父类的构造函数匹配正如我前面提到的,父类构造函数先执行,然后子类构造函数执行。
如果您取消注释行号10:
private MG(int x) { super(x); }
访问修饰符不会受到影响,因为这个类是一个子类,它不是任何一类的父类。我们可以通过调用private
构造函数来创建对象。 read more about private constructor。
如果您取消注释行号11:
MG() { }
它是与之相匹配的new MG();
对象。编译器已添加super()
,但在父类中找不到匹配的构造函数。
如果您取消注释行号12:
MG() { this(); }
首先,让我们看看什么是this()
:
this
可以在方法或类的构造函数中使用。
this
作为引用当前Object的方法或 构造函数被调用。
- 此关键字可用于从实例Method或构造函数中引用当前对象的任何成员。
this()
关键字可以在构造函数中用于调用另一个 重载的构造函数在同一个类中。
- 这也称为显式构造函数调用。
- 而且
this()
和super()
都不能在一个构造函数中使用。
所以这条线是不必要的,因为你没有任何其他MG()
构造函数。 learn more about this
。
如果您取消注释行号13:
MG() { this(6); }
这也是不必要的或不能被称为除非你有另一MG()
构造。如果你这样做:
MG(){
this(6);
}
MG(int x){
super(x);
}
这里发生什么事是,当你运行程序new MG();
对象发现默认的构造函数和它调用参数的构造函数(MG(int x){}
)。然后在这个构造函数中取值并发送给父类。
如果您取消注释行号14:
MG() { super(7); }
new MG();
与costructor匹配,并在其中你通过价值7
父类参数的构造函数。
完成。
哦,我明白了!谢谢Rijuk。我不知道super()将被称为 –
反正我相信我现在明白了。谢谢! –
没问题。祝你好运与编码:) – Rjiuk