1、首先是继承和重写。这个很简单。因为多态就是建立在不同的重写之上的。也就是说多态就是在使用着一个方法的不同重写。而重写又是依赖着继承关系。
首先先上代码示例。
public class Animal { public void Shout({ System.out.println("叫叫叫"; } public void Hi({ System.out.println("打招呼"; } } class Dog extends Animal{ public void Shout({ System.out.println("汪汪汪"; } public void seeHouse({ System.out.println("看家"; } }class Cat extends Animal{ public void Shout({ System.out.println("喵喵喵"; } } class goose extends Animal{ public void Shout({ System.out.println("嘎嘎嘎"; } }
public class TestPolym { public static void main(String[] args { AnimalShout(new Dog(; AnimalShout(new goose(; } static void AnimalShout(Animal animal{ animal.Shout(; } }
在如上代码中,Animal类是作为dog、cat、goose的父类。而TestPolym则是用于实现多态
指向子类对象则是看这一行:
这里其实可以理解为:
其实这一行打出来基本就可以理解个七七八八。这句话就是定义了一个对象 animal 然后将其实例化成 类型为 Animal 的Dog()。因为Dog、Cat这些是Animal的子类,所以类型 Animal >= Dog、Cat......这些子类。所以首先指向子类是成立的。
反之,使用此语句去运行不是由Animal类中的方法重写而来的方法时,此语句会报错。例如用这一行去调用seeHouse时
编译器会红,并且建议你在Animal中创建这样一个方法,那我们去创建一下。之后就会发现,Animal和Dog两个类中都有Hi方法了,又变成重写了!而且程序也能跑的通了。所以本质上还是Animal类包含(抽象一点的)Dog类。