读书人

提问者和回贴者之间的对白,可是有关问

发布时间: 2012-01-05 22:36:54 作者: rapoo

提问者和回贴者之间的对白,可是问题最后还是没有解决,请高手进来解决一下.
public class aa
{
int num=99;
void jj(aa f)
{
System.out.println(f.num);
System.out.println(f.getClass().getName());
System.out.println(f.sex);//注释
}

}
class bb extends aa
{String sex= "男 ";
bb()
{
num=88;
}
public static void main(String args[])
{
bb b=new bb();
aa a=new aa();
a.jj(b);
}
}

如果不把带有//注释的那一行注释掉的话,会提示找不到变量sex
但是我传递的是bb类的实例啊?而且bb类实例中有sex这个变量啊?
这时程序到底是怎么执行的啊?我真的晕了


wuyunyun() ( ) 信誉:100 Blog 加为好友 2007-4-15 23:03:51 得分: 0

但是如果把System.out.println(f.sex);注释掉,我们输出的:System.out.println(f.num);为88
也就是说f为bb类的实例,同理可以推出f.sex也应当是bb类的,所以不应当报错的啊?
急急急!!!!!!!!111
还请高手指教.


zyzsunny() ( ) 信誉:100 Blog 加为好友 2007-4-15 23:24:14 得分: 0

我刚刚就看了你的一个问题,呵呵,记得好象有点相似.
  void jj(aa f)需要一个aa的REFERENCE作为参数,但是它也可以接受任何由AA派生来得的REFERENCE.当把BB的引用传递给函数接口时向上转型就发生了.这是完全可以的---因为BB继承了AA,但BB的REFERENCE向上转型时它自身的接口会变小,String sex= "男 ";当然也就无法访问了


dash_running() ( ) 信誉:100 Blog 加为好友 2007-04-16 00:47:25 得分: 0

这是个向上类型转换的问题,我正好想过并实验过这个问题.
当把子类的句炳赋给父类后比如f=ch后, 代码上f指向的是Child,但是实际是进行了类型转换,把ch的非Father部分截断,只剩下Father类型里的东西,所以
System.out.println(f.sex);//注释
就会出错.


向上类型转换(upcasting)
从面向对象的概念上来说就是 一个子类对象同时也是一个父类对象,举例说男人也是人(当然,女人也是人),
从java语法的角度来说可以描述为子类的句柄可以赋给父类的句柄:
Child ch=new Child;
Father f=ch;
但是反过不能把父类的句柄赋给子类的句柄


wuyunyun() ( ) 信誉:100 Blog 加为好友 2007-04-16 07:56:42 得分: 0
上楼您好:如果把: "void jj(aa f) "改成: "void jj(bb f) "
从推理上讲应该会找到f.sex了吧?
但是我试了还是不能,请问又该如果解释呢?












[解决办法]
楼主:我试着把你的程序换个思路改了一下,本来以为会输出男的.可是结果却输出了女.什不知道是为什么.还请高手指教>
public class aa
{
int num=99;
String sex= "女 ";
void jj(aa f)
{
System.out.println(f.sex);
System.out.println(f.getClass().getName());
//System.out.println(f.sex);//注释
}

}
class bb extends aa
{String sex= "男 ";
bb()
{
num=88;
}
public static void main(String args[])
{
bb b=new bb();
aa a=new aa();
a.jj(b);
}
}
[解决办法]
String sex= "女 ";
改成
protected String sex= "女 ";

再想想是怎么回事
------解决方案--------------------


楼上已经说的很清楚了,这是域的问题,你要想输出男就要在构造函数里添加
public class aa
{
int num=99;
String sex= "女 ";
void jj(aa f)
{
System.out.println(f.sex);
System.out.println(f.getClass().getName());
System.out.println(f.sex);}

}
class bb extends aa
{
bb()
{
num=88;
sex= "男 ";
}
public static void main(String args[])
{
bb b=new bb();
aa a=new aa();
a.jj(b);
}
}

[解决办法]
void jj(aa f)
{
System.out.println(f.sex);
System.out.println(f.getClass().getName());
System.out.println(f.sex);}

}
-------------------------------------
看这个方法,形参是父类,传入的却是子类
相当于是父类对子类的引用。

bb b=new bb();
aa a=new aa();
a.jj(b);
-------------------------------------
这里的b作为参数传入后可以这样理解:
aa b = new bb();

String sex= "男 ";
------------------------------------
你在子类定义这个对父类是没有影响的,就像你自已说的那样


[解决办法]
正如前面的说的 之类引用传给超类引用,接口会变小,也就是原来子类中有的东西经过aa.f(bb)后sex会丢失。
[解决办法]
期待高手给出解答!把代码做如下更改,--------------------Configuration: <Default> --------------------
99
bb


class aa
{
int num=99;
String sex= "女 ";
void jj(aa f)
{
System.out.println(f.num);
System.out.println(f.getClass().getName());
System.out.println(f.sex);//注释
}

}
class bb extends aa
{
String sex= "男 ";
int num=77;
bb()
{
num=88;
sex= "男 ";

}
public static void main(String args[])
{
bb b=new bb();
aa a=new aa();
a.jj(b);
}
}

[解决办法]
“提问者和回贴者之间的对白,可是问题最后还是没有解决,请高手进来解决一下. ”都怪你没好好理解,不是回贴人的问题!

读书人网 >J2SE开发

热点推荐