日期:2014-05-20  浏览次数:20789 次

关于构造方法的理解不是很清楚,请大家指点。
public   class   Test
{
public   static   void   main(String   args[])
{
Person   p1   =   new   Person( "A ");
Person   p2   =   new   Person( "B ",   "Shanghai ");
Student   s1   =   new   Student( "C ",   "S1 ");
Student   s2   =   new   Student( "D ",   "Shanghai ",   "S2 ");
System.out.println(p1.info());
System.out.println(p2.info());
System.out.println(s1.info());
System.out.println(s2.info());
}
}

class   Person
{
private   String   name;
private   String   location;

Person(String   name)
{
this.name   =   name;
location   =   "Beijing ";
}

Person(String   name,   String   location)
{
this.name   =   name;
this.location   =   location;
}

public   String   info()
{
return   "name:   "   +   name   +   "   location:   "   +   location;
}
}

class   Student   extends   Person
{
private   String   school;
Student(String   name,   String   school)
{
this(name,   "Beijing ",   school);
}
Student(String   n,   String   l,   String   school)
{
super(n,   l);
this.school   =   school;
}
public   String   info()
{
return   super.info()   +   "   school:   "   +   school;
}
}

程序很简单,但是有一点我不明白,就是在初始化子类的时候不是要先调用父类的构造方法吗?如果没有显式调用,那么系统自动调用默认的不带参数的构造方法。可是Student   s1   =   new   Student( "C ",   "S1 ");这句执行的时候它的构造方法中没有显式的调用父类的构造方法,且父类中也没有不带参数的构造方法,那么为什么不会出现错误?不解。

------解决方案--------------------
会不会先执行this(name, "Beijing ", school);这里,然后才会去想父类的构造呢?

------解决方案--------------------
编译器会调用与子类参数相同的基类构造器
Student(String n, String l, String school)
{
super(n, l);
this.school = school;
}
在这之中,由于基类没有这样的构造器,所以你必须显式的调用一个父类构造器,不信你把super去掉。
Student(String name, String school)
{
System.out.println( "AAA ");
this(name, "Beijing ", school);
}但在这之中,它执行的时候实际上是这样的
Student(String name, String school)
{
super(name,school);
System.out.println( "AAA ");
this(name, "Beijing ", school);
}
所以为什么你说会调用无参构造器,是因为你的构造器无参,如果你的构造器有参,那也会调用有参构造器

------解决方案--------------------
调试跟踪一下
------解决方案--------------------
留名