public class Test27{
public static void main(String[] args){
B b1,b2 = new B();
A a1,a2;
a1=(A)b2;
a2=b2;
System.out.println(a1.s);
a1.show();
System.out.println(a2.s);
a2.show();
b1=(B)a1;
System.out.println(b1.s);
b1.show();
System.out.println(b2.s);
b2.show();
}
}
class A{
String s ="class A";
void show(){
System.out.println(s);
}
}


class B extends A{
String s ="class B";
void show(){
System.out.println(s);
}
}谁能帮我解释解释这个程序的结果,为什么?

解决方案 »

  1.   


    public class Test27{
    public static void main(String[] args){
    B b1,b2 = new B();
    A a1,a2;
    a1=(A)b2;
    a2=b2;
    System.out.println(a1.s); //a1 是A对象,所以a1.s  --> class A
    a1.show(); //因为b2是B的实例,所以 a1.show() -->调用的是B的show(),B的s会把A的s覆盖掉,所以 class B
    System.out.println(a2.s);//a1 是A对象,所以a1.s  --> class A
    a2.show();//因为b2是B的实例,所以 a1.show() -->调用的是B的show(),B的s会把A的s覆盖掉,所以 class B
    b1=(B)a1;
    System.out.println(b1.s);//b1 是B对象,所以b1.s  --> class B
    b1.show();//因为b1=(B)a1 ,a1本来赋值是B的实例,所以 b1.show() -->调用的是B的show(),所以 class B
    System.out.println(b2.s); // class B
    b2.show(); // class B
    }
    }
    class A{
    String s ="class A";
    void show(){
    System.out.println(s);
    }
    }
    class B extends A{
    String s ="class B";
    void show(){
    System.out.println(s);
    }
    }我也不知道我的理解对不对啊,仅供参考...
      

  2.   

    应该是:
    class A
    class B
    class A
    class B
    class B
    class B
    class B
    class BB重写了方法show(),隐藏了变量s,当A被赋予B的引用时,调用自己的变量,也就是说隐藏不起作用,而调用方法时,只能得到子类的重写方法
      

  3.   

    变量和方法覆盖和隐藏的不同:一个类的实例无法通过使用全局名或者强制自己转换为父类型,以访问父类中被隐藏的方法,然而强制转换子类为父类型之后,可以访问父类中被隐藏的变量。a1=(A)b2;
    这里就是子类强制为父类。所以可以输出"ClassA"。
      

  4.   

    class A
    class B
    class A
    class B
    class B
    class B
    属性不能覆盖,方法可以覆盖