2017-05-28 63 views
1

我有一个代码片段,我应该确定哪一行我应该取消注释以便编译。什么行应该被取消注释,为什么,继承

问题:为什么只有第9,13和10,14行有效?为什么不会9,14工作?我有点困惑。帮助非常感谢! (顺便说一句,该选项仅取消注释两行代码)

1. // Question 3.1 
2. class Car { 
3. private Car() { } 
4. protected Car(int x) { } 
5. } 
6. public class MG extends Car { 
7. // MG(int x) { } 
8. // MG(int x) { super(); } 
9. // MG(int x) { super(x); } 
10. // private MG(int x) { super(x); } 
11. // MG() { } 
12. // MG() { this(); } 
13. // MG() { this(6); } 
14. // MG() { super(7); } 
15. public static void main(String[] args) { 
16. new MG(7); 
17. new MG(); 
18. } } 

相信缺乏了解来自私有构造的不够熟悉和保护的访问修饰符,所以我读上我也将继续尝试搞清楚。

编辑:好吧,我现在差不多了,首先8行不能被调用,所以8和11-14的选项都消失了。第7行 - 为什么不能要求例如与第11行?我相信MG(){}会被调用,但首先必须调用私人车(),错误。与线12不可能的,因为比我更需要线11条,与13号线不知道为什么,有14行不知道为什么..

回答

1

我在Ideone上写过这篇文章,因为我非常肯定第9行和第14行应该可以工作,而且它们也行!

入住在这里(代码)

在这个例子中需要记住的唯一重要的事情是,如果你不调用父类的构造,Java将调用它以这种方式“超()”。由于你的父类非参数构造函数是私有的,它不会被编译。

这就是为什么第7,8,11行显然是错误的。

+0

哦,我明白了!谢谢Rijuk。我不知道super()将被称为 –

+0

反正我相信我现在明白了。谢谢! –

+1

没问题。祝你好运与编码:) – Rjiuk

-1

的所有事情很少首先要注意:

首先得到的一些想法访问修饰符:

enter image description here

关于私有构造:

防止子类(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父类参数的构造函数。

完成。

+0

没有任何类是私有的。他们有私人建设者。 – Rjiuk

+0

我已经更新了答案 – Blasanka

1

继承

子类在默认情况下得到的所有父类的方法,变量,构造函数的访问。

当你要创建子类的对象然后(jvm隐式调用零参数构造函数)第一个父类构造函数被执行,然后是子类构造函数。

在你的情况下,你显式调用超类的构造函数。

在构造函数中使用print语句,您将获得清晰的想法...

+0

是的,我现在得到了Navnath。谢谢 –

相关问题