今日学习的重点内容--------继承
1、继承的概念:
举例:工人类,军人类,其他类等,为了书写格式以及访问方便,需要定义独立的类,将其他类中的共性内容抽取出来,存放该独立的类中
让独立的类(父类/超类)和其他类(子类)产生一种关系,将这种关系成为"继承关系"
2、继承的格式:
子类名 extends 父类名{}
3、继承的好处:
提高了代码的复用性(代码结构清晰)
提高了代码的维护性
类和类产生的这种“继承关系”,是多态的前提条件
*继承的关系也是一种弊端,类和类产生关系,耦合性就增强了。
4、开发中的原则:(Java很多的开发原则都要遵循下面六个字)
低耦合,高内聚
耦合:尽量的一个类能完成的事情一个类去完成,不要产生过多的关系。
(Spring框架的IOC:控制反转)
内聚:执行某件事情的能力。
5、继承的特点:
1)在Java语言中,类和类之间只支持单继承,不支持多继承。
在其他语言中是支持多继承的,
语言格式:子类名 extends 父类名1,父类名2{}
2)虽然不支持多继承,但是类与类之间是可以多层继承的。
6、继承的注意事项:
1)子类继承父类,可以继承父类中所有的非私有的成员;
本身私有的成员变量或成员方法只能在本类中访问,外界是不能访问的,但是间接通过公共的访问方法来访问。
2)子类继承父类,不继承构造方法,但是可以通过一个关键字来访问父类的构造方法(super)
3)不要为了使用部分功能而去使用继承,(什么时候使用继承呢?)当A类如果是B类的一种,或者B类是A类的一种,可以使用继承。
继承体现的是“is a”的关系。
7、继承中成员变量的关系:
子类继承父类,如果子类中的成员变量名称和父类的成员变量名称不一致的情况:(分别访问即可)
子类继承父类,如果子类中的成员变量名称和父类的成员变量名称一致的情况:(执行流程,遵循就近原则):
1)先在子类的局部位置中找,如果找到了就使用它
2)如果局部位置中没有,在子类的成员位置中找,如果找到了,就使用。
3)如果找不到,就在父类的成员位置中找,如果找到了就使用
4)如果还找不到,就报错了,说明访问了一个不存在的变量
8、继承中构造方法的关系:
子类是不能继承父类的构造方法的,但是通过super()来访问父类的构造方法。
在继承中,子类的所有构造方法都默认访问父类的无参构造方法,相当于子类的所有构造方法的第一句话:隐藏了super();
因为可能要用到父类中的数据,所以先让父类中的数据进行初始化(构造方法),父类初始化完毕了,然后才执行子类的构造方法(子类数据初始化)--------分层初始化
super():如果在子类的构造方法显示给出了,必须写在第一句,否则可能出现父类初始化多次。(可以省略不写)
子类的所有构造方法默认父类的无参构造方法,如果父类没有提供,就报错了。
如何让解决上述问题:
1)手动给出父类的无参构造方法(之前说在写一个标准类的时候,建议永远给出无参构造方法)
2)现在手动不提供无参构造方法,如何解决?
a、间接通过super(xx)来访问父类的有参构造初始化;
b、通过this(),访问本类(子类)的无参构造方法,然后通过子类的无参构造方法里面super(xx)简介访问父类的有参构造方法。
子类中的所有构造方法里面某一个构造方法必须让父类初始化,super(xx),this(),全都是在构造方法中的第一句。
9、this关键字和super关键字区别:
应用:
访问成员变量:
this.变量名:访问本类的成员变量
super.变量名:访问父类的成员变量
访问成员方法:
this.():访问本类的成员方法
super.():访问父类的成员方法
访问构造方法:
this():表示访问本类的无参构造方法
this(xxx):表示访问本类的有参构造方法
super():表示访问父类的无参构造方法
super(xxx):表示访问父类的有参构造方法
this:代表当前类对象的地址值引用
super:代表父类的空间标识(代表父类的对象空间地址值引用)