一、继承
我们在创建一些类时,会发现他们之间存在相同的属性和方法,如设计一个动物表示类:
像这样的代码就存在了大量的冗余代码,仔细分析会发现这三个类有相同的eat方法和相同的name属性。从逻辑上分析,Cat和Bird都是Animal,我们就可以让两者继承Animal类,这样Animal就是被继承的类,也叫父类,基类或者超类,而Bird和Cat叫子类或者派生类。他们之间就构成了继承关系。
继承的语法规则:
1.继承使用extends指定父类。
2.在Java中,一个子类只能继承一个父类。
3.子类会继承父类所有public的方法和字段,而对于父类中所有private的方法和字段是无法访问的。
4.子类可以用super关键字得到父类实例的引用。
上面的代码使用继承改编后如下:
通过上述代码我们可以看出继承可以使代码达到重用的效果。
但如果把name改成private时,子类就无法访问父类。
如图:
但是如果使用public就违背了oop语言三大特性之一:封装,所以把字段改为protected是最佳的解决办法。看如下代码
分析上述代码报错的原因可以知道其他包中的类,对于protected修饰的字段和方法不可以访问,对于类的调用者来说,protected修饰的字段和方法也是不可以访问的。
此外,如果用final关键字修饰类,这个类也是不能被继承的。看如下代码:
二、组合
和继承类似,组合也能达到代码重用的效果。组合表示has- a,继承表示is- a,如用一个类表示学校,学校里有学生也有老师,示例如下:
三、多态
动态绑定也叫运行时绑定即多态,发生动态绑定的前提是:
1.向上转型,父类引用子类对象
向上转型的三种情况:
(1)直接赋值
(2)方法传参
(3)方法返回
2.子类和父类有同名的覆盖方法
3.通过父类的引用,调用该重写方法
如下就是动态绑定的实例:
运行结果:
那么使用多态有什么好处呢?
1.降低了类的调用者对类的使用成本
2.降低了圈复杂度,避免了使用大量的if-else
3.可扩展能力更强
注意super和this的区别,super表示父类对象的引用,this表示当前对象的引用。
四、抽象类
为了使代码能够被继承,需要创造抽象类。比如创造一个抽象类表示形状:
抽象类不能被实例化,抽象方法也不能是private,抽象类中也可以包含其他非抽象类方法及字段。
五、接口
接口是抽象类的更进一步,包含的方法都是抽象方法,字段只能包含静态常量。一个类可以继承一个类,并且同时实现多个接口。如:
(1)接口使用interface来实现
(2)接口中的方法一定是抽象方法,因此可以省略abstract
(3)接口中的方法一定是public,因此可以省略public
(4)接口不能单独被实例化
(5)接口可以继承一个接口
刚涉及Java语言的面向对象编程,还有很多深邃的东西没有挖掘出来,有待后续。
来源:51CTO
作者:mb5de7ca231ffe3
链接:https://blog.51cto.com/14632675/2485191