12.继承
- 类与类之间当有一定关系(例:狗属于动物)时可以用继承extends(Dog extends Animal)
- 子类(派生类)继承父类(基类)后集成父类的所有成员(成员变量和方法),方法公有(权限修饰符)
- java一个子类只能有一个父类,不能继承多个类
- 子类构造方法执行之前会先执行父类构造但没有创建父类对象
- 虚拟机会自动先调用父类无参构造再执行子类构造;但父类如果没有无参构造,子类中必须显示调用父类构造
- super()在子类构造方法的首行;
- 自定义的类会默认继承Object类,Object类是整个继承体系的根基类
员工类
public class Employee {
private int id;
private String name;
private char gender;
private double salary;
public Employee(){
System.out.println("父类构造执行了");
}
public Employee(int id, String name, char gender, double salary) {
this.id = id;
this.name = name;
this.gender = gender;
this.salary = salary;
System.out.println("Father: " + this);
}
//.....getter setter方法
}
程序员类继承了员工类
public class SoftwareEngineer extends Employee {
private int hot;
public SoftwareEngineer() {
System.out.println("子类构造了");
}
public SoftwareEngineer(int id, String name, char gender, double salary, int hot) {
super(id, name, gender, salary);
this.hot = hot;
System.out.println("son: " + this);
}
public void show() {
System.out.println(" 编号是" + getId() + " 姓名是 " + getName() + " 工资是 " + getSalary());
}
public int getHot() {
return hot;
}
public void setHot(int hot) {
this.hot = hot;
}
}
super关键字
- this指代当前对象,super指代父类
- 在子类中显示调用父类构造方法的时候出现在首行
- 子类成员和父类成员重名时(子类再次声明了同样的成员),使用super指代子类成员
public class Dog extends Animal {
private String color;
private int age;
public void run() {
System.out.println("年龄:" + age);
//使用super指代父类的方法
System.out.println("继承下的年龄:" + super.getAge());
}
public Dog() {
}
public Dog(String name, int age, String color) {
//使用super调用父类构造
super(name, age);
this.color = color;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
方法的重写
- 子类对于继承下来的方法实现不满意的时候可以重写
- overwrite重写(注释)
- 重写注意点:子类的方法名,参数列表,返回值类型和父亲一模一样
- 父类的方法权限修饰符比子类更加严格
- 方法重载在指本类中 方法名相同参数列表不同;而重写发生在继承关系前提下
权限修饰符
- 修饰成员变量和方法的修饰符 public protected 缺省 private
- 修饰class 使用public 缺省
那些地方可以访问
修饰符 | 类内部 | 同一个包 | 子类 |
---|---|---|---|
private | Y | ||
缺省的(不写) | Y | Y | |
protected | Y | Y | Y |
public | Y | Y | Y |