用一句话概括就是:事物在运行过程中存在不同的状态。
 多态的存在有三个前提:
1.要有继承关系
2.子类要重写父类的方法
3.父类引用指向子类对
但是其中又有很多细节需要注意。首先我们定义两个类,一个父类Animal,一个子类Cat。
 父类Animal
class Animal{
    int num = 10;
    static int age = 20;
    public void eat(){
        System.out.println("Animal吃饭");
    }
    public static void sleep(){
        System.out.println("Animal睡觉");
    }
    public void run(){
        System.out.println("Animal跑步");
    }
}
 
子类Cat
class Dog extends Animal{
    int num = 200;
    static int age = 300;
    public void eat(){
        System.out.println("Dog吃饭");
    }
    public static void sleep(){
        System.out.println("Dog睡觉");
    }
    public void readBook(){
        System.out.println("Dog阅读书");
    }
}
 
测试类
public static void main(String[] args) {
        Animal animal  = new Dog();
        animal.eat();
        animal.sleep();
        animal.run();
        System.out.println(animal.num);
        System.out.println(animal.age);
    }
 
以上的三段代码充分体现了多态的三个前提,即:
 1.要有继承关系
 Dog类继承了Animal类
 2.子类要重写父类的方法
 子类重写(override)了父类的两个成员方法eat(),sleep()。其中eat()是非静态的,sleep()是静态的(static)。
 3.父类引用指向子类对
 测试类中 Animal animal = new Dog();语句在堆内存中开辟了子类(Dog)的对象,并把栈内存中的父类(Animal)的引用指向了这个Cat对象。
 
 子类Dog重写了父类Animal的非静态成员方法animal.eat();的输出结果为:Dog吃饭。
 子类重写了父类(Animal)的静态成员方法animal.sleep();的输出结果为:animal睡觉
 未被子类(Dog)重写的父类(Animal)方法animal.run()输出结果为:animal奔跑
总结
-  
成员变量
编译看左边(父类),运行看左边(父类) -  
成员方法
编译看左边(父类),运行看右边(子类)。动态绑定 -  
静态方法
编译看左边(父类),运行看左边(父类)。 


















