tags: Java基础
Java的继承和多态怎么理解?
Java是面向对象的语言,拥有面向对象的三大特性
- 封装
- 继承
- 多态
在设计Java对象的时候我们就可以很清晰的体验到了封装性。那么继承和多态怎么理解呢??为啥要把它俩放在一起呢???
在设计Java对象的时候,按照规范我们都是将Java对象设计成“职责分明”的。现在的问题就是,我们的Java对象可能会变得非常非常多,比如:猫、狗、猴子、猪、羊等等等对象。
但是又要为它们每一个设置对应的名字、年龄、动作。
这就会出现非常多的冗余代码了,那现在我们可以用一个“父亲”把它们通用的数据管理起来。那么只要它们是这个“父亲"的儿子,那么就默认有这么一些通用的属性了。
- 这就避免了重复的代码在不同类中出现了。
继承就是这么一回事,非常容易理解。那么多态呢??
刚才已经说了我们可以使用”父亲“来把它们一些通用的属性、行为管理起来。只要它们是这个”父亲“的儿子,那么就拥有这些通用的属性。那么父亲是不是与儿子大呢??
- 答案是无疑的,无论是猫、狗、猪。它们都是动物(父亲)
那么,我们就可以使用动物变量来接收他们了。
那我们用动物变量来接收他们,有什么好处呢???看下面的代码:
public Test{
public eatFood(Cat cat ){
cat.eat()
}
public eatFood(Dog dog){
dog.eat()
}
}
复制代码
如果我们没有使用多态的话,那么需要**调用对象的方法就要为其传递不同的参数。**上面的代码没有毛病,是很正常的。但如果我们使用了多态的话,代码会变得十分优雅。
public Test{
public eatFood(Animal animal ){
animal.eat()
}
}
复制代码
上面的代码,会根据传递进来不同的对象类型,从而调用不同对象的方法!!!
- 也就是说:如果传递进来的是Dog,那么内部会调用dog.eat()
- 如果传递进来的是Cat,那么内部就会调用cat.eat()
Java内部会根据实际引用的对象类型调用不同的方法!在运行时能够自动地选择调用哪个方法的想象称之为动态绑定!
方法调用的过程是这样子的:
- 编译器查看对象声明的类型和方法名
- 查看调用方法提供的参数类型
- 如果是private、statics、final方法那么就静态绑定调用,与之对应的就是动态绑定!
- 当程序运行时,虚拟机会调用与参数实际类型最合适的那个类的方法!
也就是说,调用对象中的哪一个方法是由实际类型参数决定的。先有继承后有多态的特性。
如果您觉得这篇文章帮助到了您,可以给作者一点鼓励