子类构造器

super

可以使用super来调用父类的属性或方法,调用方式为

  • super.属性名

  • super.方法名(参数列表)。

除此之外,还可以通过super来调用父类的构造器。

super(参数列表)

子类构造器

在java中子类构造器和php中相比,有了一些限制:

  • 子类构造器中使用超类构造器,调用父类构造器的语句必须是第一条语句。
  • 如果子类构造器没有显示的调用超类的构造器,将自动的调用超类的无参数构造器。
  • 若父类没有无参数构造器,且子类构造器中又没有显示地调用超类的其他构造器或本类的其他构造器,java编译器就会报告一个错误。(子类必须调用父类构造器

因为Employee没有无参数构造器,所以子类必须写构造器,且必须调用父类的含参数构造器。子类构造器如下:

public Manager (String name, int age, double salary) 
{
    super(name, age, salary);
    this.bonus = 0;
}

完整的Manager类代码如下:

package com.studyjava.demo;

class Manager extends Employee
{
    private double bonus;

    public Manager (String name, int age, double salary) 
    {
        super(name, age, salary);
        this.bonus = 0;
    }

    public double getSalary ()
    {
        return super.getSalary() + this.bonus;
    }

    public void setBonus (double bonus)
    {
        this.bonus = bonus;
    }
}

下面我们来测试下这两个类,下面是测试代码

package com.studyjava.demo;

public class ManagerTest
{
    public static void main (String[] args) 
    {
        Employee[] arrs = new Employee[3];

        arrs[0] = new Employee("paul", 35, 3800);
        arrs[1] = new Employee("harden", 32, 4000);

        Manager m = new Manager("james", 36, 4000);
        m.setBonus(1000);

        arrs[2] = m;

        for (Employee e:arrs) {
            System.out.println(e.getName() + " " + e.getAge() + " " + e.getSalary());
        }
    }
}

this与super的区别

No. 区别点 this super
1 访问属性 访问本类中的属性,如果本类没
有此属性则从父类中继续查找
直接访问父类中的属性
2 调用方法 访问本类中的方法,如果本类没
有此方法则从父类中继续查找
直接访问父类中的方法
3 调用构造器 调用本类构造器,必须放在构造
器的首行
调用父类构造器,必须
放在子类构造器的首行