目录java
多态性是面向对象的第三大特征。ide
说实话,做为小白的我,并不太可以理解上面三个优势。随着深刻学习,理解应该会愈来愈深吧,共勉。学习
Java容许把子类对象赋值给父类的引用变量,不用作任何强制转换,系统自动完成。向上转型来自于自下而上的继承关系,子类继承父类,子类是一种特殊的父类,因此向上转型的操做实际上是情理之中的。测试
下面依照简单的代码,来试着理解向上转型的概念与好处。code
package com.my.pac14; /** * @auther Summerday */ public class DynamicBinding { //Object是全部类的超类,根据向上转型,该方法能够接受任何类型的对象 public static void test(Object x) { System.out.println(x.toString()); } public static void main(String[] args) { test(new PrimaryStudent());//Student test(new Student());//Student test(new Person());//Person test(new Object());//java.lang.Object@1b6d3586 } } class Person extends Object { @Override public String toString() { return "Person"; } } class Student extends Person { @Override public String toString() { return "Student"; } } class PrimaryStudent extends Student { }
Object
类型的对象,并调用该对象的toString()
方法。public static void test(Object x) { System.out.println(x.toString()); }
public static void main(String[] args) { test(new PrimaryStudent());//Student test(new Student());//Student test(new Person());//Person test(new Object());//java.lang.Object@1b6d3586 }
Object x = new Student();
举个简单的例子,假设人类能够分为不少不少种,咱们能够说学生是人类的一种,却不能说人类是学生的一种。向上转型必定程度上容许子类扩展超类的部分丢失,经过父类引用变量只能调用父类中的方法来实现,咱们去操做人类的时候,只能在人类具备的行为属性中作选择,而不能直接以学生类的标准去操做它,由于咱们并不知道他是哪一类,万一不是学生呢,对吧,用人类总没错,由于我人类有的东西,你学生类必定有。这就是我所理解的向上转型。对象
若是没有向上转型机制,咱们想要达到原来的效果,就须要增长许多重载的test
方法,这样就显得过于繁琐。若是要增长相似test()
的方法或者添加从Object
导出的新类,还会作更多复杂的操做,不利于扩展,不可取不可取。继承
// 原来的状况:须要建立不少不少的测试方法。 public static void test(Object x) { System.out.println(x.toString()); } public static void test(Person x) { System.out.println(x.toString()); } public static void test(Student x) { System.out.println(x.toString()); } public static void test(PrimaryStudent x) { System.out.println(x.toString()); }
多态的存在正好解决了这个棘手的问题,为了利于扩展,只须要写一个仅接收基类做为参数的简单方法,无论导出类如何,在运行时自动选择调用对应导出类的方法,真的就很舒服。接口
那么,编译器又是如何肯定应该调用哪一个方法呢?这就涉及到所谓的“绑定”啦,这个呢,咱们在下片总结。编译器
参考书籍:《Thinking in Java》it