多态作为面向对象的三大特性之一,她分为编译型多态和运行时多态。其中编译型多态是静态的(静态绑定),即在编译时已经确立了调用哪个方法,主要通过方法重载来实现;运行时多态是动态的(动态绑定),即在程序运行时才能确定调用哪个方法,主要通过方法重写来实现。
重载
同一类中,方法名相同,参数列表不同的函数之间称作重载参数列表不同指的是:方法的参数个数,参数类型,参数顺序中任意一个的不同,不包括方法的返回类型的不同
重载原则:
1、方法必须在同一个类中
2、方法名必须相同,参数列表必须不同
即以下方法之间构成重载:
public class Person {
private String name = "";
private int age;
public void printPersonInfo() {}
public void printPersonInfo(String name) {
System.out.println("姓名:" + name);
}
public void printPersonInfo(int age) {
System.out.println("年龄:" + age);
}
public void printPersonInfo(String name, int age) {
System.out.println("姓名:"+name+";年龄:" + age);
}
}
但以下方法之间不构成方法重载,因为方法之间方法名相同,参数列表也相同,只是返回值和访问控制符不同。
public class Person {
public void printPersonInfo(String name) {
System.out.println("姓名:" + name);
}
private String printPersonInfo(String name) {
System.out.println("姓名:" + name);
}
}
重写
父类与子类中的方法的方法名相同,参数列表和返回值也相同的函数之间构成重写,即子类方法对父类方法的重写。重写原则:
1、重写必须在父子类之间,即子类重写父类的方法
2、子类方法的方法名,参数列表和返回值必须与父类方法相同
3、子类重写父类方法时,子类方法的访问权限不能比父类方法的访问权限低。
4、父类final方法,构造方法,私有方法不能被重写(父子类不在同一包时,子类不能重写父类的默认方法)
5、父类static方法不能被重写,只能被重新定义(static方法属于类方法不属于任何一个对象)
如下,子类对父类方法的重写:
public class Person {
protected void fun1(String name) {
System.out.println("姓名:" + name);
}
public static void fun2(){}
}
public class Manager extends Person {
//重写父类fun1()方法,访问控制符不能比父类的protected权限小,返回值,方法名和参数列表必须与父类一致
public void fun1(String name) {
System.out.println("姓名:" + name);
}
//方法的重新定义,而不是重写父类的fun2()方法
public static void fun2(){}
}