第十一章 继承

一  概念及定义

1.关系:

解释:类是把现实事物抽象表示出来,但是现实事物之间是存在联系的(比如猫,狗都是动物,都有动物的一些特性)

关系的分类

(1)has-a

(2)is-a

2.产生原因:

引出来继承这个概念来表示现实事物之间的is-a关系 (也就是类之间的关系),使得子类可以直接继承父类的属性和方法,就无需再重复定义

本质目的:实现代码的复用

2.使用:

思考两个现实事物之间是否有共性的地方的,如果有,可以将其共性的地方抽取出来作为父类,然后二者不同的地方派生出子类去对其进行分别的实现

父类:提取出来的公共代码

子类:父类的共性代码+个性化的代码

3.名称

被继承的类:父类/基类/超类

继承类的类:子类/派生类/子类

注:上述名称是一一对应的,两个子类的含义不同,一个孩子的子,一个是子集,对应着超集

二  子类访问父类成员

1.不能访问到父类成员

(1)没有访问权限(与修饰符相关)

(i)问题:子类继承了父类的所有属性和方法,但并不代表就能使用,如果没有访问权限,其也无法访问到(对应的访问权限表在第十章有提到)

(ii)解决方法:可以在父类中设置public的getter和setter方法,让子类引用调用该方法,让其能得到或更改其值(也可以对子类使用父类属性时做出限制)

注:我们在设置权限的时候要考虑清楚,这个变量是要在类内部自己使用,还是让类的调用者使用,还是让类的子类使用(使用protected),然后具体使用能使用到哪个地步都要考虑清楚

(2)没有对应实例(与static修饰相关)

(i)问题:调用实例属性时必须要有对应得实例

(ii)情况:

staic修饰的方法不自带有this引用和super引用,其没有自带的实例,故也没有可指向的属性

并且在方法内也没有单独新创一个实例,利用该实例的引用去指向该实例的对应属性

故该方法无法找到对应的那份实例进而找到该属性/方法,故无法访问

(iii)解决方法:

在static方法中重新创建一个实例,利用该实例的引用去访问该属性或方法

2.访问同名成员

(1)情况:父类与子类定义了同名的属性/方法

(2)一般情况:

(i)类型兼容:采取就近原则(调用的方法是来自哪个类/调用的属性是在哪个类进行调用)

例如:所在父类的方法中调用同名属性,使用的是父类的属性

在子类的方法中使用该属性,则使用的是子类定义的属性

(ii)类型不兼容:谁有访问谁,都没有则报错

3.特殊:类型兼容的情况下一定访问父类成员:使用super引用

注:this引用指向的是就近原则那个类的对象,super引用指向父类对象

三  父类构造方法及初始化

1.前提:子类在进行构造方法之前,一定会先调用父类构造方法

原因:先初始化从父类那继承下来的属性,再初始化自身的属性

2.要求:对父类构造方法的调用必须放于第一行

3.调用:使用super()语句

3.类型:

(1)父类构造方法无参:

(i)情况:当父类没有显式定义构造方法或父类显式定义了但其是无参的

(ii)是否需要显式调用:无需子类定义构造方法手动调用,JVM会自动添加super();进行调用

注:JVM自动生成需要满足的条件:

(1)父类有无参的构造方法

(2)当子类没有进行显示调用父类构造方法

(2)父类构造方法有参

(i)是否需要显式调用调用:需要子类显式定义构造方法进行调用,否则会报错

注:编写子类构造方法的时候一定要注意其父类的构造方法是有参还是无参,若为有参一定要显式写出来,并且写在第一行

4.特殊情况:同时需要调用同名的其他构造方法和父类的构造方法

(1)冲突点:this和super都需要放在构造方法的第一行

(2)解决方法:将this调用子类构造方法放在第一行

(3)原因:this调用的子类构造方法内的第一行也会调用父类的构造方法,借助this内调用的父类构造方法完成对父类属性的初始化

5.继承关系上的初始化顺序:

规则:

(1)先父类再子类

注:创建子类对象时要先创造父类对象

(2)静态成员在类加载时初始化并且只初始化一次,非静态属性在创建对象时实例化(先静态后实例)

(3)先后顺序:静态代码块初始化>就地初始化>构造代码块初始化>构造方法初始化

6.特殊情况:子类继承了父类所有的属性和方法(构造方法除外)

子类的初始化需要调用子类的构造方法来完成初始化而不能直接通过调用父类构造方法来完成初始化,子类只能通过super()来调用父类构造方法

四  this引用与super引用的异同

1.相同:

(1)性质;都是关键字

(2)使用限制:只能在非静态方法中使用

注:再次强调静态方法不存在也不可存在this和super引用

(3)构造方法:都可用于调用构造方法,且都需要放于第一行(冲突,二者不能同时出现在构造方法中)

2.不同:

(1)与父类成员重名:

this引用指向的是就近原则指向的那个类的对象(当前调用该方法的那个对象)

super引用指向的是父类对象

(2)构造方法:

this引用调用的构造方法是本类的重载的其他构造方法

super引用调用的是父类构造方法

(3)自动生成:

this引用不写则不会自动生成

super引用当其满足条件时会自动生成

五  继承方式

1.单继承

2.多层继承:

注:在实际开发中一般不会多于四五层,所是多于则要考虑代码重构的问题了

同时层次过多也会影响到代码的可读性

3.不同类继承于同一个类:类似于一个父亲有多个孩子(最常见,继承的本质目的就是实现代码复用)

4.多继承(在Java中不支持):

(1)定义:一个子类继承多个父类

(2)问题:会导致多边继承问题

解释:当父类同时定义了两个完全相同的属性时,此时导致子类继承了多份相同的属性,在之后使用该属性会导致混乱,不知道其具体要使用的对应是哪个父类继承下来的属性

六  final关键字

1.修饰对象:

(1)变量:该变量不可进行修改(相当于常量)

(2)方法:该方法不可被重写(当该方法不想开放扩展时可以使用此来进行限制)

(3)类:该类不可被继承(例如String类)

注:上述的作用虽然都可以通过人为来实现,但是人为相当来说有时候会不靠谱。所以还是引进语法规则对其进行强制限制

七  组合与继承

1.组合定义:将其他类的实例作为该类的属性

2.区别:

继承:is-a的关系

组合:has-a的关系

补充:

(1)查看定义:使用ctrl+左键

(2)返回刚才位置:alt+鼠标后退按钮

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值