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);
}
}
结果展示:(特别要注意先输出的是父类的还是子类的。这边输出顺序要注意)
其中比较重要的一点是:
如果在一个类中自己定义了有参数的构造函数,那这个类原先默认的无参构造函数就会
被覆盖掉。
(如果把Person类的无参构造函数,那么Employee中无参构造函数就会报错)
子类的构造函数会隐式调用父类的无参构造函数。
所以如果有子类继承这个类,一旦子类中要隐式调用父类无参构造函数的时候会报错,
因此需要自己补好父类的无参构造函数。
还有就是在Employee类中关于this()和super()的用法:
//this()和super()不能同时存在,因为都要在第一行
//带不带参数视具体情况而定
//this()自己调用自己的构造函数
//super()调用父类的空参构造函数
//this(**)----自己的带参构造函数
//super(**)----父类的带参构造函数