黑马程序员技术交流社区

标题: 关于关键字super的疑问,求解?? [打印本页]

作者: 钟成军    时间: 2012-5-7 00:35
标题: 关于关键字super的疑问,求解??
在子类继承了父类时,在带参数的构造函数中,两种赋值方法有什么不同,比如如下:
class Zi extends Fu
{
//private String name;
Test(String name)
{
  //this.name = name;
  super(name);
}

}
this.name = name;

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


作者: 谭景宾    时间: 2012-5-7 00:41
super(name);就是调用父类的构造函数进行赋值
this.name = name;就是在当前类进行赋值
用super提高代码的复用性,不必再多写重复代码
作者: 何阳    时间: 2012-5-7 00:59
//子类在初始化时,一定访问了父类的构造函数
//因为子类继承了父类,获取到了父类中内容(属性),所以在父类
//内容之前,要先看父类是如何对自己的内容进行初始化的,
//你这样必须有一个前提,就是父类中带参数的构造函数,不然一样报错。
//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());
        }
}
你这个代码错误太多,你构造函数的名字和类名不一样你发现没有,
建议你重新学习面向对象的封装和继承,基础你一点没懂

作者: 魏涞    时间: 2012-5-7 01:16
class Zi extends Fu
{
//private String name;
Test(String name)//这里的Test是不是楼主写错了,应该是Zi才对吧,
{
   //this.name = name;
   super(name);
}

}
当定义一个类时,若没有自定义构造方法,系统会默认的给出一个类的无参空构造,当类中有自定义的构造方法,系统不会再给出无参空构造;
子类继承父类,在子类的构造方法中的第一行,系统会默认的给加上一个父类的无参构造方法super(),当父类有自定义构造方法时,在子类构造方法的第一行必须显示写出父类的自定义构造方法。

作者: 钟成军    时间: 2012-5-7 01:20
天道酬勤 发表于 2012-5-7 00:59
//子类在初始化时,一定访问了父类的构造函数
//因为子类继承了父类,获取到了父类中内容(属性),所以在 ...

恩,面向对象这一块是比较模糊的,还得多加强学习,谢谢指导
作者: 龚正军    时间: 2012-5-7 01:40
本帖最后由 龚正军 于 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:09
本帖最后由 隋营营 于 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)语句的作用:调用父类带参数的构造函数






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