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对象,怎么去理解这个问题。
{
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对象,怎么去理解这个问题。
AClass b=new BClass(); 会输出 AClass BClass
父类引用指向子类对象
有父亲才会有孩子,子类实例化之前必须先实例化父类
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