java中的继承真的是一门相当复杂的学问啊,很多东西都那么诡异,有一些技巧更是只可意会不能言传的,那就让时间和经验来解决这些问题吧。总结了一些,慢慢消化。。。
class tt
{
public static void main(String[] args){
Person p=new Graduate();
}
}
class Person
{
String name;
int age;
Person(){System.out.println("In Person()");}
Person(String name,int age){
this.name=name;
this.age=age;
System.out.println("In Person(String,int)");
}
}
class Student extends Person
{
String school;
Student(){
this(null,0,null);
//对this的调用必须是构造函数的第一个语句
System.out.println("In Student()");
}
Student(String name,int age,String school){
super(name,age);
this.school=school;
System.out.println("In student(String,int,string)");
}
}
class Graduate extends Student
{
Graduate(){
System.out.println("In Graduate()");
}
}
输出结果:
In Person(String,int)
In student(String,int,string)
In Student()
In Graduate()
相关解释:
1、
没有父,哪来子
Graduate(){ //自动调super(); 如果父类有无参构造函数,否则要显式调用super(x,y,...)
System.out.println("In Graduate()");
}
2、
恩``建议楼主应该去看下think in java初始化那章```讲的很明白!
当调用子函数的构造函数的时候 ,他会依次调用最上层父类的构造函数,再依次往下层调用构造函数!
所以对你的例子来说 很明确:
首先编译器看到了graduate(),然后去找class Graduate 父类是class Student,这里编译器就会自动去调用Student(),但是Student()里面先要this(null,0,null); 所以去调用Student(String name,int age,String school),他里面又要去super (name,age);
所以最先完成最上层的构造函数的调用,完成person类的初始化动作,所以:In Person(String,int)
然后 完成 Student(String name,int age,String school)的 :In student(String,int,string)
再完成In Student()
最后就是In Graduate()
明白没啦???不懂就去看看think in java吧````
分可以全给我了吧
3、
如果在Student中没有定义一个无参数构造函数Student(),那么在他的子类Graduate中,就必须调用明确的父类的构造函数,super(参数)。
在你的例子中,由于已经在Student中定义了无参数构造函数,系统默认的调用了这个函数。所以最终的结果是这样了。
4、
Person p=new Graduate();属于动态绑定~
况且你可能对对象的产生过程不太了解·
如果你的类和别的类有继承关系,而你要想产生一个子类的对象,那么对象的创建其实是这样的过程:
先执行祖先类的构造函数,然后在一步步往下
class tt
{
public static void main(String[] args){
Person p=new Graduate();
}
}
class Person
{
String name;
int age;
Person(){System.out.println("In Person()");}
Person(String name,int age){
this.name=name;
this.age=age;
System.out.println("In Person(String,int)");
}
}
class Student extends Person
{
String school;
Student(){
this(null,0,null);
//对this的调用必须是构造函数的第一个语句
System.out.println("In Student()");
}
Student(String name,int age,String school){
super(name,age);
this.school=school;
System.out.println("In student(String,int,string)");
}
}
class Graduate extends Student
{
Graduate(){
System.out.println("In Graduate()");
}
}
输出结果:
In Person(String,int)
In student(String,int,string)
In Student()
In Graduate()
相关解释:
1、
没有父,哪来子
Graduate(){ //自动调super(); 如果父类有无参构造函数,否则要显式调用super(x,y,...)
System.out.println("In Graduate()");
}
2、
恩``建议楼主应该去看下think in java初始化那章```讲的很明白!
当调用子函数的构造函数的时候 ,他会依次调用最上层父类的构造函数,再依次往下层调用构造函数!
所以对你的例子来说 很明确:
首先编译器看到了graduate(),然后去找class Graduate 父类是class Student,这里编译器就会自动去调用Student(),但是Student()里面先要this(null,0,null); 所以去调用Student(String name,int age,String school),他里面又要去super (name,age);
所以最先完成最上层的构造函数的调用,完成person类的初始化动作,所以:In Person(String,int)
然后 完成 Student(String name,int age,String school)的 :In student(String,int,string)
再完成In Student()
最后就是In Graduate()
明白没啦???不懂就去看看think in java吧````
分可以全给我了吧
3、
如果在Student中没有定义一个无参数构造函数Student(),那么在他的子类Graduate中,就必须调用明确的父类的构造函数,super(参数)。
在你的例子中,由于已经在Student中定义了无参数构造函数,系统默认的调用了这个函数。所以最终的结果是这样了。
4、
Person p=new Graduate();属于动态绑定~
况且你可能对对象的产生过程不太了解·
如果你的类和别的类有继承关系,而你要想产生一个子类的对象,那么对象的创建其实是这样的过程:
先执行祖先类的构造函数,然后在一步步往下