class ClassOne{
     private char var = 'a'; 
     char getVar(){return var;}
}public class Beetle extends ClassOne {
   private char var = 'b';
   
   public static void main(String[] args)  {
     
     char a = new ClassOne().getVar(); 
     System.out.println(a);
     char b = new Beetle().getVar(); 
     System.out.println(b);
   } 
}
输出为什么是a a 而不是a b啊??

解决方案 »

  1.   

    如果需要 你应该使用 多态的概念实现
    或者使用interface
      

  2.   

    我觉得应该是你没有重写getVar方法导致的,虽然继承了ClassOne类,但你调用getVar方法时,它返回的var仍是ClassOne里的var.你在你的Beetle类中再加上和ClassOne类一样的
    char getVar(){return var;}就好了。
      

  3.   

    我的理解是class Beetle继承了ClassOne的char getVar(){return var;},但是没有继承private char var = 'a';所以现在在class Beetle中应该是由 private char var = 'b';和char getVar(){return var;}组成
    所以我觉得应该是a b,但是我知道我是错的,但是不知道我上面的解释哪里错了。。
    谢谢
      

  4.   

    class Beetle其实继承了private char var = 'a';只不过由于Beetle类中有private char var = 'b';它被隐藏了.
      

  5.   

    private 成员可以被子类继承??
    看来我记错了啊...我原来记得private 成员是不能被子类继承的..呵呵..翻下书看看啊..
      

  6.   

    问题的关键在:
         char a = new ClassOne().getVar(); 
         System.out.println(a);
         char b = new Beetle().getVar(); 
         System.out.println(b);
    因为getVar(); 是父类中的方法。调用该方法后得到此方法中的值
      

  7.   

    因为getVar(); 是父类中的方法。调用该方法后得到此方法中的值
    =================================
    但是父类class ClassOne{
         private char var = 'a'; 
         char getVar(){return var;}
    }
    子类继承后我觉得应该是public class Beetle extends ClassOne{
       private char var = 'b';
     char getVar(){return var;}
    }那么此时子类的getVar()不应该返回'b'么?
      

  8.   

    class Beetle之中沒有方法,因此他只有沿用父類之中的方法了,。
    如果你想得到a b的結果,就需要在子類覆蓋父類中的方法
      

  9.   

    tanlingyun(未能避开) ( ) 信誉:100    Blog   加为好友  2007-05-13 17:31:41  得分: 0  
     
     
       class Beetle其实继承了private char var = 'a';只不过由于Beetle类中有private char var = 'b';它被隐藏了.
      
     
    ===================================
    你的这句话好象是错误的..
      

  10.   

    tanlingyun(未能避开) ( ) 信誉:100    Blog   加为好友  2007-05-13 17:31:41  得分: 0  
     
     
       class Beetle其实继承了private char var = 'a';只不过由于Beetle类中有private char var = 'b';它被隐藏了.
      
    ===================================
    错了....私有的变量和方法是不能被继承的.而不是你说的隐藏了.显然楼主没搞明白多态和动态绑定的概念和过程.
    再对象调用方法时,他会首先查询符合传递参数的方法,列出一个方法表,然后再动态的绑定所指定的方法.也就是说他根据你所实例化的对象能自动的识别子类和父类的方法..
    但是这里 LZ没有指定子类重写方法.虽然他继承到了方法.但是方法中所返回的变量是父类的,子类是不能调用父类的私有变量的,所以他自动的绑定到了父类的getVar方法上.这就是为什么只打印 a a了.
    不知道这么解释对否....头脑里有这么概念,却不知道该怎么说..只能这么说了
      

  11.   

    错了....私有的变量和方法是不能被继承的.而不是你说的隐藏了.
    。这种想法我觉得有问题私有的变量和方法都是会被继承的子类继承至父类的私有属性和方法,对于子类中的新增的属性和方法不可见,但是对继承来的父类的变量和方法还是可见的,就说char b = new Beetle().getVar(); System.out.println(b);实际上是调用继承至父类的getVar()来显示private char var = 'a'
      

  12.   

    恩,仔细想想.好象也可以这么说......是继承了...只是不可见而已.
    又更层次的理解了继承的含义...谢谢cloud_ll()
      

  13.   

    cloud_ll() ( ) 信誉:100    Blog   加为好友  2007-5-13 21:16:01  得分: 0  
     
     
       
    错了....私有的变量和方法是不能被继承的.而不是你说的隐藏了.
    。这种想法我觉得有问题私有的变量和方法都是会被继承的子类继承至父类的私有属性和方法,对于子类中的新增的属性和方法不可见,但是对继承来的父类的变量和方法还是可见的,就说char b = new Beetle().getVar(); System.out.println(b);实际上是调用继承至父类的getVar()来显示private char var = 'a'
      
     私有的变量方法会继承吗?
      

  14.   


    输出为什么是a a 而不是a b啊??==========================其实这个例子很简单的.....继承中有一条...父类的私有方法不能被子类覆盖在JAVA虚拟机中,子类覆盖父类方法的前提是,子类必须能继承父类的特定方法.这里...父类的char方法是私有的..无法被继承..就谈不上覆盖了运行的时候getvar 是在父类中被定义..所以是执行父类的 char方法如果想得到 a   b 的结果..你可以试着把父类的private 改成 pulic..这样方法被覆盖,才能执行子类实例中的char方法
      

  15.   

    子类继承父类,有属性遮盖原则,在子类中不指明,使用的var仍然是父类中的属性此例中要打印出a b可以在父类中覆盖方法
       public char getVar(){
       return this.var;
       }
    返回本类中的var属性,才会出现a b
      

  16.   

    class Beetle其实继承了private char var = 'a';只不过由于Beetle类中有private char var = 'b';它被隐藏了.
      

  17.   

    Beetle 都没有再写getVar(); 
    如果类Beetle 写一个 char getVar(){return var;}输出就是a b
      

  18.   

    其实这个程序属性覆盖不是主要目的..它表达的应该是私有方法不能这被子类覆盖..大家有兴趣可以去看看孙卫琴的<JAVA面向对象编程>168页...孙老师讲得很清楚...父类的私有方法不能被子类覆盖
      

  19.   

    这个问题主要是private的问题,你要清楚,private即为私有
    public class Father{
    private String secret = "Father secret.";
    void tellSecret(){
    System.out.println("this :"+this);
    System.out.println(secret);
    }
    }
    public class Son extends Father{
    private String secret = "Son secret.";
    public static void main(String[] args){
    new Father().tellSecret();
    new Son().tellSecret();
    }
    }
    打印出来的结果说明,私有的是不与任何人共享的。
      

  20.   

    父类是不知道子类会有什么样的成员变量的,也不知道他们会是什么访问控制方式,public protected private or package priviliage ,所以,父类的方法能够访问的数据就是父类的数据,应该是这样了。