继承【Java版】详细讲解
一、使用继承的原因
在代码编写的过程当中,往往会出现大量代码重复的问题,导致代码非常冗余,继承就是很好的处理了这样的问题,将每一个类当中重复的部分进行抽取,封装最终达到代码的复用。
二、继承的具体使用
如果他的关系是一个is a的关系;就可以使用继承的方式
1.两个类相互影响的条件
小狗的类(相关性质):
小猫的类(相关性质):
从上述可以看到,有部分是重复的,这部分都是满足动物的特性的;
所以可以将这一部分抽取出来,从而让之后的动物继承这部分实现代码的复用:
2.单独提取
需要使用到一个关键字:extends
这两个部分都是满足动物的属性的,所以可以进行抽取将这部分放在动物这一个类当中
整体的代码就如上述图片所示
此时的这个关系叫做继承;
重点词汇讲解:
cat/dog:相当于是子类/派生类
animal:相当于是父类/基类/超类
(有些东西是可以不用重复书写的)
注意事情:建议的是一个java文件当中只有一个类;会使代码更加清晰
三、细节
父类与子类之间的成员变量,成员方法以及抽取出来之后怎样进行的区分,怎样进行的正确的打印
我们新建一个类进行测试:
此时我们可以看到这两个当中的变量是没有任何冲突的,所以之间是直接可以不影响相互进行访问的
1.子类当中怎样访问父类的方法——直接进行访问
最终是可以直接进行打印的
对上述代码的解释;为什么可以打印出来那样的结果——堆栈图;
上面的两个是从父类当中继承过来的
下面的是是自己的
2.子类当中有与父类同名的变量
增加了一个a变量,最终的结果为:
打印的是子类自己的结果(体现的是就近原则)
总结:当父类与子类有相同的变量时,就会使用的是子类自己的值:
那怎样可以访问父类的值使用supper关键字
3. 如果方法之间父类与子类的方法名称相同(构成了重载)
如果在调用时,传的是char数据则会调用的就是父类的方法;如果没有就是子类的(都是相同的,根据参数进行匹配)——方法也是符合的就近原则
如果就是想要访问父类的方法,也是相同的,采用super的操作进行访问
继承是可以一直继承的,但是super只能指代当前类的父类,不能指代父类的父类
super
有三种用法:
1.代表父类的成员变量
2.代表父类的方法
3.构造方法中的使用(帮助调用父类的构造方法)
所以此时就会打印出来父类的值
所以就是可以认为整体上是this,但是同名就是优先自己
但是如果都没有,就会发生编译错误
this与super只能在非静态的方法才可以使用(super与this是依靠类来存在的)
重点讲解第三种:构造方法当中的使用(在构造方法中必须要在第一行)
当父类有构造方法后,子类一定要有构造方法
父类当中使用构造方法,Animal中一个;
但是为什么?
当子类继承父类之后,子类需要显示的调用父类的构造方法,要先帮助父类的成员进行初始化;
所以必须显示的调用父类构造方法,所以此时super的作用:调用了父类当中的构造方法
换句话说;super()与this()是不能共存的
如果说在没有构造方法的时候:编译器是会自己进行提供的;只要写了任何构造方法,编译器都不会进行提供
注意:
1. 若父类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的super()调用,即调用基类构造方法
2. 如果父类构造方法是带有参数的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的父类构造方法调用,否则编译失败。
3. 在子类构造方法中,super(...)调用父类构造时,必须是子类构造函数中第一条语句。
4. super(...)只能在子类构造方法中出现一次,并且不能和this同时出现