继承:
使用情景:当类与类之间,存在相同(共性)的内容,并满足子类是父类的一种,就可以考虑使用继承,来优化代码
继承的格式:public class 子类 extends 父类{}
使用继承的好处
继承的特点:Java只支持单继承不支持多继承,但支持多层继承
注:
子类到底能继承父类中的哪些内容:
构造方法 | 非私有 不能 | private 不能 |
成员变量 | 非私有 能 | private 能 |
成员方法 | 能被添加入虚方法表 能 | 否则不能 |
注:虚方法可以被覆写(Overriding)的方法都可以称作虚方法,因此虚方法并不需要做特殊的声明,也可以理解为除了用static、final、private修饰之外的所有方法都是虚方法。
特点:
1.成员变量的访问特点:就近原则(谁离我近,我就用谁)
先在局部位置找然后在本类成员位置找然后在父类成员位置找,逐级往上。
若重名,则sout(name);为从局部位置开始往上找
sout(this.name);为从本类成员位置开始往上找
sout(super.name);为从父类成员位置开始往上找
2.成员方法的继承特点:
方法的重写
当父类的方法不能满足子类现在的需求时,需要进行方法重写
书写格式:在继承体系中,子类出现了和父类一模一样的方法声明,我们就称子类这个方法是重写的方法
@Override重写注解
方法重写的注意事项和要求
构造方法的继承特点:
为什么?
怎么调用父类构造结构的?
继承中构造方法的访问特点:
this、super的使用总结
关键字 | 访问成员变量 | 访问成员方法 | 访问构造方法 |
this | this.成员方法 访问本类成员方法 |
this.成员方法(...) 访问本类成员方法 |
this(...) 访问本类构造方法 |
super | super.成员方法 访问父类成员方法 |
super.成员方法(...) 访问父类成员方法 |
super(...) 访问父类构造方法 |
练习:
package itheimaoopextenceao5;
public class Employee {
private String id;
private String name;
private double salary;
public Employee() {
}
public Employee(String id, String name, double salary) {
this.id = id;
this.name = name;
this.salary = salary;
}
/**
* 获取
* @return id
*/
public String getId() {
return id;
}
/**
* 设置
* @param id
*/
public void setId(String id) {
this.id = id;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return salary
*/
public double getSalary() {
return salary;
}
/**
* 设置
* @param salary
*/
public void setSalary(double salary) {
this.salary = salary;
}
public String toString() {
return "Employee{id = " + id + ", name = " + name + ", salary = " + salary + "}";
}
public void work(){
System.out.println("员工在工作");
}
public void eat(){
System.out.println("吃米饭");
}
}
package itheimaoopextenceao5;
public class Manager extends Employee {
private double bouns;
public Manager() {
}
public Manager(String id, String name, double salary, double bouns) {
super(id, name, salary);
this.bouns = bouns;
}
public double getBouns() {
return bouns;
}
public void setBouns(double bouns) {
this.bouns = bouns;
}
@Override
public void work(){
System.out.println("管理他人");
}
}
package itheimaoopextenceao5;
public class cooker extends Employee {
public cooker() {
}
public cooker(String id, String name, double salary) {
super(id, name, salary);
}
@Override
public void work(){
System.out.println("厨师正在炒菜");
}
}
package itheimaoopextenceao5;
public class Test {
public static void main(String[] args) {
Manager m=new Manager("heima001","zhangsan",4000,2000) ;
System.out.println(m.getId()+","+m.getName() +","+m.getSalary() +","+m.getBouns() );
m.eat() ;
m.work() ;
}
}