前面我们讲了Java语言中的类和对象,以及继承、接口的概念与使用方法,本期继续讨论Java面向对象编程中一个经典的特性,也是最重要的,多态性(Polymorphism)。
简单来说,多态性是指类的方法/运行特性通过不同的实现方式可以表现为多种形态,以提供类中成员设计的灵活性和方法执行的多样性。这里再回顾一下“重载”(Overload)的概念,重载的最终效果就是在某个类中,调用同一个方法名称,却可以根据传入参数的不同而得到不同的处理结果,这其实就是多态性的一种体现。
实际上,多态性,还有其他体现方式,典型的有“复写”(或者叫“覆盖”,Override),派生类通过重写超类定义的方法,达到不同的的效果。
换一种说法,统一的函数/接口,可以隐藏不同的实现,这样使得可扩展性和可维护性更好。
下面根据具体程序来说明。我们先定义Person类及其派生类Engineer,如下。
class Person {
publicvoid write() {
System.out.println("1.Person{write()}");
}
publicvoid talk() {
System.out.println("2.Person{talk()}");
}
}
// Engineer 类扩展自 Person 类,也就继承了 Person 类中的 write ()、talk ()方法
class Engineer extends Person {
// 在这里复写了 Person 类中的 write()方法
publicvoid write() {
System.out.println("3.Engineer{write()}");
}
publicvoid talk() {
System.out.println("4.Engineer{talk()}");
}
}
执行下面的实例化和write、talk方法调用:
Person person = new Engineer();
person.write();
person.talk();
输出结果为:
3.Engineer{write()}
4.Engineer{talk()}
为什么不是1.Person{write()}和2.Person{talk()}呢?
进一步分析输出结果可以发现, person是超类Person实例化之后的一个对象,但调用其write()方法的时候并没有调用其本身的 write()方法,而是调用了派生类中被复写(覆盖)了的 write ()方法。
之所以会产生这样的结果,最根本的原因就是因为超类对象并非由其本身的类进行实例化,而是通过派生类实例化创建产生,这里的超类对象所实现的方法,例如write()和talk(),与原先在超类中实现的并不一样,这就是所谓的对象的多态性,即派生类的实例化对象可以转换为父类实例化对象。在Android编程中,多态性用得比较多,具体在后续可以通过实际的应用程序加深理解。
欢迎转载,转载说明出处即可!
微价值网(公号vjiazhi),专注移动互联网、App推广、盈利以及Android/iOS等技术基础培训。
我们的微价值,就是你的大价值!