方法的重写和重载分别体现了动态多态和静态多态。
将多态,这一Java核心特性再次做一个总结:
1、静态多态,程序健壮性的一个体现
举例:比较两个数的大小,类型可能是short、int、long、float等类型,如果你建立4个不同名字的方法,那么对于该方法的调用者来说,无疑是不便利的,当然你可以为每个方法起一个方法名,如:maxShort(short a, short b)、maxInt(int a, int b)等,但是终究没有我只写几个同名的max(short a, short b)、max(int a, int b)方法对调用者更方便吧?如此这般,调用者只要用就好了,具体调用哪个max方法,由编译器在编译期间根据参数类型的不同去决定!
public class OverLoadDemo {
public static void main(String[] args) {
max(3, 4);
max(3.0, 4.0);
}
static void max(short a, short b) {
System.out.println(a > b ? a : b);
}
static void max(int a, int b) {
System.out.println(a > b ? a : b);
}
static void max(float a, float b) {
System.out.println(a > b ? a : b);
}
static void max(double a, double b) {
System.out.println(a > b ? a : b);
}
}
2、动态多态,程序可扩展性的良好体现
举例:一位女士要养宠物。若女士现在要养一个新宠物Bird,那么这种动态多态机制可以使得我们完全不去修改Lady类,即使再增加多少种宠物都是一样的,再者在Lady类中我们完全不用使用instance of去判断这个实例是哪个特定类Cat或者是Dog等,Java运行时系统会根据具体调用enjoy方法的对象具体是哪个来确定调用的是哪个类中的方法。
动态多态机制的前提有1、存在继承关系;2、要有子类重写父类方法;3、父类引用指向子类对象。当然也可以是接口和实现类。
public class Test {
public static void main(String[] args) {
Cat c = new Cat("mimi", "yellow");
Dog d = new Dog("doudou", "white");
Lady lady1 = new Lady("lady1", c);
Lady lady2 = new Lady("lady2", d);
// Lady lady3 = new Lady("lady3", new Bird("freedom", "red"));
lady1.myPetEnjoy();
lady2.myPetEnjoy();
// lady3.myPetEnjoy();
}
}
class Animal {
String name;
Animal(String name){
this.name = name;
}
void enjoy(){
System.out.println("大叫...");
}
}
class Cat extends Animal {
private String eyeColor;
Cat(String name, String eyeColor){
super(name);
this.eyeColor = eyeColor;
}
void enjoy(){
System.out.println("喵喵...");
}
}
class Dog extends Animal {
private String furColor;
Dog(String name, String furColor){
super(name);
this.furColor = furColor;
}
void enjoy(){
System.out.println("旺旺...");
}
}
class Bird extends Animal {
private String featherColor;
Bird(String name, String featherColor) {
super(name);
this.featherColor = featherColor;
}
void enjoy(){
System.out.println("叽叽喳喳...");
}
}
class Lady {
private String name;
private Animal pet;
Lady(String name, Animal pet){
this.name = name;
this.pet = pet;
}
void myPetEnjoy(){
pet.enjoy();
}
}