当对象变量e引用A对象时,e.getnum()调用的是A类的getnum方法,当e引用B对象时,e.getnum()调用的是B类的getnum方法
一个对象变量(如e)可以指示多种实际类型的现象称为多态(polymorphism),在运行时能够自动地选择适当的方法,称为动态绑定(dynamic binding)
有一个简单的规则可以判断是否应该将数据设计为继承关系,这就是“is-a”规则,他指出子类的每个对象也是超类的对象。“is-a”规则的另一种表述是替换原则,它指出程序中出现超类对象的任何地方都可以使用子类对象替换
在java中,对象变量是多态的(polymorphic),一个A类型的变量既可以引用A类型的对象,也可以引用A类型的任何一个子类的对象
使用如下
package dzy;
public class Animal {
public void what() {
System.out.println("I'm animal");
}
}
package dzy;
public class Dog extends Animal {
public void what() {
System.out.println("I'm dog");
}
}
package dzy;
public class Pig extends Animal{
public void what() {
System.out.println("I'm pig");
}
}
package dzy;
public class Text {
public static void main(String[] args) {
Animal animal = new Dog();
// 调用的是dog的what
animal.what();
Animal animal2 = new Pig();
// 调用的是pig的what
animal2.what();
}
}
输出结果
二、优点提高了代码的拓展性,使用父类类型作为方法形式参数,传递子类对象给方法,进行方法的调用
package dzy;
public class Text {
public static void main(String[] args) {
Dog animal = new Dog();
Pig animal2 = new Pig();
animal.what();
animal2.what();
//我们可以使用animalWhat直接替代了不同动物
animalWhat(animal);
animalWhat(animal2);
}
public static void animalWhat(Animal animal){
animal.what();
}
}
输出结果
三、局限对于某个子类有些独有的功能方法时,此时我们的多态的写法就无法访问子类独有功能了
重新定义pig
package dzy;
public class Pig extends Animal {
public void what() {
System.out.println("I'm pig");
}
public void charactor() {
System.out.println("I'm so so big");
}
}
package dzy;
public class Text {
public static void main(String[] args) {
Animal animal = new Pig();
animal.what(); //可以运行
animal.charactor(); //报错
}
}



