Java中的继承

         在我们的身边一直会听到继承这个概念,那么到底是什么呢?

1.继承

在我们的生活中会发现许多有关联的事物,而在编程中也是这样,所谓的继承就是对多个事物进行共性抽取,实现代码的复用。

面这两个类成员变量和方法都十分类似,我们写两个类是不是有点浪费时间呢?

我们可以通过继承写一个Animal类,让这两个类继承Animal类中成员变量和方法,达到代码的效果

1.1继承的语法

在java中如果表示类之间的继承关系,需要借助extends关键字

下面通过一些代码更好的了解继承

在Dog1类和Cat类中我们并没有去定义成员变量和eat这个方法,但是我们在父类Animal中写有。

由此可见继承是继承了父类的成员变量和方法

假如子类和父类中有相同的成员变量和方法时我们该怎么办呢?

1.2访问父类的成员变量

让我们先看一段代码

当在Dog中添加一个成员变量并且进行赋值的时候,打印的结果变了,这时我们就产生疑问了,之前打印的小黄去哪了,回答这个问题之前先说一下继承就是把父类的成员变量和方法拿过来一份,只是在idea上面没有显示,之前的小黄并没有消失,在子类当中访问这个同名的成员变量,访问的时子类自己的,优先访问子类自己的。

如果一定要访问父类的name时,那么此时我们要引入一个关键字super

1.3关键字super

针对上面的问题,我们可以通过super关键字可以解决

先看一段代码,看了代码比较好了解

打印结果多了一个小黄,至于为什么通过一个函数来打印,而不在main里面直接让对象来打印,是因为super不能用在static修饰的方法中。这点很重要。还有super访问成员变量只能访问子类从父类继承过来的成员变量。super主要作用就是访问成员变量和方法,还有一点super在当前类中使用,那么当前类一定是子类。

接下里便是super访问父类中方法

其中func1构成了重载,父类的方法也是通过super关键字来进行访问的。

接下来我们要区分this和super的区别

话不多说,先看一段代码

由图可见,当父类和子类中成员变量不同名的时候,我们也可以通过this来进行访问,是因为继承的原因,也就相当于子类有这个成员变量。

this和super的区别:

1.this进行访问的时候,不仅可以访问父类,也可以访问子类的

2.当使用this访问父类和子类同名的成员变量的时候,优先访问子类

3.super只能访问从父类继承过来的成员变量

1.4super和父子类之间的构造

关于每个类的构造函数,首先编译器会自动帮我们生成一份不带参数的构造函数,前提是我们不写构造函数,如果我们写有构造函数,编译器就自动不会生成构造函数。

子类继承父类之后,构造函数的执行顺序是什么呢?

先看代码,这样比较清楚明了。

在子类实例化对象的地方打了一个断点,当进行运行的时候,先执行父类的构造再执行自己的。

当修改父类构造方法时,子类中构造会报错,事实证明先构造父类再构造自己的。

下面是有参数的构造方法。

通过super()来执行父类的构造,有参数就填参数。

之前学习类和对象的时候this()也能进行调构造方法,但是呢this()和super()不能一起用,因为他们两个只能放在第一行。如图所示

this和super的区别:再补充一条,this()调用自己的构造方法,而super()是在子类中调用父类的构造方法。

1.5再谈初始化

我们先看一下当类没有被继承的时候,实例代码块、静态代码块和构造方法执行的顺序

代码

执行结果

我们可以看到顺序是1.静态代码块2.实例代码块(也就是普通代码块)3.构造方法。

但是有一点要注意到第二个对象实例化的时候打印结果没了静态代码块执行这一句话,是因为静态代码块在类开始被执行的时候,就执行一次,跟实例化对象的数量无关。(这一点很重要,有的面试要考)。为了更好的理解静态代码块的执行,让我们看一段代码。

代码:

执行结果:

最后的结果为5,只要类被执行起来,静态的代码块先被执行,不管它的顺序在main方法下面还是在上面都会先执行完静态代码块,再执行其他的。

以上是没有类被继承的时候,当类被继承的时候,执行顺序又是什么呢?

代码:

执行结果:

也就是对应后面数字142356。

首先,第一步是这两个类被启动的时候先执行父类的静态代码块,然后直接跳到子类的静态代码块。第二步接着实例化对象的时候,开始进入构造方法,构造方法肯定先构造父类的,但是一进入父类,就直接跳到父类的实例代码块,然后再开始执行父类的构造方法。第三步,父类的都被执行完了之后,直接回到子类的实例代码块这,最后再回到构造代码块这。(建议打个断点,逐语句的看一遍,巨清晰)

1.6继承的方式

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

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

1.7final关键字

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

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

如果一个类不想被继承的时候,那么就用final进行修饰。

为了更好的理解final,先看一段代码

你觉得第几步出错呢?

答案是第一步出错,首先,先看final修饰的是哪一个变量,这里修饰的是引用类型的变量,引用类型的变量里面存放的是@+哈希值,一个虚拟的地址(为了安全起见,它不会告诉你真正的地址)。第一步重新new的时候,要重新给array赋予新的虚拟地址,所以报错了。第二步的话,它不会进行报错,数组的内容可以进行修改,有点像const。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值