Java多态
在java语言中,多态性体现在两个方面:由方法overload实现的静态多态性(编译时多态)和方法override实现的动态多态性(运行时多态)。
1.编译时多态
在编译阶段,具体调用哪个被overload的方法,编译器会根据参数的不同来静态确定调用相应的方法。
2.运行时多态
由于子类继承了父类所有的属性(私有的除外),所以子类对象可以作为父类对象使用。程序中凡是使用父类对象的地方,都可以用子类对象来代替。一个对象可以通过引用子类的实例来调用子类的方法。
override方法的调用原则:java运行时系统根据调用该方法的实例,来决定调用哪个方法。对子类的一个实例,如果子类override了父类的方法,则运行时系统调用子类的方法;如果子类继承了父类的方法(未override),则运行时系统调用父类的方法。
在例3-6中,父类对象a引用的是子类的实例,所以,java运行时调用子类B的callme方法。
import java.io.*;
class A{
void callme( ) {
System.out.println("Inside A''s callme()method");
}
}
class B extends A{
void callme( ) {
System.out.println("Inside B''s callme() Method");
}
}
public class Dispatch{
public static void main(String args[]) {
A a=new B();
a.callme( );
}
}
3.方法override时应遵循的原则:
l 子类中override的方法和父类中被override的方法要具有相同的名字,相同的参数表和相同的返回类型,只是函数体和限定类型不同。
l override的方法不能比被override的方法有更严格的访问权限(可以相同)。
l override的方法不能比被override的方法产生更多的例外。
4.方法overload时应遵循的原则:
l Overload的方法必须是相同的名字
l 方法的参数必须不同,或者是参数的个数不同,或者是参数类型不同
l 返回类型不能用来唯一区分overload的方法