继承
继承的概念
生活中的继承:子女拥有父母的东西
代码块中继承:类与类之间产生了关系,子类可以直接访问父类中的成员
父类是子类共性内容向上抽取形成的,子类中除了有父类的共性内容之外还可以特有内容
父类:superclass,超类、基类
子类:subclass,派生类、衍生类
注:
- 一般来说,父类的范围更大,属性和方法较少;子类的范围更小,属性和方法更多
- java中有一个类
Object
,它是所有类的父类(任何一个类都直接或者间接的继承了Object)- 一个子类就是一个父类
好处:
- 提高了代码的复用性
- 为多态提供了前提
父类和子类的定义
关键字:
extends
格式:
public class 父类{ } public class 子类 extends 父类{ }
注:
- 一个子类只能有一个父类
- 一个父类可以有多个子类
- 继承具有传递性
- 不能循环继承
子父类中成员的同名成员的问题
同名变量
子父类中存在同名的成员变量时,子类对象优先访问子类中的。
就近原则
如果要访问父类中的同名成员变量,需要在子类中通过关键字
super
进行访问
同名方法
子父类中存在同名的成员方法时,子类对象优先访问子类中的。
就近原则
如果要访问父类中的同名成员方法,需要在子类中通过关键字
super
进行访问
方法的重写:在继承关系中,子类方法与父类方法的方法名、参数列表都相同
重写的作用:扩展父类功能
注:
注解
@Override
可以用于校验是否是重写子类重写父类方法的范围修饰符必须大于等于父类范围修饰符
范围修饰符的大小范围:
public > protected > [default] > private
子类重写父类方法的返回类型必须是父类方法的返回类型或者该类的子类
父类属性私有化的问题
子类的共性属性抽取到父类中,父类属性私有化了,子类不能直接访问,可以通过父类对外提供的这些私有属性的
set/get
方法进行访问。如何使用构造函数的重载,在创建子类对象时,对子类的属性进行初始化?
步骤:
- 重载父类构造函数
- 在子类的重载构造函数中调用父类的重载构造函数
public class Employee { private String name; private int age; private double salary; private String sex; public Employee() { } public Employee(String name, int age, double salary, String sex) { this.name = name; this.age = age; this.salary = salary; this.sex = sex; } // set/get方法 }
public class Programmer extends Employee { public Programmer() { } public Programmer(String name,int age,double salary ,String sex){ super(name, age, salary, sex); } }
子类中有特有属性的情况:
public class Employee { private String name; private int age; private double salary; private String sex; public Employee() { } public Employee(String name, int age, double salary, String sex) { this.name = name; this.age = age; this.salary = salary; this.sex = sex; } // set/get方法 }
public class Manager extends Employee{ private double bonus; public Manager() { } public Manager(String name, int age, double salary, String sex){ super(name, age, salary, sex); } public Manager(String name, int age, double salary, String sex,double bonus){ super(name, age, salary, sex); this.bonus = bonus; } // set/get方法 }