构造函数链,首先对类的构造函数明确几点:
1.类的构造函数可以重载
2.类的构造函数访问修饰符不一定是public,也可以为private等其他访问修饰符
3.类的构造函数无返回值
4.类的构造函数名与类名保持一致
以下是具体的实例:
类:Person类
类:Employee类(继承Person类)
类:Manager类(继承Employee类)
首先是Person类:
[java]
view plain
copy
- 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类:
[java]
view plain
copy
- 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类:
[java]
view plain
copy
- 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类测试一下这三个类之间的联系以及怎样实现的构造函数链:
[java]
view plain
copy
- package JavaConstructorFunChain;
- public class Test {
- public static void main(String[] args) {
- //子类的构造函数一定会
- //隐式或显式调用父类的构造函数
- Manager m = new Manager();
- Manager m2 = new Manager("汤姆克鲁斯",10000000,300000);
- }
- }
结果展示:(特别要注意先输出的是父类的还是子类的。这边输出顺序要注意)
其中比较重要的一点是:
如果在一个类中自己定义了有参数的构造函数,那这个类原先默认的无参构造函数就会
被覆盖掉。
(如果把Person类的无参构造函数,那么Employee中无参构造函数就会报错)
子类的构造函数会隐式调用父类的无参构造函数。
所以如果有子类继承这个类,一旦子类中要隐式调用父类无参构造函数的时候会报错,
因此需要自己补好父类的无参构造函数。
还有就是在Employee类中关于this()和super()的用法:
//this()和super()不能同时存在,因为都要在第一行
//带不带参数视具体情况而定
//this()自己调用自己的构造函数
//super()调用父类的空参构造函数
//this(**)----自己的带参构造函数
//super(**)----父类的带参构造函数