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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 钟成军 高级黑马   /  2012-5-7 00:35  /  2474 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在子类继承了父类时,在带参数的构造函数中,两种赋值方法有什么不同,比如如下:
class Zi extends Fu
{
//private String name;
Test(String name)
{
  //this.name = name;
  super(name);
}

}
this.name = name;

super(name);
有什么区别呢?一直没有搞清楚这个super,求高手用通俗一点的例子解释一下,谢了!!

6 个回复

倒序浏览
super(name);就是调用父类的构造函数进行赋值
this.name = name;就是在当前类进行赋值
用super提高代码的复用性,不必再多写重复代码
回复 使用道具 举报
//子类在初始化时,一定访问了父类的构造函数
//因为子类继承了父类,获取到了父类中内容(属性),所以在父类
//内容之前,要先看父类是如何对自己的内容进行初始化的,
//你这样必须有一个前提,就是父类中带参数的构造函数,不然一样报错。
//class Fu
{
        private String name;
   public Fu(String name)
        {
     this.name=name;
   }
}
class Fu
{
        private String name;
        public Fu()
        {
         
        }
   public Fu(String name)
        {
     super();
   }
   public String getName()
        {
     return name;
   }
}
class Zi extends Fu
{

Zi(String name)
{
  super(name);
}

}
class  Test
{
        public static void main(String[] args)
        {
                Zi  z=new Zi("zhangsan");
                System.out.println(z.getName());
        }
}
你这个代码错误太多,你构造函数的名字和类名不一样你发现没有,
建议你重新学习面向对象的封装和继承,基础你一点没懂
回复 使用道具 举报
class Zi extends Fu
{
//private String name;
Test(String name)//这里的Test是不是楼主写错了,应该是Zi才对吧,
{
   //this.name = name;
   super(name);
}

}
当定义一个类时,若没有自定义构造方法,系统会默认的给出一个类的无参空构造,当类中有自定义的构造方法,系统不会再给出无参空构造;
子类继承父类,在子类的构造方法中的第一行,系统会默认的给加上一个父类的无参构造方法super(),当父类有自定义构造方法时,在子类构造方法的第一行必须显示写出父类的自定义构造方法。
回复 使用道具 举报
天道酬勤 发表于 2012-5-7 00:59
//子类在初始化时,一定访问了父类的构造函数
//因为子类继承了父类,获取到了父类中内容(属性),所以在 ...

恩,面向对象这一块是比较模糊的,还得多加强学习,谢谢指导
回复 使用道具 举报
本帖最后由 龚正军 于 2012-5-7 01:43 编辑

虽然就几行代码,但涉及的基础问题不少,楼主问的问题也含糊不清,不知道你的盲点在哪儿?但是我根绝我猜测的方向跟你解释下:

首先:this.name = name; 你的第一个问题,你要弄清楚this是什么,具体this的定义是:代表它所在函数所属对象的引用。我给你通俗解释就是this你要搞清楚它首先代表一个“对象”,并且这个“对象”只能是本类,并且调用到this所在函数的那个“对象”。


比如:------------,就如同英语里面介绍人一样this is John . this is Mike (这里面的 this开始是john,后来变成Mike.但是John和Mike都是你介绍的人类,John和mike都是属于人这个“类“中的一个对象,this代表了这个“对象”)

同理:class Zi extends Fu    ......................中的this代表的有是一个本类对象,就是使用这个方法的对象(那个东西或则我们称他为类),很明显里面只有2个类一个zi,一个是FU,很明显是ZI是本类,那么他代表的就是ZI这类的用他时候的“对象”。

------------------------------------------割掉,都焦了-------------------------------------------------

那么SUPER就跟THIS一样了,只不过SUPER代表的是本类继承的父类而且,其他都一样。class Zi extends Fu 中写得很清楚继承的是Fu类,SUPER肯定代表的是Fu类并且使用SUPER的该类对象。


但是super(name);
这句话代表的就不仅仅是SUPER本身了,他还代表类在初始化的时候以及构造函数。这部分应该不会有盲点和难点,你可以从新看下“构造函数”那部分视频!!!


------------------希望能在盲点上帮助你。
回复 使用道具 举报
本帖最后由 隋营营 于 2012-5-7 08:10 编辑

我想楼主的意思应该是这样的:

public class Testext {
    public static void main(String[] args) {
        Zi zi = new Zi("Zi");      //首先创建 类Zi 的对象,
    }
}

class Fu {
    String name;

    Fu(String name) {
        this.name = name;    //表示将参数name的值赋给成员变量name
        System.out.println(name);
    }
}

class Zi extends Fu {
    String name;

    Zi(String name) {
        super(name);
        this.name = name;
        System.out.println(name);
    }
}
创建 类Zi 的对象的过程:
首先调用父类带参数的构造函数:Fu(String name) 这样Fu类中成员变量name被赋值为 "Zi"
然后执行语this.name = name;将父类的成员变量name赋值为 "Zi"

所以super(name)语句的作用:调用父类带参数的构造函数

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马