java 类继承的问题

wodi1015 2008-03-06 05:29:23
public class ploytest {

public static void main(String[] args) {
A a = new A();
B b = new B();
a.s = "[AA]";
b.s = "[BB]";
a = b;
System.out.println(a.s);
System.out.println(b.s);
System.out.println(a.getS());
System.out.println(b.getS());
System.out.println("====================");
((A)b).s = "[AA]";
System.out.println(a.s);
System.out.println(b.s);
System.out.println(a.getS());
System.out.println(b.getS());
}
}

class A {
String s = "[A]";
String getS() {
return s;
}
}

class B extends A{
String s = "";
String getS() {
return s;
}
}

输出结果 我就是看不明白阿 怎么回事呢
...全文
209 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
sky_ccy 2008-03-16
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 flynetcn 的回复:]
引用 12 楼 sky_ccy 的回复:
回去好好 看看对象是怎么生成的,你就不难理解的
具体的是
A a = new A();
a = b;

看看他们内存和堆栈中是怎么分配的,
这才是这个问题的根源,,弄明白了就解决了

兄弟,怎末看?
[/Quote]
找书,和视频教程,,都可以的
wl3072102 2008-03-08
  • 打赏
  • 举报
回复
这涉及到java的动态绑定机制:
1.静态方法与所声明的类型的方法绑定;
2.实例方法与所引用的对象的方法绑定;
3.成员变量与所声明的类型的成员属性进行绑定;(这道题属于第3种情况)
songweipeng 2008-03-07
  • 打赏
  • 举报
回复
局部变量和全局变量问题
sky_ccy 2008-03-07
  • 打赏
  • 举报
回复
回去好好 看看对象是怎么生成的,你就不难理解的
具体的是
A a = new A();
a = b;

看看他们内存和堆栈中是怎么分配的,
这才是这个问题的根源,,弄明白了就解决了
码出钞能力 2008-03-07
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 sky_ccy 的回复:]
回去好好 看看对象是怎么生成的,你就不难理解的
具体的是
A a = new A();
a = b;

看看他们内存和堆栈中是怎么分配的,
这才是这个问题的根源,,弄明白了就解决了
[/Quote]
兄弟,怎末看?
neczxg 2008-03-07
  • 打赏
  • 举报
回复
8楼说的 A a = new B();
是生成了A 的对象还是生成了B 的对象?
具体什么意思啊
BeenZ 2008-03-06
  • 打赏
  • 举报
回复
楼上正解
wodi1015 2008-03-06
  • 打赏
  • 举报
回复
a好像不通过方法就是不能调用b里面的属性了,但是b可以不通过方法能够调用a里面的属性了
((A)b).s=[A];
wodi1015 2008-03-06
  • 打赏
  • 举报
回复
我单步执行了一下 发现 变量a和b是一样的 而且他们都有两个变量s。一个是A类的 一个是B类的 a.s和b.s不一样 可能就是他们的类型不同 当a.s时jvm发现是A类型的变量 它就去找A的s,B也是一样。getS方法正是面向对象式的多态性的体现,派生类是什么方法就去执行什么方法。和自己的类型没有关系
wl3072102 2008-03-06
  • 打赏
  • 举报
回复
楼主可以这么来理解,实际上a = b;
其实就是A a=new B();在这个语句执行时,其实是生成了一个A类的对象.(先生成父类对象,在生成子类对象)
这个a 指向了在生成b之前生成的A对象,A的s初始化是[A],所以a.s=[A];多态是针对方法说的,不是针对成员变量.
zjhlht 2008-03-06
  • 打赏
  • 举报
回复
还是没搞懂~~~~~

再仔细研究研究~~~~
joynet007 2008-03-06
  • 打赏
  • 举报
回复
应该是这个样的!
你可以在 这儿加

b.s = "[BB]";

System.out.println(a.s); //这个显示的结果是[AA]

a = b;

System.out.println(a.s);
//说明,a=b,因为b 是继承a 的所以
a = b;
System.out.println(a.s); //这个结果就因该是A 类中的结果了[A]
System.out.println(b.s); //显然这个结果是 [BB]
System.out.println(a.getS()); //这个b 的指向已经转给了a 所以
System.out.println(b.getS()); //这个应该是 同上了 [BB]

((A)b).s = "[AA]";
System.out.println(a.s); //已经被转型了,所以都是[AA]
System.out.println(b.s);
System.out.println(a.getS()); //这个地址和上面的a.getS() 地址都没有改变,所以都是[BB]
System.out.println(b.getS()); //这个地址和上面的b.getS() 地址都没有改变,所以都是[BB]
healer_kx 2008-03-06
  • 打赏
  • 举报
回复
http://blog.csdn.net/Slugfest/archive/2008/01/10/2034305.aspx
看这章。
healer_kx 2008-03-06
  • 打赏
  • 举报
回复
a = b的语义是a变量指向了b变量指向的对象了。现在,a和b指向了同一个对象。
wodi1015 2008-03-06
  • 打赏
  • 举报
回复
这段程序的输出是这样的
[A]
[BB]
[BB]
[BB]
====================
[AA]
[BB]
[BB]
[BB]

为什么一开始是[A]呢 我觉得全是[BB] 如果按照healer_rx说的 a不通过方法就是不能调用b里面的属性了么
wodi1015 2008-03-06
  • 打赏
  • 举报
回复
我觉得a 就是一个引用 它可以指向一个对象 如果它指向了子类的对象 用a来调用属性或方法的时候到底是什么规则呢?
healer_kx 2008-03-06
  • 打赏
  • 举报
回复
多态是针对方法(属性,C#)来说的,不包含成员变量。

62,623

社区成员

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

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