我写如下代码~~
class A{
public void f(){
System.out.println("A");
}
};
class B extends A{
public void f(){   
    System.out.println("B");
}
};
class Test11{
public static void main(String[] args) 
{
A a = new B();
                  //我的问题在这里~
a.f();
}
}输出是:B...我想知道如果把A a = new B();改成B a = new B();会有什么不同?~~输出同样是B....那这其中具体的内存是怎样划分的~引用是怎样引用的呢?~~新手问题~帮帮忙谢谢!~

解决方案 »

  1.   

    http://community.csdn.net/Expert/topic/4718/4718592.xml?temp=.2510034
      

  2.   

    引用变量分配在栈内存中,实例对象分配在堆内存中
    对于 A a = new B(); 这句语句可以拆分为2句:
    A a;           //声明一个引用变量a,用于指向类A或类A子类的实例对象,
                   //对该实例成员方法或成员变量的操作依靠引用变量a来完成.
    a = new B();   //实例化类B的对象,并将该对象的在堆内存的首地址赋值给引用变量a楼主所说的A a = new B();和B a = new B();的不同在于用于对类B操作的引用变量a的权限范围不同,前一句a可以指向类B和类A的实例对象(前提为类B是类A的子类),后一句a只能指向类B及类B的子类的实例对象,但是2句话都可以完整的实现对类B实例对象的所有操作以上是我所理解的,仅供楼主参考