继承
1.使用继承的好处?
我们定义多个类,多个类中都有一些相同的内容!=====>>> 将相同的内容向上抽取,定义到一个父类中!【提高代码的复用性!】
2.继承的核心思想=====>>> 共性抽取!
3.如何定义2个类,让其成为继承关系?
先定义一个类:Employee(员工类)
再定义另外一个类:BanZhuRen(班主任类<工号、姓名、班级管理的能力>);
还可以有其它的类:Teacher(讲师类<工号、姓名、讲课的能力>);
我们可以将共性的内容定义到Employee类中!
格式:
// 定义一个类(父类:将共性内容抽取到这里)
public class Employee{
}
// 定义子类,通过extends关键字描述它与Employee类的关系!======>>> 它就能拥有父类的内容(成员变量、成员方法)
public class Teacher extends Employee{
}
注意理解:
子类就是父类!【子类是Teacher,父类是Employee; 讲师是一名员工】 徒弟拥有师父所有的武功,但是反过来未必!
-
存在继承关系后,子类的操作父类(成员变量的特点)
父子类中成员变量
不重名:通过子类对象方法的变量名称来区别,到底访问的是子类的成员变量还是父类的成员变量!
重名:默认访问的就是子类的成员变量! -
存在继承关系后,子类的操作父类(成员方法的特点)
父子类中成员方法
不重名:通过方法名称来区分到底访问的是子类的成员方法,还是父类的成员方法!
重名: 默认访问调用的是子类的成员方法!子类中没有父类的同名方法,那么它是直接继承父类! 子类中有与父类的同名方法,那么调用的是子类的成员方法!此时,子类与父类重名的方法就构成了 覆盖重写(存在继承或者实现关系)! 覆盖重写的好处:能够对父类中的方法进行增强! 构成方法的覆盖重写,必须满足要求: 整个方法的签名必须与父类的完全一致!【除了访问权限修饰符(子类的权限修饰符的范围必须与父类的相同或者更宽)】
-
存在继承关系后,子类的操作父类(构造方法的特点)
构造方法:主要用于创建对象!!!我们在创建子类对象的时候,它其实会先去调用父类的无参构造方法!【我们没有在子类的构造方法里面去编写调用父类构造方法的代码】
当然,我们也可以显示的写出来【在子类构造方法的第一行写上super()】,而且我们还可以去编写代码调用父类的带参构造方法!我们在创建子类对象的时候,它其实是先创建父类的对象,然后再创建子类对象!!!【想要使用爸爸的功能,必须先有个爸爸!】
7.super关键字和this关键字
操作子类使用this,操作父类使用super!
★ 子类与父类的成员变量、成员方法重名如何去访问父类的内容!
重名的成员变量: super.重名的成员变量名称
重名的成员方法: super.重名的成员变量方法([实参]); // 参数是否需要携带,取决于重名的父子类的成员方法是否有参数!
构造方法:
在创建子类对象的时候会调用父类的构造方法!
在子类想要调用父类的构造方法,必须是在子类的构造方法中完成!!!【这个调用的代码必须写在子类构造方法的第一行!】
public Zi(){
// 隐含的动作!去调用父类的无参构造
super(); // 如果调用父类的带参构造方法,那么必须显示写出来!!!
System.out.println("子类构造方法");
}
结论:
★ 成员变量、成员方法:
不重名就用名字去识别访问父类的还是子类的!
重名:
默认访问的都是子类的!【省略了this】
要想访问父类的,需要使用super去操作!
this的基本使用:
可以访问子类的成员变量: this.成员变量名称
可以访问子类的成员方法: this.成员方法名称(实参)
可以访问子类的构造方法: this([实参]);
super的基本使用:
可以访问父类的成员变量: super.成员变量名称
可以访问父类的成员方法: super.成员方法名称([实参]);
可以访问父类的成员构造方法: super([实参]);
-
继承的特点
★ 父类有的,子类可以直接使用,还可以自己进行改写扩展!
★ java只允许单继承(一个子类只允许有一个唯一的直接父类!),不允许多继承!但是可以进行多级继承!
class A
class B
class C// 单继承Ok class A extends B{ // Ok } // 不允许多继承! class A extends B C{ // Ok 【一个儿子只有一个亲爹!】 } // 多级继承可以! class A extends B{ } class B extends C{ }
★ 一个类可以有多个子类!【一个爸爸可以有多个儿子!】
Object类是所有的类的祖宗!【最顶层父类!】=====>>>> 我们定义的任何类 都可以直接使用Object类中的方法!
9.抽象类
抽象类的存在价值:【用于设计模板!】
本身继承中,是为了抽取共性内容!!!
Employee(员工类)
BanZhuRen(班主任类<工号、姓名、工作>);
Teacher(讲师类<工号、姓名、工作>);
班主任的工作:班级管理!
讲师的工作:讲课!
员工(班主任、讲课)他们都要工作,但是工作的内容不一样,我们不能在父类中具体化!将工作的方法抽象,那么这类就必须定义为抽象类!
★ 一个类中只要有抽象方法,那么这个类必定是一个抽象类!
★ 一个抽象类中可以没有抽象方法!【不让创建这个类的对象!】
★ 抽象类不能创建对象,但是有构造方法,主要作用:供子类为抽象父类的成员变量初始化!