Java中的继承

21 阅读3分钟

继承的概念

image.png

什么时候使用继承

image.png 只有单继承没有多继承

继承特点

image.png

image.png

小案例思考

image.png

image.png

子类到底能继承父类的内容

image.png 构造方法 都不能 成员变量 都能 成员方法 非私有能 私有不能

构造方法能继承的原因

image.png 这个是不能继承的,因为假如继承过来之后类名与方法名不一致

成员变量的继承内春原理

image.png 第一句话是在右边方法区加载这么多字节码文件,本类,子类,父类三种

image.png首先是左边,在栈内存中加载一个zi 对象,开辟出一个小的空间,为了储存z的地址值

image.png 右边new一个新的空间,因为有子类和父类,所以开辟了两个空间,不过地址都是一样的

此时如下图这一句代码相当于执行完了

image.png 剩下的几行就是打印地址,以及赋值 执行完后main方法出栈

image.png 此时右边的堆内存里的数据也没用了,成了垃圾

image.png

成员变量的继承原理有private类型的

image.png 整体与上次相似 因为有private修饰,所以会报错 虽然能继承下来,在右边的堆内存里存在,但是因为被private修饰所以不能直接使用

成员方法继承的内存图

image.png 刚加载第一行的时候方法区加载字节码文件,因为object是所有方法的父类,oboject虚方法表里有5个方法,fu方法里有一个fuShow1方法是符合的,不是private,不是static,不是final.

image.png 现在是正常的new出一个空间,main这边储存地址值,都与之前的相同

image.png 最后一个fushow2,因为是private修饰,所以在虚方法表里无法找到,所以是报错了

继承中成员变量的访问特点

就近原则,谁离的近谁就用谁

image.png 用this,super关键字,可以指定用谁 子类中只能用一个super,super是到父类的成员变量中找

如果直接打印变量,会先在局部变量中找,再到本类成员变量中找,再到父类中找

image.png

image.png

方法的重写

image.png 方法重写就是父类不好用,没能实现子类的需求,子类用同样的名字重写了一个方法。就是方法重写

方法重写的实质

image.png 方法的重写,首先C类虚方法表里有两个方法,B中有同名的method2,那么在B类中method2就发生了覆盖,将C类中的method进行了替换

方法重写的注意事项

image.png 这个截图主要是解释第三项, 例如animal是dog和cat的父类,所以animal大于dog和cat,以此来判断返回类型子类必须小于父类

如果父类中的方法无法满足子类的需求,那么需要我们重写方法,重写的时候父类中有的代码,可以用super来调用一下,更加的方便

总结

image.png

继承中构造方法的访问特点

image.png 通过例子具体的理解一下

image.png 首先创建学生对象,到学生的那个javabeen中后,suoper()又调用了父类的无参构造(没有参数的那个构造方法),最后才执行子类student中语句

image.png 结果便是如此

假如创建学生对象时就是带参数的 那么在子类中就要写上带参构造,才能不报错

image.png 如果是有参数的,那么访问的也一定要是有参数的方法

总结

image.png

This,super使用汇总

image.png 左边的this是隐藏,不用写就存在,写上去更加的直观,相当于把右边创建的那个s的地址值,传到了this,在左边this就是s.

image.png

image.png This()的用法,用在无参的方法之中,可以跳转到有参的方法