请教一个简单的继承知识,子类通过super()修改父类属性。

oeardi 2011-06-24 02:30:47
下面两个程序,都是通过在子类的构造方法中调用 super() 传递字符串来改变父类的 String name;
我不太理解,为什么第二个程序把 system out 放在了main函数里,就会导致输出 f.name的值没有发生改变。


第一个程序:
class Father {
private String name;

Father(String name) {
this.name = name;
System.out.println(name);
}
}

class Son extends Father {
private String name;

Son(String fname, String sname) {
super(fname);
this.name = sname;
System.out.println(name);
}
}

public class AppTest {
public static void main(String[] args) {
Father f = new Father("奇异果");
Son s = new Son("大菠萝", "哈密瓜");
}
}

输出结果:
奇异果
大菠萝
哈密瓜


第二个程序:
class Father {
String name;

Father(String name) {
this.name = name;
//System.out.println(name);
}
}

class Son extends Father {
String name;

Son(String fname, String sname) {
super(fname);
this.name = sname;
//System.out.println(name);
}
}

public class AppTest {
public static void main(String[] args) {
Father f = new Father("奇异果");
System.out.println(f.name);
Son s = new Son("大菠萝", "哈密瓜");
System.out.println(f.name);
System.out.println(s.name);
}
}

输出结果:
奇异果
奇异果
哈密瓜
...全文
757 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
桃园闲人 2011-07-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 qybao 的回复:]

Son s = new Son("大菠萝", "哈密瓜");
System.out.println(f.name); //这里的f和s没有任何关系,是不同的对象
System.out.println(s.name);

Lz可以改成

Son s = new Son("大菠萝", "哈密瓜");
System.out.println(((Father)s).name);……
[/Quote]

very Good!
tu1129287460 2011-07-22
  • 打赏
  • 举报
回复
super()是用来调用父类的构造方法的。。。。。。
minyu_2004 2011-07-21
  • 打赏
  • 举报
回复
学习了
w157591352 2011-07-21
  • 打赏
  • 举报
回复
楼主看清调用啊。。。你f.name是调用父类的 而且你父类的name赋了初值又没改变所以当然不会变..
Hyso 2011-07-21
  • 打赏
  • 举报
回复
class Father {
String name;

Father(String name) {
this.name = name;
//System.out.println(name);
}
}

class Son extends Father {
String name;

Son(String fname, String sname) {
super(fname);
this.name = sname;
//System.out.println(name);
}
}

public class AppTest {
public static void main(String[] args) {
Father f = new Father("奇异果");
System.out.println(f.name);
Son s = new Son("大菠萝", "哈密瓜");
System.out.println(f.name);//打印出来的是你new的实例对象f的name
System.out.println(s.name);
}
}
jtbreeze 2011-07-20
  • 打赏
  • 举报
回复
如果你把父类的 name 定义为静态的,他就会打出你想要的结果了,呵呵~
chenchenyangll 2011-07-20
  • 打赏
  • 举报
回复
LZ没有搞明白类和对象是什么关系和区别
codolio 2011-07-19
  • 打赏
  • 举报
回复
楼主看一下Java中的多态吧。
树成 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 javaman_ka 的回复:]

super()是创建一个新的父类对象吧,怎么改变父类的对象呢。
[/Quote]

super()是调用父类构造函数,不是建立一个父类对象,最好把调用构造函数与建立一个新对象区分开来,虽然通常代码,无论是通过new还是通过反射,构造函数与新建对象都是一起进行的,但是调用构造函数和新建对象不是一回事,因为可以不通过构造函数来新建对象,而且一个对象也可能再次调用构造函数,当然,这需要绕过java编译期的机制。
hadisi_20 2011-07-19
  • 打赏
  • 举报
回复
你输出的是f.name 当然是 f那个object的name值啦.
9楼说的很对
JavaMan_KA 2011-07-19
  • 打赏
  • 举报
回复
super()是创建一个新的父类对象吧,怎么改变父类的对象呢。
fensese 2011-07-18
  • 打赏
  • 举报
回复
学习中。。。。。。
walkman_22 2011-07-18
  • 打赏
  • 举报
回复
都是通过在子类的构造方法中调用 super() 传递字符串来改变父类的 String name

super()只是继承父类的构造函数内容,哪里能改变呢。


Father f = new Father("奇异果");
System.out.println(f.name); // 输出父类的值,注意你的对象是父类的Father f = ~~
Son s = new Son("大菠萝", "哈密瓜");
System.out.println(f.name); // 输出父类的值
System.out.println(s.name); // 输出父类的值
恶魔小志 2011-06-26
  • 打赏
  • 举报
回复
来学习的!!!
hanRivergo 2011-06-26
  • 打赏
  • 举报
回复
路过学习
qybao 2011-06-26
  • 打赏
  • 举报
回复
Son s = new Son("大菠萝", "哈密瓜");
System.out.println(f.name); //这里的f和s没有任何关系,是不同的对象
System.out.println(s.name);

Lz可以改成

Son s = new Son("大菠萝", "哈密瓜");
System.out.println(((Father)s).name);
System.out.println(s.name);

jimiStephen 2011-06-25
  • 打赏
  • 举报
回复
学了 this super 的用法。好像是个继承问题
有点笨 2011-06-25
  • 打赏
  • 举报
回复
额,我感觉你调用super(String)并不是改变父类对象的name,只是创建一个新的父类对象
淫生杯具 2011-06-25
  • 打赏
  • 举报
回复
学习,
pipilozm 2011-06-25
  • 打赏
  • 举报
回复
同学习中。。。
加载更多回复(4)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧