黑马程序员技术交流社区
标题:
关于关键字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