黑马程序员技术交流社区

标题: 构造函数和初始化方法的问题 [打印本页]

作者: 任江峰    时间: 2013-5-16 17:16
标题: 构造函数和初始化方法的问题
本帖最后由 任江峰 于 2013-5-16 17:51 编辑

求分析程序运行结果:
  1. class Super
  2. {
  3.         Super()
  4.         {
  5.                 init();
  6.         }
  7.         void init()
  8.         {
  9.                 System.out.println("Super init run..");
  10.         }
  11. }

  12. class  TestInit extends Super
  13. {
  14.         TestInit()
  15.         {
  16.                 init();
  17.         }

  18.         void init()
  19.         {
  20.                 System.out.println("Test init run..");
  21.         }

  22.         public static void main(String[] args)
  23.         {
  24.                 new TestInit();
  25.         }
  26. }
复制代码

作者: 张金铎    时间: 2013-5-16 17:21
本帖最后由 张金铎 于 2013-5-16 17:43 编辑


package com.itheima;
class Super
{
        Super()//3 父类构造函数,进入4,
        {
                init();//4  因为此函数被子类构造函数调用,所以init() 也会先从子类中找,跳往5
        }
        void init()
        {
                System.out.println("Super init run..");
        }
}

class  TestInit extends Super
{
        TestInit()//2   构造函数
        {
                        //super();  //此处有一个默认的调用父类无参构造函数(尽管你没写,但是编译会自动生成),此处跳往3
                init();// 7  此处再次调用init(),跳往8
        }

        void init()//5  进入方法,跳往6                //8. 进入方法,跳往9
        {
                System.out.println("Test init run..");// 6  执行输出语句,完后,跳往7        //        9.输出然后结束。
        }

        public static void main(String[] args)
        {
                new TestInit();///1入口第一步,new新对象,调用构造方法,跳到2
        }
}


作者: 刘学明       时间: 2013-5-16 17:26
  1. class Super
  2. {
  3.         Super()
  4.         {
  5.                 init();       先执行父类的构造方法  输出Super init run..
  6.         }
  7.         void init()
  8.         {
  9.                 System.out.println("Super init run..");
  10.         }
  11. }

  12. class  TestInit extends Super
  13. {
  14.         TestInit()
  15.         {        
  16.                //super();
  17.                 init();  // 再执行子类的构造方法 Test init run..
  18.         }

  19.         void init()
  20.         {
  21.                 System.out.println("Test init run..");
  22.         }

  23.         public static void main(String[] args)
  24.         {
  25.                 new TestInit();
  26.         }
  27. }
复制代码
输出结果:
Super init run..   
Test init run..


作者: 王永贺    时间: 2013-5-16 17:27
子类在调用自己的构造方法的时候会先调用父类相同的构造方法。。。。
作者: chouwayメ    时间: 2013-5-16 17:39
本帖最后由 chouwayメ 于 2013-5-16 19:02 编辑

从main开始:new了个TestInt().   
java就加载了 类为TestInt参数为空的构造函数 TestInt,进行初始化。
初始化函数中第一句如果没有特别说明 则会有默认的super();进行父类初始化。
所以这时候就转到父类中了,然后父类中其实也会有super()只不过是上帝Object没反应而已。。
接着加载父类中的init()方法进行打印输出:Super init run..
这句完成后也就走完父类了 接着走TestInt的init()方法打印输出:Test init run..



————————————
我错了。  二楼才是正解。  很奇怪为什么明明父类中有 怎么还要到子类中找init( )?

自己想了下 :是不是父类中的方法不是类成员或者没被实例化才没有被加载
作者: 任江峰    时间: 2013-5-16 17:52
谢谢楼上各位,看明白了。
作者: xuemeng    时间: 2013-5-16 17:56
二楼正解, 三楼错误!!
作者: xuemeng    时间: 2013-5-16 18:03
任江峰 发表于 2013-5-16 17:52
谢谢楼上各位,看明白了。

楼主不知道你是否真的明白? 你没发现二楼和三楼的答案不一样吗?   二楼的答案和分析是正确的, 三楼错了
这道题考点, 一是靠子类new 对象时会先初始化父类, 二就是考多态, 很多人这种情况都会忽略掉多态

作者: 任江峰    时间: 2013-5-16 18:20
xuemeng 发表于 2013-5-16 18:03
楼主不知道你是否真的明白? 你没发现二楼和三楼的答案不一样吗?   二楼的答案和分析是正确的, 三楼错了
...

谢谢提醒,三楼是错了。程序输出两行Test init run..然后结束。
不会执行父类的init()方法。




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