黑马程序员技术交流社区

标题: 继承中this和super的问题 [打印本页]

作者: 小马过河    时间: 2013-12-20 15:48
标题: 继承中this和super的问题
本帖最后由 小马过河 于 2013-12-20 15:50 编辑

复制代码
  1. <blockquote>package Num;
复制代码
package Num;
/*
参数传递问题
*/
class Fu{
        int num = 10;
       
        public Fu(int a)
        {
                System.out.println(a);
        }
}
class Zi extends Fu
{
        public Zi()
        {
                this(20);
                System.out.println("zi");
        }
        public Zi(int a)
        {
                super(a);
                System.out.println(a);
        }
}
class Num
{
        public static void main(String[] args)
        {
                Zi zi = new Zi();
                Zi zi2 = new Zi(10);
        }
}
/*最终得到的结果是20,20,zi,10,10.
问题1:上面的结果是怎么得到的呢?
问题2:this()的用法?具备传递参数的作用?若是能传值不与父类的10冲突?
问题3:super使用仅限于构造方法?*/



{:soso__8746507594857833966_1:}

作者: 小马过河    时间: 2013-12-20 15:49
斑竹,我的代码捏,我是在<>里面的代码捏
作者: 伍艳雄    时间: 2013-12-20 15:51
代码呢???、{:soso_e114:}
作者: 小马过河    时间: 2013-12-20 15:51
囧....为什么人家可以贴代码
作者: 乔兵    时间: 2013-12-20 16:10
小马过河 发表于 2013-12-20 15:51
囧....为什么人家可以贴代码



作者: litaojisuanji    时间: 2013-12-20 16:33
第一个问题:
Zi zi = new Zi();
步骤:
        1.new Zi(),默认调用Zi类的无参构造方法,完成创建对象。
        2.进入子类无参构造方法时,this(20),调用子类带参构造,并传入形参20。
        3.进入子类带参构造,super(a)也就是super(20),进入父类带参构造,并传入形参20。
        4.进入父类带参构造,打印a,因为局部变量有a,局部隐藏了成员,所以使用局部传来的是20,先打印出20。
        5.父类带参构造方法结束,返回到调用的子类带参构造,打印a,因为局部有a,所以使用局部的a,打印出20。
        6.子类带参构造方法使用结束,返回到调用的子类无参构造,打印字符串"Zi"。
Zi zi2 = new Zi(10);
步骤:
        1.new Zi(10),调用Zi类的带参构造方法,完成创建对象。
        2.进入子类带参构造方法,传入10,子类super(a),也就是super(10),进入父类构造,并传入形参20.
        3.进入父类带参构造,打印a,因为局部变量有a,所以打印子类传来的局部a,10
        4.父类带参构造结束,返回到调用的子类带参构造,打印a,因为局部有a,所以使用局部的a,打印出10.
所以打印的是20 20 Zi 10 10

第二个问题
this(),是调用本类的其它构造方法,如果不带参数,则是调用无参构造方法
这个不和父类冲突,父类的成员变量有父类的初始化,子类成员变量有子类的初始化,
两个使用的可能是需要不同值的。

第三个问题
super不是仅限于构造方法的。
super是父类存储空间的标识,你可以super.变量名使用父类的变量,前提父类变量不是私有的。
也可以用super.方法名()调用父类的方法。
多看看视频,研究下内存就知道了。
写累死了。。。
作者: 伍艳雄    时间: 2013-12-20 17:13
  1. class Fu
  2. {
  3.         int num = 10;
  4.          
  5.         public Fu(int a)//6,13
  6.         {
  7.                 System.out.println(a);//7,打印一次20;   14,打印一次10
  8.         }
  9. }
  10. class Zi extends Fu
  11. {
  12.         public Zi()//2,
  13.         {
  14.                 this(20);//3,
  15.                 System.out.println("zi"); //9,打印一次zi
  16.         }
  17.         public Zi(int a)//4,  11
  18.         {
  19.                 super(a);//5,  12
  20.                 System.out.println(a);//8,打印一次20; 15,打印一次10
  21.         }
  22. }
  23. class Num
  24. {
  25.         public static void main(String[] args)
  26.         {
  27.                 Zi zi = new Zi();//1
  28.                 Zi zi2 = new Zi(10);//10
  29.         }

  30. }
复制代码


this();只能调用本类的方法。与父类不冲突。
super的使用和this的使得几乎一致。
        this代表的是本类对象的引用。
        super代表的是父类对象的引用。
建议你看一下毕老师的基础视频第7天的06.。不懂就多看几遍吧。
作者: 小马过河    时间: 2013-12-20 17:26
litaojisuanji 发表于 2013-12-20 16:33
第一个问题:
Zi zi = new Zi();
步骤:

很详细。谢谢哦




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