黑马程序员技术交流社区

标题: 子类构造函数和父类的构造函数执行顺序 [打印本页]

作者: songkaihua    时间: 2014-12-20 00:27
标题: 子类构造函数和父类的构造函数执行顺序
本帖最后由 songkaihua 于 2014-12-21 21:45 编辑

class Fu
{
  public int num = 10;
  public Fu()
  {
   System.out.println("fu");
  }
}
class Zi extends Fu
{
  public int num = 20;
  public Zi()
  {
   
   System.out.println("zi");
  }
  public void show()
  {
   int num = 30;
   System.out.println(num);
   System.out.println(this.num);
   System.out.println(super.num);
  }
}
class Test
{
  public static void main(String[] args)  
  {
   Zi z = new Zi();
   z.show();
  }
}
这是我们的作业题,我不知道它的执行顺序,如果我按老师的讲的理解答案是 fu zi 30 20 0,但我运行结果是fu zi 30 20 10,不应是把父类中的num初始化了吗?上课没听懂……郁闷!这个题不是说子类的初始化过程中,首先回去执行父类的初始化动作?不知道大神懂我的意思不?

作者: jxlovqqvo    时间: 2014-12-20 16:53
看示例:
  1. package trst;

  2. public class Fz {

  3.         /**
  4.          * @param args
  5.          */
  6.         public static void main(String[] args) {
  7.                
  8.                 //创建一个子类对象
  9.                 Z z = new Z();
  10.                
  11.                
  12.                
  13.                 /*
  14.                  * 打印结果:
  15.                  *
  16.                  * 父类构造函数执行
  17.                         子类构造函数执行。。。。。。
  18.                         
  19.                         
  20.                         
  21.                     所以证明了 子类在调用构造函数时先调用了父类的构造函数
  22.                  */
  23.         }

  24. }
  25. class F{
  26.        
  27.         public F(){
  28.                 System.out.println("父类构造函数执行");
  29.                
  30.         }
  31.        
  32. }

  33. class Z extends F{
  34.        
  35.         public Z(){
  36.                 System.out.println("子类构造函数执行。。。。。。");
  37.         }
  38.        
  39. }
复制代码


你的打印结果为何是这样是因为你的方法
  1. public void show()
  2.   {
  3.    int num = 30;
  4.    System.out.println(num);
  5.    System.out.println(this.num);
  6.    System.out.println(super.num);
  7.   }
复制代码



System.out.println(num); 这个num程序会找到最近的num的,你的方法中有这个并且赋值为30,所以就是先打印它了
System.out.println(this.num); this代表本类,所以所以打印20
System.out.println(super.num); super代表父类,所以打印10
作者: songkaihua    时间: 2014-12-20 23:37
jxlovqqvo 发表于 2014-12-20 16:53
看示例:

恩恩,今天我又问老师来,跟你说的差不多,他说是子类在初始化之前会先初始化父类,我不知道我的表述是否正确,反正意思应该差不多吧!
作者: lwj123    时间: 2015-1-18 19:29
最后一个应该是10把
作者: 邱俊彬    时间: 2015-1-18 22:02
是fu zi 30 20 10继承中的子类构造函数都会有个隐式super();




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