前述
名词解释:父类是被继承的类,子类是继承父类的类;
如:class Employee{…}, class Manager extends Employee{…}
Employee 是父类,Manager 是子类;
子类能使用父类的所有公共方法和属性,并且能添加自己的属性和方法
正确覆写父类方法
- 当覆写的方法中有调用父类的方法,需要加上super,附代码片段
//这是父类中的方法
public double getSalary(){
return this.Salary;
}
//这是在子类中被覆写的方法
public double getSalary(){
return super.getSalary()+this.bonus;
}
- 覆写的子类方法的访问权限不能比父类方法小
- 父类的属性如果被private修饰,子类不能直接访问,通过调用父类的公共方法访问私有属性
写子类构造器的前提
- 如果子类的构造器没有显式地调用父类的构造器(没用super(…)),系统默认调用父类的无参构造器,若父类没有无参构造器,编译器将会报错
- 若子类构造器调用了super(),它一定要放在其他语句的前面
多态和他的兄弟动态绑定
Employee[] staff =new Employee[3];
staff[0] = new Manager("Tom",70000,30000);
staff[1] = new Employee("Harry",65000);
staff[2] = new Employee("Time",30000);
for(Employee e : staff) {
System.out.println("name="+e.getName()+",Salary="+e.getSalary()+",ID="+e.getID());
}
多态:看上面代码可以发现,staff被定义成Employee类型,但他引用了一个Manager类(Manager 是 Employee 的子类)的对象,这是完全正确的,这便是多态,即一个变量可以引用不同类的对象(这些类满足父类和子类的关系,是一条继承链而不是多条)。
动态绑定:这体现在第二段代码,e是Employee类(父类)的变量,System.out语句中的getSalary方法被子类覆写,且staff[0]引用的是Manager类(子类)的对象,那staff[0]调用的getSalary方法是父类的还是子类的呢?答案是子类的getSalary方法,这涉及到了父类与子类的相互转换,不懂且有兴趣的可以看一下我之前写的。
final:我要阻止继承
final 用在属性上使其只能通过构造器初始化,之前讲过;
final 用在方法上使其不能被覆写;
final 用在修饰类上,可以阻止继承,任何类不能继承它,如String类便是如此,不能被继承。