黑马程序员技术交流社区

标题: 向上转型构造函数问题 [打印本页]

作者: 郑义    时间: 2012-9-8 07:52
标题: 向上转型构造函数问题
本帖最后由 郑义 于 2012-9-8 08:10 编辑
  1. class Parent
  2. {
  3. public Parent()
  4. {
  5. System.out.println("调用Parent的构造方法");
  6. this.show();
  7. }
  8. public void show(){
  9. System.out.println("调用Parent的show方法");
  10. }

  11. }

  12. class Child extends Parent
  13. {
  14. public Child()
  15. {
  16. System.out.println("调用Child的构造方法");
  17. }
  18. public void show()
  19. {
  20. System.out.println("调用Child的show方法");
  21. }
  22. }

  23. public class Test
  24. {
  25. public static void main(String[] args)
  26. {
  27. Parent parent = new Child();
  28. System.out.println("------------------------");
  29. parent.show();
  30. }
  31. }
复制代码
其运行结果是这样的:

我想知道为什么会先调用Parent的构造函数然后再调用Parent的构造函数呢?
我以前一直认为是只调用Child的构造函数。这对我是一个盲点,今天才发现。
作者: 邱成    时间: 2012-9-8 08:03
class Parent
{
public Parent()
{
System.out.println("调用Parent的构造方法");
this.show();
}
public void show(){
System.out.println("调用Parent的show方法");
}

}

class Child extends Parent
{
public Child()
{
//super();
System.out.println("调用Child的构造方法");
}
public void show()
{
System.out.println("调用Child的show方法");
}
}

public class Test
{
public static void main(String[] args)
{
Parent parent = new Child();
System.out.println("------------------------");
parent.show();
}
}
派生类通过new构造方法创建对象,在调用构造方法时,默认执行的第一行是super();即调用父类的无参构造方法。
如果父类没有无参构造方法,系统会调用父类的默认无参构造方法(也就是一个方法体为空的无参构造方法);如果父类存在有参的构造方法同时没有无参构造方法,子类的构造方法就不能调用父类无参构造方法,表现就是编译不能通过了。你的代码中3掉用构造方法时,默认执行的第一行是super(),所以出现这种情况
希望对你有所帮助。
作者: 郑义    时间: 2012-9-8 08:10
邱成 发表于 2012-9-8 08:03
class Parent
{
public Parent()

对对对,忘了。基础不牢固啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2