java 构造器链_Java杂谈之构造函数链

本文详细介绍了Java中构造器链的概念,通过Person、Employee和Manager三个类的实例展示了构造器的继承与调用机制。重点讲解了构造器的重载、访问权限以及this()和super()的使用规则,并提醒读者注意子类构造器如何隐式或显式调用父类构造器,以及无参构造器在类继承中的重要性。
摘要由CSDN通过智能技术生成

Java的构造函数链,首先对类的构造函数明确几点:

1.类的构造函数可以重载

2.类的构造函数访问修饰符不一定是public,也可以为private等其他访问修饰符

3.类的构造函数无返回值

4.类的构造函数名与类名保持一致

以下是具体的实例:

类:Person类

类:Employee类(继承Person类)

类:Manager类(继承Employee类)

首先是Person类:

package JavaConstructorFunChain;

public class Person {

private String pname;

//建立空参构造函数

public Person()

{

System.out.println("创建人类");

}

public Person(String pname) {

//super();

this.pname = pname;

System.out.println(getPname());

}

public String getPname() {

return pname;

}

public void setPname(String pname) {

this.pname = pname;

}

}

其次是Employee类:

package JavaConstructorFunChain;

public class Employee extends Person {

private double salary;

public Employee()

{

//隐式调用父类空参构造函数

//注意"隐式","空参"这两个关键字

System.out.println("创建员工");

}

public Employee(String pname,double s)

{

//this()和super()不能同时存在,因为都要在第一行

//带不带参数视具体情况而定

//this()自己调用自己的构造函数

//就这种情况,有pname这个参数,如果不用super(),则会隐式调用父类空参构造函数,那结果就是null

//super()调用父类的空参构造函数

//super(**)----父类的带参构造函数

super(pname);//显式调用父类带参构造函数

this.salary = s;

System.out.println(pname+"的工资是:"+getSalary());

}

public double getSalary() {

return salary;

}

public void setSalary(double salary) {

this.salary = salary;

}

}

最后是Manager类:

package JavaConstructorFunChain;

public class Manager extends Employee {

private double benfit;

public Manager(String pname, double s,double b) {

super(pname, s);

this.benfit = b;

System.out.println(pname+"的工资是:"+s+","+"奖金是"+getBenfit());

}

public Manager() {

System.out.println("创建经理");

}

public double getBenfit() {

return benfit;

}

public void setBenfit(double benfit) {

this.benfit = benfit;

}

}

我们用Test类测试一下这三个类之间的联系以及怎样实现的构造函数链:

package JavaConstructorFunChain;

public class Test {

public static void main(String[] args) {

//子类的构造函数一定会

//隐式或显式调用父类的构造函数

Manager m = new Manager();

Manager m2 = new Manager("汤姆克鲁斯",10000000,300000);

}

}

结果展示:(特别要注意先输出的是父类的还是子类的。这边输出顺序要注意)

88e3de7636e17505b2f12cdb472adcb0.png

其中比较重要的一点是:

如果在一个类中自己定义了有参数的构造函数,那这个类原先默认的无参构造函数就会

被覆盖掉。

(如果把Person类的无参构造函数,那么Employee中无参构造函数就会报错)

子类的构造函数会隐式调用父类的无参构造函数。

所以如果有子类继承这个类,一旦子类中要隐式调用父类无参构造函数的时候会报错,

因此需要自己补好父类的无参构造函数。

还有就是在Employee类中关于this()和super()的用法:

//this()和super()不能同时存在,因为都要在第一行

//带不带参数视具体情况而定

//this()自己调用自己的构造函数

//super()调用父类的空参构造函数

//this(**)----自己的带参构造函数

//super(**)----父类的带参构造函数

原文:http://blog.csdn.net/u010792238/article/details/38441829

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值