class A{
int z=4;
}
class B extends A{
int z=6;
void map(A x){
      System.out.println("z="+x.z);
}
}
public class text{
public static void main(String args[]){
B b=new B();
//move a=new move();
b.map(b);
}
}为什么不是z=6,这不是声明父类对象而调用子类的成员吗?请教高手!

解决方案 »

  1.   

    是声明父类对象而调用子类的成员函数,但是 b.map(b),所以输出的是b.z
      

  2.   

    "为什么不是z=6,这不是声明父类对象而调用子类的成员吗?请教高手!"
    你这句话有几个错误,
    其一:不是声明父类对象,是用一个父类类型的引用指向一个子类的对象。
    其二:父类引用指向子类对象的时候,它只能访问子类中重写父类的那些函数,而不能调用其他非父类的成员,包括与父类同名的成员变量。
    下面给出两个例子。
    一:如果子类中的成员与父类中的成员变量同名,只是将父类中的成员变量隐藏了,但是子类的引用也是可以访问的,通过superclass A2{
        int i;
        public A2(){
            i=4;
        }
    }
    class B2 extends A2{
        int i;
        public B2(){
            i=6;
        }
        public void print(){
            System.out.println("B2.i:"+i+"\nA2.i:"+super.i);
        }
    }
    public class Polymorphism2 {
        public static void main(String args[]){
            B2 b=new B2();
            b.print();
        }
    }二:父类引用调用子类方法示例class A{
        public void print(){
            System.out.println("This is A's function");
        }
    }
    class B extends A{
        public void print(){
            System.out.println("This is B's function");
        }
    }
    public class Polymorphism {
        public static void main(String args[]){
            A p;
            p=new A();  //A类引用指向A类对象
            p.print();
            p=new B();  //A类引用指向B类对象
            p.print();
        }
    }
      

  3.   

    class A{
        int z=4;
        void mapA(A x){
            System.out.println("Hello");
          }
    }
    class B extends A{
        int z=6;
        @Override
        void mapA(A x){
          System.out.println("z="+x.z);
        }
        
        void mapB(B x){
         System.out.println("z="+x.z);
        }
        
    }
    public class Test{
        public static void main(String args[]){
         A a = new A();
            a.mapA(a);
        
            B b=new B();
            b.mapA(b);
            ((A)b).mapA(b);
            b.mapB(b);       
        }
    }
    变量不会被重写,map中传入的是A类型,则会调用A中的z,传入B类型才会调用B中的z
      

  4.   

    谢谢各位,懂了,
    System.out.println("z="+x.z);
    这里只能调用父类A的成员。所以是z=4。
      

  5.   

    答案是等于4,原因很简单,map(A x)方法中的参数是A类型的,虽然你是传入了一个B的对象b进去,但是b发生了向上转型,所以map(A x)方法中的x.z还是A类中的z值。
    关键在于属性是不存在覆写这个概念的,覆写只能修饰于方法,所以,子类中重新定义一个z变量和父类中的z变量没有关系》》》这是重点```