通过观察发现,name和age这两个成员变量,以及study方法都是相同的。如果我们继续定义其他类,比如:医生、程序员、律师等等,他们也是具备了上面的成员的内容。那么,每次定义的时候都要将这些重复的内容再写一遍,我感觉这样很麻烦。怎么改进?能不能把这些相同的内容定义到一个独立的类中,然后,让这些其他的类与这个独立的类产生一个关系,建立这个关系后,其他类中就具备了这个独立的类中的功能。

针对于这样的一个需求,java提供了一个关键字可以产生这样的关系:extends(继承)

继承:
把多个类中相同的部分提取到另一个类中,然后让多个类继承这个类。

java如何实现继承:使用extends关键字
格式:class 子类 extends 父类{}

继承有哪些好处:
1、提高代码复用性
2、提高了代码的维护性
3、让类与类之间产生关系,为后面学习多态做准备

继承有什么坏处呢?
类与类之间耦合性增强了。

开发的原则:低耦合,高内聚。
耦合:类与类之间的关系
内聚:指的是自己内部能够完成某件事的能力

class Student extends Person{}
读法:Student类继承自Person类,Student类是Person类的子类(派生类),Person是Student类的父类(超类,基类)

Java中继承的特点:
1、java中针对于类来说,继承只能单继承,不能多继承(即不能一个子类同时继承多个父类)
2、java支持多层继承(继承体系)

使用继承的注意事项:
1、子类只能继承父类中的非私有的成员(成员变量和成员方法)
2、子类不能继承父类中的构造方法,可以通过super关键去访问父类中的构造方法。
3、不要为了部分的功能而去继承

什么时候使用继承呢?
在英语中有一个语法”is a“,只要,满足这个语法就可以使用继承
例如:Animal 对于 cat、dog、pig等

类的组成:
成员变量
构造方法
成员方法
引入了继承之后,我们需要考虑在代码中继承与这三部分的关系

继承与成员变量的关系:
1、当父类中的成员变量与子类中的成员变量变量名不一样的时候,该调用谁就调用谁
2、当父类中的成员变量与子类中的成员变量变量名一样的时候
1)先在局部范围内去找,如果找到了就返回出去
2)如果局部范围内找不到,就去类中成员范围去找,如果找到了就返回出去
3)如果类中成员范围找不到,就去父类的类中成员变量范围去找,如果找到了就返回出去
4)如果父类中都没有呢?报错,提示找不到符号。

问题:当子类中的变量与父类中的变量重名的时候,我们不仅要输出子类中的变量num2对应的值,还想输出父类中的变量num2对应的值,怎么办?

如果有一个东西,和this相似,可以直接访问父类的数据就好了。
java替我们考虑到了这个问题,提供了一个关键字就代表父类的引用:super

this与super的区别:(面试题)
1、this代表的是当前对象的引用
2、super代表的是父类存储空间的标识(可以操作父类中的成员)
3、super在一个类中只能代表直接父类的引用,不能跨层引用

要想初始化子类,就必须先初始化父类。
super、this关键如何使用呢?
1、调用成员变量
super.成员变量 调用的是直接父类中的成员变量
this.成员变量 调用的时候本类中的成员变量
2、访问构造方法
this(...) 访问本类中的构造方法
super(...) 访问直接父类中的构造方法
3、访问成员方法
this.成员方法名(..) 调用本类中的成员方法
super.成员方法名(...) 调用直接父类中的成员方法

继承与构造方法的关系:
1、子类中所有的构造方法都会默认访问父类中无参的构造方法
2、因为子类会继承父类的数据,还有可能会使用到父类的数据
所以在做子类初始化之前,一定会先完成父类的的初始化

注意:每一个子类中的构造方法,第一句话默认是super()

问题:当父类中没有无参构造方法的时候,怎么处理?
1、使用super关键字,带参数的形式去访问父类中带参数的构造方法
2、使用this关键字调用本类中的其他构造方法
前提:本类中其他构造必须也得先进行访问父类的构造方法
使用this的目的就是间接地去调用super关键完成父类的初始化

注意事项:
1、super(...)和this(...)必须出现在构造方法中的第一句话,表明要对父类进行初始化
2、在同一个构造方法中,不能多次对父类进行初始化
java中每一个类都只能进行初始化一次
(也就是说在同一个构造方法中,super和this只能出现一个)
理解:
1、要想进行子类初始化,就必须先进行父类的初始化
2、初始化就是调用构造方法的过程
3、继承关系子类中构造方法的第一句话默认隐含了一个super(),调用父类的无参构造方法
4、java中每一个类都只能进行初始化一次


继承与成员方法的关系
1、当子类中的成员方法名与父类中的成员方法名不一样的时候,该调用谁就调用谁
2、当子类中的成员方法名与父类中的成员方法名一样的时候,怎么办呢?
1)首先会在本类中去找,看看有没有这个方法,如果有,就调用
2)如果本类中没有该方法就去父类中查找,如果有,就调用
3)如果连父类中都没有,就宝座,找不到符号

方法的重写:
继承关系中,子类的成员方法的声明(返回值类型,方法名,参数列表)都与父类中的成员方法一模一样,称之为方法的重写(覆盖,复写)

面试题:方法的重写与重载的区别?
1、重载是发生在一个类中,方法名一样,参数列表不一样,与返回值无关。
2、重写是发生在继承关系中,子类的成员方法的声明(返回值类型,方法名,参数列表)都与父类中的成员方法一模一样。

今后在方法上看到@Override,表示的是该方法是重写了父类中的方法,内部实现一样

继承中重写有哪些注意事项:
1、父类中私有的方法不能被重写
2、如果子类要重写父类中的方法,访问权限必须要大于等于父类中的权限
不能被父类中的访问权限还要低。要么比它大,要么跟它一样。
建议:以后重写方法的时候,访问权限与父类中的访问权限一致。
3、父类中的静态方法,子类不允许重写,因为静态的东西是属于类本身的东西,相当于各用各的,与重写八竿子打不着

如果我们父类中的方法不想让子类继承,怎么办呢?
要么使用private或者static修饰

由于继承中方法存在一个现象,叫做方法的重写。
父类中的方法可以被子类重写的时候,父类原本的方法还在,但是子类重写后,我们调用的时候,调用的是子类本身东西。
现在呢,我们不想让子类去重写父类中的方法,但是呢,我又想让子类去使用。
那怎么办呢?
java提供了一个关键字给我们使用,叫:final

final: 最终的的意思,不可改变的意思。

final的位置:一般情况下,放在访问权限修饰符的后,返回值之前。
常见情况下,final不仅可以修饰成员方法,还可以修饰成员变量,还可以修饰类

final关键字是最终的意思,可以修饰类,成员变量,成员方法。
特点:
1、被final所修饰类不能被继承
2、被final所修饰的变量,将来不能修改其值,变量变成了常量
常量:
字面值常量
自定义常量:被final所修饰的变量
3、被final所修饰的方法不能被重写,但是可以使用。
虽然不能被重写,但是在同一个类中可以发生重载

当final修饰的是引用数据类型变量的时候,指的是地址值不能被改变
当final修饰的是基本数据类型变量的时候,指的是具体的值不能被改变


被final修饰的变量什么时候进行赋值?
在构造方法结束之前进行赋值即可,但是一旦有值,就不能被改变了。