面向对象的三大特征我们已经学了封装,接下来我们学习继承
什么是继承,继承的好处
我在这里也说一下我的理解,因为在代码中每个类中都会有很多相同的变量和行为,我在这里打个比方就比如男生和女生这两个类就有名字和年龄这些变量,然后如果每次创建这两个类的时候都需要写两边这些变量,就显得代码很冗余,复用性差,所以java就退出来了继承。
继承就是在创建一个父类里面有子类共同拥有的变量和行为,提高复习性。
继承要用extends连接表示和父类的关系
class 父类 {
...
}
class 子类 extends 父类 {
...
}
同时什么时候用继承也是有说法的要满足有共同的内容并满足是父类的一种。打个比方拿Person当父类然后子类是Boy和Cat这个显然是不行的因为Cat不是人。
继承的特点
java只支持单继承,不支持多继承,但是可以多层继承,而且每一个java类都一个或者简单继承的Object父类
子级到底能继承父级中哪些内容呢?
我们先讲构造方法
下面是一个父类一个子类,如果子类继承了父类的构造方法,那使用构造方法的时候类名都不一样怎么使用啊。使用构造方法怎么样都是继承不了的
接下来我们讲成员变量 ,不过是public或者private都是继承成员变量的。我们先讲public的情况,当Fu是父类Zi是子类的时候,下面的代码是先new了一个Zi子类,然后java会在方法区生成对应的子类字节码文件,因为是继承了父类所以他也会生成父类的字节码文件,在这里其实还会生成一个Object的字节码文件,因为我们上面讲了Object是一个最大的父类。然后再在推内存中创建一个空间里面有子类自己的成员变量和成员方法也有继承父类的成员变量和成员方法。然后因为父类的修饰符是public所以把父类中的变量进行赋值。(补充一下我在加载字节码文件中如果有父类一定是先加载父类的字节码文件)
接下来我们讲private修饰父类的成员变量,因为是用的private修饰了父类的成员变量,子类是访问不到的
接下来我们讲一下成员方法的继承,在这里就有一个新的知识点就是虚方法表,父类会创建一个虚方法表,把虚方法放到里面,然后传给子类,子类就可以调用虚方法里面的方法,虚方法是不能有private和static和final修饰的方法。
下面这个是虚方法的内存图
继承中成员变量的访问特点
要是在子类中声明了一个和父类一样的变量那子类会就近原则访问自己类下的变量
在方法里面可以通过this访问类下面的变量,通过super来访问父类的变量。
小结
继承中成员方法的访问特点
成员变量也要是就近原则。
继承中构造方法的访问特点
-
构造方法的名字是与类名一致的。所以子类是无法继承父类构造方法的。
-
构造方法的作用是初始化对象成员变量数据的。所以子类的初始化过程中,必须先执行父类的初始化动作。子类的构造方法中默认有一个
super()
,表示调用父类的构造方法,父类成员变量初始化后,才可以给子类使用。(先有爸爸,才能有儿子)
在子类中所以的构造方法默认会先访问父类中的无参构造,在执行自己,因为要先初始化父类的值,子类才能继承父类的值
下面的这个代码是在子类执行父类的有参构造。
小结
this和super的使用总结
this是表示方法调用者的地址值
我看到课程中后面讲的this在jvm虚拟机中的运行,我自己也不是很理解,要是有大佬想了解的话可以去看黑马阿伟的java上部中的128集
super和this完整的用法如下,其中this,super访问成员我们已经接触过了。
this.成员变量 -- 本类的
super.成员变量 -- 父类的
this.成员方法名() -- 本类的
super.成员方法名() -- 父类的
接下来我们使用调用构造方法格式:
super(...) -- 调用父类的构造方法,根据参数匹配确认
this(...) -- 调用本类的其他构造方法,根据参数匹配确认
在这里要注意在构造方法里面调用构造方法的时候要在第一行 ,而且一个对象就你一个构造函数里面只能再调用一次构造函数。