javaSE(基础):3.继承及final、protected关键字

一.继承

1.为什么要继承

比如:我们定义了一个猫类狗类,每个动物都有名字和年龄及他们的行为:

写一个Animal类,使用extends来继承Animal。

可以看出:继承就是专门用来进行共性抽取,实现代码复用

 2.继承的语法

Java中要表示继承关系,就要使用extends关键字,具体如下:    

被继承的类(如上面的Animal类)叫父类/基类/超类,上面的Dog类和Cat类在继承中叫子类/派生类

 3.继承的使用

3.1父类成员访问

1. 子类和父类不存在同名成员变量时:
访问子类的成员有两种情况
   第一:在子类方法中 访问成员可以直接访问也可以通过对象进行访问

继承体系中,子类继承了父类的成员方法和成员字段(变量),我们就可以在对应的成员方法中直接使用。(对应指的是:如父类的成员未被static修饰(被修饰的要用类名调用),那它不能在静态成员方法中直接使用,因为在调用成员方法时,其实隐藏了this,而this不能在静态成员方法中使用)

 第二:在非子类中通过子类对象访问成员

2.子类和父类成员变量同名时:

在子类方法中通过子类对象访问成员:

1.优先调用子类的成员(可以理解为就近原则)。

2.如果调用的成员子类中没有,就会从父类中找,如果父类中也没有定义,则编译报错。

3.发生方法重载,可以用括号中的参数区分调用的是哪个方法。

都调用了子类自己的成员。

那如果成员名一样,而我又想在子类方法中调用父类的成员该怎么办呢?--->使用super关键字。

 4.super关键字

有时因场景需要,子类和父类有相同的成员名。我们不能直接访问父类的成员,可用super关键字,它是专门用来访问父类成员的:

【注意事项】

super:

1.只能在非静态方法中使用。

2.只能在子类方法中,访问父类的成员变量和方法

super的其他用法在下面中介绍。 

 4.1子类的构造方法

父子-->先有父再有子!即:要想调用子类的构造方法,系统就会自动先执行父类的构造方法,后再执行子类的构造。

我们知道,在类中我们不创建构造方法系统也会自动给我们创建一个无参的构造。父类的构造会被子类继承,在构造子类对象时,先执行基类的构造方法,然后执行子类的构造方法。

因为:子类对象中成员是有两部分组成的,基类继承下来的以及子类新增加的部分 。

 【注意】!!

1.若父类显式定义无参或默认的无参构造方法,在子类构造方法第一行默认有隐含的super()调用,即调用基类构造方法。    (这就是为什么上面会先访问父类的构造的原因)当然我们自己在第一行写super();也ok;例:

还有一种,只有父类或子类写了无参构造方法,另一半也会自动生成构造的。

2. 如果父类构造方法是带有参数的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的父类构造方法调用,否则编译失败。例:

正确的方式:

3. 在子类构造方法中,super(...)调用父类构造时,必须是子类构造函数中第一条语句。
4. super(...)只能在子类构造方法中出现一次,并且不能和this同时出现。(因为this();访问其他构造也要在第一行)。

4.2super和this的区别

superthis都可以在成员方法中用来访问:成员变量和调用其他的成员函数,都可以作为构造方法的第一条语句,那他们之间有什么区别呢?
相同点
1. 都是Java中的关键字
2. 只能在类的非静态方法中使用,用来访问非静态成员方法和字段
3. 在构造方法中调用别的构造时,必须是构造方法中的第一条语句,并且不能同时存在
不同点
1. this是当前对象的引用,当前对象即调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成员的引用

2. 在非静态成员方法中,this用来访问本类的方法和属性(含继承的),super用来访问父类继承下来的方法和属性
3. 在构造方法中:this(...)用于调用本类构造方法,super(...)用于调用父类构造方法,两种调用不能同时在构造方法中出现
4. 继承体系下:构造方法中一定会存在super(...)的调用,用户没有写编译器也会增加,但是this(...)用户不写则没有。

5.再谈初始化

我们回顾一下:一个类中可以定义静态代码块构造代码块(也叫实例代码块)和构造方法,他们的执行顺序是:      1.静态代码块--》2.实例代码块--》3.构造方法(具体我Java2.2这篇最后有讲)

那么,在继承体系下的执行顺序是怎么样的?

可知继承体系下:
1、父类静态代码块优先于子类静态代码块执行,且是最早执行
2、父类实例代码块和父类构造方法紧接着执行
3、子类的实例代码块和子类构造方法紧接着再执行
4、第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行

6.继承方式

在现实生活中,事物之间的关系是非常复杂,灵活多样的,比如:

但在Java中只支持以下几种继承方式:

 尽管可以持续多继承,但继承关系一般不会超过三层如果想从语法上进行限制继承, 就可以使用 final 关键字(下面会讲,final)

7.protected关键字

在类和对象章节中,为了实现封装特性,Java中引入了访问限定符,主要限定:类或者类中成员能否在类外或者其他包中被访问。

那父类中不同访问权限修饰的词,在子类中的可见性又是怎样的?

同一个包中的子类:

 不同包中的子类:

不同包中的非子类: 

 注意:父类中private成员变量虽然在子类中不能直接访问,但是也继承到子类中了。

(不能直接访问的意思是,还可以通过get和set来访问成员)

8.final 关键字

final关键可以用来修饰变量、成员方法以及类。

1. 修饰变量或字段,表示常量(即不能修改)

2. 修饰类:表示此类不能被继承 

 3. 修饰方法:表示该方法不能被重写(在下一篇多态中会讲到)

 9.继承和组合

和继承类似, 组合也是一种表达类之间关系的方式, 也是能够达到代码重用的效果。组合并没有涉及到特殊的语法(诸如 extends 这样的关键字), 仅仅是将一个类的实例作为另外一个类的字段。
继承表示对象之间是is-a的关系,比如:狗是动物,猫是动物
组合表示对象之间是has-a的关系,比如:汽车
例:汽车有轮胎、引擎、车载系统等零部件组成。

 继承则是  奔驰是车:

组合和继承都可以实现代码复用,应该使用继承还是组合,需要根据应用场景来选择,一般建议:能用组合尽量用组合。代码例子:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学编程就要猛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值