class AClass 
{
public AClass()
{
System.out.println("AClass");
}
}public class BClass extends AClass
{
public BClass()
{
System.out.println("BClass");
} public static void main(String[] args){
AClass a=new AClass();
AClass b=new BClass();
}
}
运行结果:AClass AClass BClass
在创建对象b时 ,声明为AClass,但确创建BClass对象,怎么去理解这个问题。

解决方案 »

  1.   

    子类实例化的时候总是先调用父类的同名构造方法,再执行自己的构造方法,所以
    AClass b=new BClass(); 会输出 AClass BClass
      

  2.   

    AClass b=new BClass();
    父类引用指向子类对象
    有父亲才会有孩子,子类实例化之前必须先实例化父类
      

  3.   

    理解这个问题,需要分清引用和对象的区别
    a,b都是引用,保存在JVM的栈内存中,new AClass()和new BCLass()是对象,保存在堆内存中
    AClass a=new AClass();
    这句话创建的是一个AClass的引用,并且指向一个AClass的对象
    AClass b=new BClass(); 
    而这句话创建的是一个AClass的引用,并指向一个BClass的对象楼主所说的“在创建对象b时 ,声明为AClass,但确创建BClass对象,怎么去理解这个问题。
    正确的理解是:
    在创建BClass对象时,声明了一个AClass的引用b去指向该对象
    b只是一个引用,真正的对象是BClass,所以构造该对象时,调用BClass的构造器
    调用BClass构造器时,首先会隐式的调用父类构造器,也就是AClass的构造器,然后再执行子类BClass构造器中的语句
    所以最终的打印结果是:
    AClass BClass
      

  4.   

    2个对象,一个AClass的和一个BClass的
      

  5.   

    这就是JAVA的一个特性,叫多态性,可以去找相关的书籍看看