A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马李文 中级黑马   /  2013-7-31 00:12  /  1383 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马李文 于 2013-7-31 21:49 编辑

函数运行的结果是:
A、子类无参构造函数 子类有参构造函数  父类无参构造函数
B、子类有参构造函数 子类无参构造函数  父类无参构造函数
C、父类无参构造函数 子类有参构造函数  子类无参构造函数
D、父类有参构造函数 子类有参构造函数  子类无参构造函数
  1. public class Test
  2. {
  3.         public static void main(String [] args)
  4. {        
  5. Child c = new Child();
  6. }
  7. }
  8. class Father
  9. {
  10.         public Father()
  11. {
  12.                 System.out.println("父类无参构造函数");
  13.         }
  14.         public Father(String name)
  15. {
  16.                 System.out.println("父类有参构造函数");
  17. }
  18. }
  19. class Child extends Father
  20. {
  21. public Child()
  22. {
  23. this("dd");
  24.                 System.out.println("子类无参构造函数");
  25. }
  26. public Child(String name){
  27. super("dd");
  28.                 System.out.println("子类有参构造函数");        
  29. }
  30. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1

查看全部评分

5 个回复

倒序浏览
本帖最后由 xuaner0719 于 2013-7-31 21:16 编辑

Child c = new Child();函数走向
首先执行子类中的无参构造函数。
  • public Child()
  • {
  • this("dd");//调用本类的有参函数
  •                 System.out.println("子类无参构造函数");
  • }
就是
  • public Child(String name){
  • super("dd"); //调用父类中的有参函数 ,System.out.println("父类有参构造函数");
  •                System.out.println("子类有参构造函数");
  • }
回到子类无参函数
System.out.println("子类无参构造函数");







评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
D、父类有参构造函数 子类有参构造函数  子类无参构造函数
详解:
Child c = new Child();
1.首先执行子类中的无参构造函数。
2.运行this("dd");调用子类本类有参的函数。
3.运行super("dd");调用父类有参构造函数。
4.执行System.out.println("父类有参构造函数");
5.回到子类有参构造函数执行System.out.println("子类有参构造函数");
6.回到子类无参构造函数执行System.out.println("子类无参构造函数");

希望与楼主共同探讨{:soso_e100:}






评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 Mr_Free 于 2013-7-31 07:38 编辑

答案应该是d ;
因为你定义的 是Child c = new Child();  
所以调用的 是child里面的空参数构造函数,在空参数构造函数里面第一句就是this("dd");这里访问子类的Child(String name)构造函数,
然后我们调用Child(dd)进去之后发现他第一句是super("dd");这里访问的是父类的  public Father(String name)构造函数,
然后我们调用Father("dd"),执行system.out.println("父类有参构造函数");之后在会过来执行Child(dd)里的 System.out.println("子类有参构造函数");      
最后在执行 System.out.println("子类无参构造函数");
话说楼主就贴了个代码,也不知道你哪里有问题。。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
D、父类有参构造函数 子类有参构造函数  子类无参构造函数
注解:
1:但在主函数中执行Child c = new Child();时,就创建一个对象,这时就调用了子类Child的无参构造函数Child()。
2:当在无参构造函数Child()中执行this("dd")时;就调用了子类有参构造函数Child(String name)。this(“dd”)这叫构造函数之间的平行调用。
3:在有参构造函数Child(String name)中执行super("dd");时,就调用了父类的有参构造函数public Father(String name)。其实在默认的情况下,
    子类构造函数的第一行都用super()语句,默认先调用父类中的无参构造函数。
所以答案是D。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 田磊阳 于 2013-7-31 09:50 编辑

上面讲得很明白了,我就补充一点
构造函数中,子类隐式的super()函数和this()构造函数平行调用不能同时出现,这是java的一个运行机制,简单点说就是this()平行调用要求放在第一行,super()隐式函数也是要求放在第一行,这样两个函数会打架的,哈哈,所以有了this()后,隐式的super()就不会出现了~~~
  1. <p>public Child()

  2. {
  3.               //super();有了this()了,super()就没了
  4.               this("dd");
  5.               System.out.println("子类无参构造函数");

  6. }

  7. public Child(String name)</p><p>{
  8.                 super("dd");
  9.                 System.out.println("子类有参构造函数");        
  10. }
  11. </p>
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马