class A{
   int i=9;
   void get(){
     System.out.println(i);
   }
  
 }
class B extends A{
   void show(){
    i=90;
   System.out.println(i);
   super.get();
   }
  
   public static void main(String s[]){
    B a=new B();
     a.show();
     
    }
}
结果是:90
        90//应该是9啊!!!???
是不是子类与父类共享变量i????

解决方案 »

  1.   

    super.get();
    是调用父类中的成员变量的值。
      

  2.   

    是啊,地球人都这么认为阿
    子类继承了父类的i,并i=90;应该修改子类的i,
    那么在super.get();显示的应该是父类的i,即9,但结果是90
    这就有一个问题了,在子类中修改i,怎么会影响父类的i,难道到是共享吗???
      

  3.   

    由于B是A的子类,变量i不是private的,所以在子类中是被继承了,同时也是可以在子类中直接访问的;
    在子类的 void show(){
        i=90;//你并没有定义新的变量,而是直接使用了父类A的成员变量i,原来i的值为9,但现在已经赋值为90了,所以输出都应该为90;
       System.out.println(i);
       super.get();
       }
      

  4.   

    如果你把i=90;--->改为int i=90; 那么输出就是你期望的90 ,9
      

  5.   

    在导出类和基类中本来就是使用的是同一个i(你只申明了一个i,并且在基类中申明并非是私有的,所以导出类刚好继承了这样的一个i,后来在导出类中进行了修改,刚好就是修改了你在基类中申明的i)如果你在导出类中这样写那么就会得到你想要的结果:
    class A{
       int i=9;
       void get(){
         System.out.println(i);
       }
      
     }
    class B extends A{
       void show(){
         int  i=90;//重新在申明一个变量i
       System.out.println(i);
       super.get();
       }
      
       public static void main(String s[]){
        B a=new B();
         a.show();
         
        }
    }
    或者:
    class A{
       int i=9;
       void get(){
         System.out.println(i);
       }
      
     }
    class B extends A{
     (private )int i
       void show(){
        i=90;
       System.out.println(i);
       super.get();
       }
      
       public static void main(String s[]){
        B a=new B();
         a.show();
         
        }
    }
      

  6.   

    这是运行时签别的问题,楼主看tij,里面介绍的很详细.
      

  7.   

    2楼的小心误人子弟~i是类A中的成员变量,而且是默认访问级别friendly的,B extends A的同时就继承了这个i,所以这个时候A和B都拥有同一个成员变量i。而且即使你不super.get(),直接get()。也是可以输出的,因为B也继承了A中的方法get()。
      

  8.   

    楼主在继承类中没有定义变量i,而在父类中i是默认访问权限,所以你在继承类中对i进行付值后,就得到你看到的结果。