把子类对象赋值给父类的对象变量的情况称为向上转型,向上转型是自动进行的,无需开发人员干预。此时的父类对象变量只可以访问父类中声明的成员,子类所特有的部分被隐藏。
如下an2.getEyesColor();这样写是会报出异常的,此时的父类变量an2不能访问子类Dog2中的方法。
而多态方法是指:
方法的多态是基于方法覆盖和动态绑定机制的。也就是在对象变量上调用覆盖方法,具体调用的是子类中的方法还是父类中的方法,由运行时绑定决定,不是由声明对象变量时的类型决定。如下示例代码,控制台输出结果为:
package _4_5.Override.多态; public class MethodPolymorphismTest { public static void main(String[] args) { Animal2 an = new Animal2("啥动物"); System.out.println(an.getBark());// 调用多态方法 Animal2 an2 = new Dog2("小黑狗", "黑色");// 向上转型 System.out.println(an2.getBark());// 调用多态方法 Animal2 an3 = new Cat2("蓝猫", "蓝色");// 向上转型 System.out.println(an3.getBark());// 调用多态方法 } static class Animal2 { private String name; public Animal2(String name) { this.name = name; } public String getName() { return name; } public String getBark(){//获取动物的叫声 return "叫声。。。。"; } } static class Cat2 extends Animal2{//猫科类继承动物类 private String eyesColor; public Cat2(String n, String c) { super(n); eyesColor = c; } public String getEyesColor() { return eyesColor; } public String getBark(){//获取猫的叫声 return "喵喵喵"; } } static class Dog2 extends Animal2 { private String furColor; public String getFurColor() { return furColor; } public Dog2(String n, String c) { super(n); furColor = c; } public String getBark(){//获取狗的叫声 return "汪汪汪"; } } }