Java中的继承
1.继承的语法
2.如何访问父类的成员变量和方法
3.super的使用
4.继承中的构造函数
5.父类和子类代码块调用顺序
6.protected的使用
7.final的使用
1.继承的语法
在日常生活的,我们一听到继承,就会想到继承家里的财产,所以继承的本质就是可以直接拿到家里的财产,在Java中,继承是对多个对象共同特点进行抽取,让我们的代码复用性提高,比如在我们家庭中,儿子,女儿共有名字,年龄,身高,体重...,我们可以将他们这些共有的部分抽取到家庭当中,保留他们独特的特点,比如在特定的时段,儿子在踢足球,女儿在打篮球,这些就是他们特有的,下面的代码就是使用继承,减少代码的冗余,提高代码的复用性
在代码中,我们把继承于xxx这个类称为父类(也可以叫做基类或者超类)
而继承父类的这个类叫做子类(或者派生类)
所以有子类继承父类,派生类继承基类
我们将家庭中的成员共有的部分抽取出来,使得每个家庭成员保留他们特有的方法和变量
比如Son喜欢做运动,Sister喜欢写作业,这是他们的特点
在继承的时候我们需要使用关键字extends,本意是扩展的意思,所以使用extends可以继承父类的成员变量和成员方法
2.如何访问父类的成员变量和方法
那么如何调用父类的成员变量和成员方法呢,其实本质就是实例化对象,就可以通过'.',调用父类的成员变量和成员方法,当我们子类继承父类,可以对子类进行实例化对象,通过对象就可以访问到父类的成员方法和成员变量
调用父类的方法
调用父类的成员变量
3.super的使用
当父类和子类有相同的成员变量或者成员方法的时候,我们无论如何实例化对象进行调用,都是优先调用子类的,其实在调用的时候,编译器会遵从一个原则:对实例化的对象进行调用某一个成员方法或者成员变量的时候,优先在子类查找,如果子类查找不到,就去父类查找,如果父类也查找不到,那么就报错!!!
那么当子类和父类有相同的成员变量的时候,我们就想调用父类的成员变量该咋办呢?
我们可以使用super调用,super就是调用父类的成员变量或者成员方法
当父类和子类有相同的成员变量id时候,我们对子类实例化对象调用的id,都是子类自己的id
当我们想要调用父类id时候,就可以使用super.id,就可以访问父类的id,但是有一点需要注意的是,super只能在非静态方法中调用
super和this的比较
【相同点】
1.super和this都是Java中的关键字
2.都必须在非静态方法中使用
3.在构造方法中必须放在第一条语句
【不同点】
1.super和this不可以同时存在 --- 因为super必须放在构造方法第一句,this也必须放在构造方法第一句
2.super()是调用父类的构造方法,this()是调用当前类的构造方法
3.super引用的成员变量或者成员方法是引用父类的成员变量或者成员方法
而this应用的成员变量或者成员方法是引用当前类的成员变量或者成员方法
4.在调用无参的构造方法时,如果没有写super(),编译器也会自动为我们生成,而编译器不会自动帮我们生成this()
4.继承中的构造函数
当我们使用继承后,如果不写任何构造函数,在编译的时候,编译器会自动帮我们生成一个无参的构造函数,但是当我们需要一个带参的构造函数,就需要有几点要注意:
1.在子类写构造函数的时候,第一行必须先帮父类进行构造,需要使用super
2.如果我们自己写一个无参的构造函数,第一行如果不写super的话,编译器会默认帮我们写,但是如果是带参的构造函数,第一行不写super的话,编译器不会帮我们写的!!
5.父类和子类代码块调用顺序
我们先讨论没有继承的时候,对于一个类来讲,我们有静态代码块,实例代码块,构造方法,当我们对一个类实例化对象的时候,他会先调用静态代码块,其次调用实例代码块,最后调用构造方法,当我们对一个类进行多次实例化的时候,静态代码块只会被第一次实例化调用一次,所以后面只会调用实例代码块的构造方法
而对于继承来说,就会略有不同,我们可以看下面的代码:
对于继承,当我们对子类实例化对象的时候,他会优先调用父类的静态代码块,再调用子类的静态代码块,然后调用父类的实例代码块和构造方法,再调用子类的实例代码块和构造方法
6.protected的使用
protected的使用范围:再同一包中的同一类或者不同类,和不同包的子类可以访问
这是俩个不同包的子类,Student继承了School类,School中的成员变量用protected修饰,但是因为Student继承了School类,所以可以访问School中的成员变量
但是要注意的是:如果有多个类继承了School,那么每个类不可以再其他类下面实例化对象并且调用父类的成员变量和成员方法,只能再自己类下实例化对象,然后进行调用
7.final的使用
final可以修饰变量,成员方法和类
final修饰变量或者子段,表示该变量被修饰为常量(不可以被修改)
final修饰类,表示该类不可以被继承
1.修饰变量 --- 表示该变量被修饰为常量,无法被修改
2.修饰类 --- 表示该类无法被继承