[转]java中关于构造函数继承的一些问题1

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();属于动态绑定~

况且你可能对对象的产生过程不太了解·
如果你的类和别的类有继承关系,而你要想产生一个子类的对象,那么对象的创建其实是这样的过程:
先执行祖先类的构造函数,然后在一步步往下
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值