日期:2014-05-20  浏览次数:20658 次

//请关注一下吧,这个问题好多人都没有解决得了,急急急..........!
public   class   aa
{
protected   int   num=99;
protected   String   sex= "女 ";
void   jj(aa   f)
{
System.out.println(f.sex);
System.out.println(f.num);
System.out.println(f.getClass().getName());
}

}
class   bb   extends   aa
{ protected   int   num=521;//标签一
protected   String   sex= "男 ";
bb()
{
num=88;
}
public   static   void   main(String   args[])
{
bb   b=new   bb();
aa   a=new   aa();
a.jj(b);
}
}
/**********************************************************************************
上面的程序:如果说void   jj(aa   f)接收到的f是bb类的实例那么:f.sex=男   ,f.num=88   f是bb类实例
    如果说void   jj(aa   f)接收到的f是aa类的实例那么:f.sex=女   ,f.num=99   f是aa类实例
但是结果却输出:f.sex=女,f.num=88,f是bb类的实例.
唉,我不说那么多了.我只想问一个问题.
就是说:此时void   jj(aa   f)   接收到的f是谁的实例对象.还有就是f所继承的范围.
还有就是无论a.jj(b);还是a.jj(a);传递任意的一个.此时void   jj(aa   f)   接收到始终是一个
实例即aa类的实例这样说对吗?
***********************************************************************************/

------解决方案--------------------
我的理解,仅供参考~!
void jj(aa f) 传递的是 aa 的实例变量

bb b=new bb();
aa a=new aa();
a.jj(b);
bb是aa的子类
a.jj(b);这个时候 b就会向上转型为aa
System.out.println(f.sex);会调用 aa中的成员变量;

bb中的
protected int num=521;//标签一
protected String sex= "男 ";
并不会重写aa的成员变量

也就是说 多态是体现在方法上而不是变量上

总结以下几点:
1、对于实例变量和静态变量,多态机制反应的是“超类的属性”。
2、对于静态方法,多态机制反映的是“超类的属性”。
3、对于实例方法,多态机制反应的是“子类的属性”。

不知道说清没有..........



------解决方案--------------------
bb 的构造函数只给num附值,所以num是88,sex调用父类的值。
------解决方案--------------------
受不了了
XX年年有 今年特别多
------解决方案--------------------
我执行的结果怎么是:


99
test.BB

~~~~~~
------解决方案--------------------
我在JDK1.5测试结果,不注释掉是:

99
bb

注释掉是:

88
bb

我的理解是:没有注释的时候,bb类的num覆盖了bb的num,而aa的num被隐藏没有被改写。
注释后是bb继承了aa的num,这时bb类改写的是继承而来的num。
------解决方案--------------------
daniel_kaka()

顶你
------解决方案--------------------
insiku(tmd 结帖啊!!!) ( ) 信誉:100 Blog 加为好友 2007-4-16 10:13:18 得分: 0



受不了了
XX年年有 今年特别多


---------------------------
基本同意
------解决方案--------------------
void jj(aa f) 传递的是 aa 的实例变量
。。。。。。。。。。。。。

受不了了
XX年年有 今年特别多
---------------------------
基本同意

传的是引用不就得了
------解决方案--------------------

------解决方案--------------------
说实在的,LZ问得很好,但如果LZ是个“正常的Java语言使用者”
就不应该问这类问题,如果LZ是“Java语言编译器的恶魔”强烈建议
你去看看javac源码,一定能找到你想要的答案。