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了吧?
但是我试了还是不能,请问又该如果解释呢?
  
 
  
 
  
 

解决方案 »

  1.   

    楼主:我试着把你的程序换个思路改了一下,本来以为会输出男的.可是结果却输出了女.什不知道是为什么.还请高手指教>
    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);
    }
    }
      

  2.   

    String sex="女";
    改成
    protected String sex="女";再想想是怎么回事
      

  3.   

    .....这是域 又不是方法 当然不会动态绑定
    既然不会动态绑定  那当然不会输出子类的值  
    除非你在子类的构造函数中对超类的域赋值相当于 子类有个sex域 超类也有个sex域
      

  4.   

    如果不把带有//注释的那一行注释掉的话,会提示找不到变量sex
    但是我传递的是bb类的实例啊?而且bb类实例中有sex这个变量啊?
    这时程序到底是怎么执行的啊?我真的晕了
    =========================================
    你把超类的共有特性给注释了  那num就成为子类的自有特性  当然会提示找不到
      

  5.   

    楼上的朋友,String sex="女";
    改成
    protected String sex="女";
    之后还是输出女啊?
    String sex="女";默认的是public而你加上 protected什么意思啊.
    这两种类型都可以被子类所继承啊?
    照上面的程序逻辑会输出男啊?
    如果在void jj(aa f)中再添加一句.
    System.out.println(f.num) 则会输出f.num=88
    这就更使我应该输出男才对啊?
    可能我的理解是错了,还请各位指点一二.
      

  6.   

    insiku(tmd 结帖啊!!!) ( ) 信誉:100    Blog   加为好友  2007-04-16 08:55:43  得分: 0  
     
     
       如果不把带有//注释的那一行注释掉的话,会提示找不到变量sex
    但是我传递的是bb类的实例啊?而且bb类实例中有sex这个变量啊?
    这时程序到底是怎么执行的啊?我真的晕了
    =========================================
    你把超类的共有特性给注释了  那num就成为子类的自有特性  当然会提示找不到  
     
    __________________________________________________________
    对,那num就成为子类的自有特性 但是System.out.println(f.getClass().getName());输出的是
    f是子类bb的实例,怎么会提示找不到呢?
    不好意思,还请你再指点一下.
      

  7.   

    但是 你那个f是aa的实力这又成了 白马跟马的关系了
    白是马的只有特性
    难道你可以说马的颜色就是白?
      

  8.   

    楼上的朋友,String sex="女";
    改成
    protected String sex="女";
    之后还是输出女啊?
    String sex="女";默认的是public而你加上 protected什么意思啊.
    这两种类型都可以被子类所继承啊?
    照上面的程序逻辑会输出男啊?
    如果在void jj(aa f)中再添加一句.
    System.out.println(f.num) 则会输出f.num=88
    这就更使我应该输出男才对啊?
    可能我的理解是错了,还请各位指点一二.===============================可以继承  但是不会动态绑定public class aa
    {
        int    num = 99;
        String sex = "女";    protected String getSex()
        {
            return sex;
        }
        
        void jj(aa f)
        {
            System.out.println(f.getSex());
            System.out.println(f.getClass().getName());
            // System.out.println(f.sex);//注释
        }
        public static void main(String args[])
        {
            bb b = new bb();
            aa a = new aa();
            a.jj(b);
        }}class bb extends aa
    {
        String sex = "男";    protected String getSex()
        {
    这里区分返回超类的域 还是子类的域
    //        return super.sex;
            return sex;
        }
        
        bb()
        {
            num = 88;
        }}
      

  9.   

    如果在void jj(aa f)中再添加一句.
    System.out.println(f.num) 则会输出f.num=88
    =====================================超类中的num 被子类继承 子类在构造函数中对其赋值  这个是正确的但是~~ 
    你子类中重新定义了一个num的话
    子类中的num跟超类中的num是没有关系的
    你要得到哪个值 就看你怎么调用了
      

  10.   

    楼上已经说的很清楚了,这是域的问题,你要想输出男就要在构造函数里添加
    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);
    }
    }
      

  11.   

    不明白,如果void jj(aa f)接收到的f是aa类的实例的话:因为set,num都不是static型的,你在子类改变,在父类中是没有什么影响的啊?下面的程序可以证明这个
    public class aa
    {
    int num=44;
    void qq()
    {
    System.out.println(num);
    }
    }
    class bb extends aa
    {
    bb()
    {
    num=55;
    }
    public static void main(String args[])
    {
    bb b=new bb();
    aa a=new aa();
    a.qq();
    }
    }
     会输出44而不是55也就是因为num不是static 即使你子类中怎么修改父类中的num是不会改变的.
      

  12.   

    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="男";
    ------------------------------------
    你在子类定义这个对父类是没有影响的,就像你自已说的那样
      

  13.   

    正如前面的说的 之类引用传给超类引用,接口会变小,也就是原来子类中有的东西经过aa.f(bb)后sex会丢失。
      

  14.   

    期待高手给出解答!把代码做如下更改,--------------------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);
        }
    }
      

  15.   

    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);
        }
    }
    --------------------Configuration: <Default>--------------------
    88
    bb
      

  16.   

    对不起,我是自学JAVA的没有人指点,所以理解得很吃力.