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这个变量啊?
这时程序到底是怎么执行的啊?我真的晕了.

解决方案 »

  1.   

    因为sex是子类bb的属性,父类aa没有sex这个属性。所以会报错
    子类能继承父类的属性和方法(private除外)
      

  2.   

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

  3.   

    子类bb继承了父类的num属性,在bb的构造方法里对num重新赋值了为88。
      

  4.   

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

  5.   

    这是个向上类型转换的问题,我正好想过并实验过这个问题.当把子类的句炳赋给父类后比如f=ch后, 代码上f指向的是Child,但是实际是进行了类型转换,把ch的非Father部分截断,只剩下Father类型里的东西,所以
       System.out.println(f.sex);//注释
    就会出错.
    向上类型转换(upcasting) 
         从面向对象的概念上来说就是 一个子类对象同时也是一个父类对象,举例说男人也是人(当然,女人也是人),
         从java语法的角度来说可以描述为子类的句柄可以赋给父类的句柄:
             Child ch=new Child;
             Father f=ch;
         但是反过不能把父类的句柄赋给子类的句柄
      

  6.   

    上楼您好:如果把:"void jj(aa f)"改成:"void jj(bb f)"
    从推理上讲应该会找到f.sex了吧?
    但是我试了还是不能,请问又该如果解释呢?
      

  7.   

    因为对编译器来说,它只分析程序语法,它只知道变量f的引用类型是类AA,而类AA又没有sex这个属性,所以,编译无法通过。你可以这样写:
    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);//注释
    */
    if(f instanceof BB){
    BB b=(BB)f;
    System.out.println(b.num);
    System.out.println(b.getClass().getName());
    System.out.println(b.sex);
    }
    }}
    public 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);
    }
    }
      

  8.   

    你的f函数就相当于是:
    void jj(bb f)
    {
    aa f1=(aa)f;//f经过强制转换 变为超类引用,丢失 sex
    System.out.println(f1.num);
    System.out.println(f1.getClass().getName());
    System.out.println(f1.sex);//注释
    }
      

  9.   

    你要调用BB 就应该重写aa里边的方法了。否则  输出是aa类的输出,里边没有的属性肯定出不来的