继承关系!
以manager与employee为例子,在manager与employee之间存在明显的关系 - 每一个manager都是employee。即“ is-a ” 关系。这是继承关系的一个明显特征。
public class Manager extends Employee {
......
}
employee类被称为 子类,派生类或者孩子类,employee类被称为父类,基类或者超类。
子类继承了超类的方法,属性,子类相对于超类具有更加丰富的功能,但是也有不适应的地方,这就需要我们来添加新的东西,或者重写不适应的地方(覆盖);
1 覆盖方法!
public class Employee {
public String name;
public double salary;
public Address address;
public Employee(String name,double salary,Address address ) {
this.name = name;
this.salary = salary;
this.address = address;
}
public Employee(){};
public double getSalary() {
return salary;
}
}
public class Manager extends Employee {
double bonus;
public Manager( String name,double salary,Address address ) {
super(name,salary,address);
bonus = 0 ;
}
public double getSalary() {
return salary+bonus;
}
public void setBonus(double b) {
bonus = b;
}
}
在上面的这段代码中,getSalary() 是无法返回salary,因为manager的getSalary方法不能直接访问employee的私有域 。 即子类不能访问超类的私有域。但是我们可以借助super来访问超类的私有域
public class Manager extends Employee {
double bonus;
public Manager( String name,double salary,Address address ) {
super(name,salary,address);
bonus = 0 ;
}
public double getSalary() {
double baseSalary = super.getSalary() ;
baseSalary += bonus; return baseSalary;
}
}
2 子类构造器
public Manager( String name,double salary,Address address ) {
super(name,salary,address);
bonus = 0 ;
}
super是java中的一个特殊关键字,1可以作为超类的构造器使用,2 利用super来调用
如果子类的构造器没有显式的调用超类的构造器,则将会自动调用超类的默认构造器。
注意点:
Address alex_address = new Address("FushanDepartment","Qingdao","china");
Employee alex = new Manager("alex",20000,alex_address);
System.out.println(jack.getSalary());
在上面的代码中,alex是一个employee类型的引用变量,但是它指向了manager对象,在调用的时候也会调用manager的getsalsry方法,这是因为java在运行时能够自动的选择调用哪一个。这种现象被称为动态绑定。
3 java支持多层的继承。不支持一个类同时继承多个类(可以利用接口实现)