程序如下:
class A {
String s="class: A";
}
class B extends A{
String s="class: B";
}
class TypeV{
public static void main(String args[]){
B b1,b2= new B();
A a1,a2;
a1=(A)b2;
a2=b2;
System.out.println(a1.s);
System.out.println(a2.s);
b1 = (B)a1;
    System.out.println(b1.s);
}
}请问:1。在A a1,a2; 
         a1=(A)b2;时,是否给a1开辟空间?还是只是a1指向了b2?
       2。上面b2对a1赋值时,是不是把所有的成员变量都赋给了a1?赋值后a1仍然是A类的对象吗?
      3。(A)b2时,(A)是不是只是一个标识什么也不做,还是将b2转成了A类类型,或是转成A类的对象。
      4。父类和子类中有相同名称成员变量时,是不是父类对象调用父类的,子类对象调用子类的,不存在覆盖一说??菜鸟问题,请高手耐心指教!!

解决方案 »

  1.   

    1.你可以做一个实验,如果你a1 = (A)b2 后,修改b2的数据,而a1也同时修改的话就说明a1指向了b2,否则是开辟了空间
    2.如上,如果是新开辟空间的话也只是复杂b2空间中存在的部分
    3.如上
      

  2.   

    A a1,a2
    a1=(A)b2
    这句的却在main的栈空间中分配了两个引用变量的空间一个给a1另一个给a2
    a1和b2指向堆中的同一个对象 (由new B()创建的)但是对类对象的成员变量的访问是取决于引用的实际类型,也就是说如果声明
    时a1为A的引用类型,则a1.s访问的是父类A的s,反之则是B的成员s这跟访问类对象的方法不同,对方法的访问取决于实际的对象类型而不管引用这个对象
    的类型是父类类型还是子类类型,这就是面向对象的 多态
      

  3.   

    多谢zanjun(战骏) ,也多谢KFeng_bird的指点!
      

  4.   

    class A {
    String s="class: A";
    void fun(){System.out.println("A has been fun");}

    }
    class B extends A{
    String s="class: B";
    void fun(){System.out.println("B has ben fun");}
    }
    class TypeV{
    public static void main(String args[]){
    B b1,b2= new B();
    A a1,a2;
    a1=new A();
    a2=b2;
    System.out.println(a1.s);
    System.out.println(a2.s);
    //b1 = (B)a1;
        //System.out.println(b1.s);
    a1.fun();
    b2.fun();
    a2.fun();
    }