目录:
一、继承:
为什么面向对象中有继承的概念?那么继承又是什么,继承又有什么作用呢?在我们生活中啊,也存在继承的关系,比如:你父母的财产由你“继承”。那在面向对象中,继承的概念又是什么、又有什么作用呢?咱么往下看:
1、继承的概念:
在看继承的概念之前,咱们先来看几段代码:
那么继承的机制: 是面向对象里面是代码可以复用的重要手段。它允许在保持原有的类的特性下,进行扩展,增加一些新的功能,这个新的类叫做 派生类/子类,原有的叫做 父类/基类/超类。继承主要解决的是:对于共性的抽取,进而实现复用。
比如我上面的Dog和Cat它们是不是都叫做动物,所以得到这样的结果: 继承之后呢,子类可以复用父类的成员,子类只需要关心子类中自己新添加的成员即可。
2、继承的语法:
那么我们知道了继承的概念,但是我们要如何只用代码来进行继承的呢?我们接着往下看:
通过这个例子,我们可以得出继承的语法如何定义,并且需要用到 extends 关键字。
修饰符 class 子类/派生类 extends 父类/基类/超类 { //代码
}
这里有一些注意事项:子类在继承父类之后,必须要添加一些自己独有的成员,体现出与父类的不同,否则就没有必要继承类了。
在上面我们了解了如何继承,那么在子类中呢,是否可以访问父类继承下来的成员呢?那么下面我们来看看,如何实现的。
3、父类成员的访问:
1)、子类中访问父类的成员变量:
(1)、子类与父类不存在同名的成员变量:
在成员变量不同名的情况下,优先访问自己的,自己没有就访问父类的,父类没有就会报错。
(2)、 子类与父类存在同名的成员变量:
成员变量的访问,遵循着就近原则,自己有就用自己的,如果没有就访问父类的,但是当父类也没有的时候,就会报错。当,子类与父类同名是时,则优先访问自己的。
但是呢我们还是想访问父类的成员变量,在同名的情况下,那么我们要如何做到呢?我们需要用到 super关键字 ,不要着急,我们后面马上就会讲解。
2)、 子类中访问父类的成员方法:
(1)、子类与父类不存在同名的成员方法:
在成员方法不同名的情况下,优先访问自己的,自己没有就访问父类的,父类没有就会报错。
(2)、子类与父类存在同名的成员方法:
我们可以看到在同名的情况下,优先访问子类的成员变量。还有一种情况:
在子类和父类方法名相同时,如果父类和子类的同名方法的参数列表不同,也就是发生了重载,根据情况调用,也是在子类中找,没有再在父类中找,再没有就报错。
那么我们接下来就讲解如何在子类和父类的成员同名是,如何在子类中调用父类的成员。
4、super关键字:
在Java中提供了 super 关键字,该关键字的作用是:在子类中访问父类的成员。
注意: 1、super关键字只能在非静态方法中使用。
2、在子类的方法中,访问父类的成员。
当然对于 super 来说不可能只有只几种用法,咱们在后面再继续扩展 super 的用法。
5、子类的构造方法:
我们不可能每次都是用创建对象,在引用成员变量来给其赋值,那么我们要如何才能像类一样使用构造方法进行初始化操作呢?直接看代码:
这样是一种写法,还有一种是默认的构造方法,比如:
对于 super 的方法必须是在子类构造方法中的第一句。如果不是第一句就会报错:
注意:super(.....)只能在子类构造方法中只能出现一次,并且不能和 this() 同时出现。
6、继承里的代码块执行顺序: 可知步骤:1、先打印父类的静态后打印子类的静态,它们为最先打印,而且只打印一次。
2、父类的实例代码块和构造方法。
3、子类的实例代码块和构造方法。
6、protected关键字:
我们在类和对象当中呢,介绍了 public 、default、private关键字,那么我们今天介绍的是,最后一个访问修饰限定符的关键字:protected。
我们再开看看这张图,protected是对于不同包的子类,咱们直接看代码:
我们对于访问修饰限定符的使用呢·,不要把所有的;成员变量都设置为 private 所有的成员方法都设置为public, 这是对访问权限的滥用,所以我们在使用是要认真思考是用什么修饰符。
7、继承的方式:
对于继承来说呢,有很多的继承方式,比如:单继承、多层继承、不同类继承同一类、多继承(Java不支持多继承)。我们来一一介绍:
1)、单继承:
单继承是很好理解的,直接看代码就可以知道,就如同它的字面意思一样:
2)、多层继承:
3)、不同类继承同一类:
4)、多继承(Java不支持多继承):
这样会使得类之间的关系变得很复杂。Java中不支持使用多继承。
我们一般不希望代码出现超过三层的继承关系。
当我们写代码的时候,在继承时,我们到一个子类之后不想在被继承了,那么我们用代码要如何实现这个想法呢?在这里呢,我们需要用到的是 final 关键字。
8 、final关键字:
final关键字可以用来修饰变量、方法和类。
1)、final修饰变量:
可知:被 final 修饰的变量,会变成常量,不可再修改。
2)、final修饰方法:
表示该方法不可被重写,这个问题,我们会在后面进行讲解。
3)、final修饰类:
被 final 修饰的类不会再被继承。
9、继承与组合:
继承与对象之间是 is-a 的关系。
组合与对象之间是 has-a 的关系。
继承与对象我们了解了,那么组合和对象又是什么呢?我们来举一个例子:比如电脑。
看代码:
组合是将一个类的实例作为另一个类的字段。
二、多态:
1、多态的概念:
概念:就是当去完成某个动作时呢,不同的对象会有不同状态,就称为多态。
比如呢:对于吃东西这个动作,对于小狗来说是吃狗粮,对于小猫来说是吃猫粮。 这就产生了多态。
2、实现多态的条件:
1、必须要在继承的条件下。
2、子类必须要重写父类的方法。
3、需要用父类进行引用来调用重写的方法。
咱们来看一个例子:
这里面呢有很多的知识点,我们接下来再一一讲解,相信讲完之后呢,就会对于这个代码有了很大的了解了 。
首先咱们来看重写
3、重写:
构成重写的条件是:1、方法名相同。
2、返回值相同。
3、参数列表一致。
但是对子类重写父类的方法的时候,被重写的方法的返回值可以不同,但是必须构成父子关系。
还有对于访问修饰限定符来说子类的访问修饰限定符不能低于父类的。
注意的是当父类被private 和 static修饰的时候呢,不能被重写。
1)、静态绑定:
在编译时,根据用户所传递的实参类型就确定了具体调用哪个方法。比如重载。
2)、动态绑定:
在编译时,不能确定方法的行为,需要等到程序运行时,才能够确定具体调用那个类的方法。
4、向上转型和向下转型:
1)、向上转型:
就是创建一个子类对象,当成其父类对象来使用。
父类类型 对象名 = new 子类类型;
有三种方法:
1、直接赋值:
2、方法的传参:
3、作为方法的返回值:
向上转型的优点:可以使代码更加的灵活。
向上转型的缺点:不能使用子类的方法。
2)、向下转型:
在我们向上转型之后呢,我们就无法使用子类的方法了,但是呢有时候我们在向上转型之后呢,又想使用子类的方法,那这时候就需要用到,向下转型,就是把父类转成子类。
但是呢,向下转型是一个不安全的动作,比如:你的Animal由Dog类向上转型,当你向下转型的时候,你给转到Cat类,就是不对的,会报错。
那么我们要如何去向下转型呢?看代码:
那么我们要如何避免这种情况的发生呢?这时Java中引入了一个关键字:instanceof 这个关键字的表达式为boolean类型,咱们再看看如何使用的:
5、多态的优缺点:
1、可以避免大量的使用 if—else 语句:
在没有学习多态时,要实现这种代码需要用到很多的 if—else 语句。我们学习多态后可以变成这种写法:
2、可扩展能力变强。
缺点:
会是代码运行效率降低。
总结:
这次的继承与多态就结束了,下次我们开始介绍接口了,那么让我们期待下次的相遇,拜拜~~