| 本帖最后由 朱盛文 于 2013-3-17 10:24 编辑 
 多态的前提:复制代码
package test;
class Test4
{
        public static void main(String [] args )
        {
                //创建一个Person类对象并直接调用其中的speak方法。
                new Person().speak();
                //创建Person对象赋值给接口Speakable类型sp,并且调用子类中的方法
                Speakable sp=new Person();                                //接口引用指向子类对象,满足多态前提3
                sp.speak();
                System.out.println(sp.language);
                //sp.eat();// 【报错】这里会报错,因为sp接口中没有eat方法
                //创建Person对象赋值给父类Animal类型anim,并且调用子类中的方法
                Animal anim=new Person();
                anim.speak();
                System.out.println(sp.language);                       //这里的输出结果应该是chinese,因为Person先继承Animal再实现Speakable
                                                                                         //而speakable里的成员变量language被final修饰,是常量,所以是chinese
        }
}
//抽象类Animal
abstract class Animal 
{
        public String language="sound";
        abstract void eat();
        abstract void speak();
        public void sleep()
        {
                System.out.println("sleep");
        }
}
//接口
interface Speakable
{
        public static final String language="chinese";
        abstract void speak();
}
//子类Person继承Animal的同时实现Speakable
class Person extends Animal implements Speakable                        //Person实现了Speakable接口,满足多态的前提1
{
        public void eat()
        {
                System.out.println("Person.eat");
        }
        public void speak()                                                                // 重写了Speakable中的speak方法,满足多态前提2
        {
                System.out.println("Person.speak---"+super.language+"---"+Speakable.language);
        }
        
}
1.要有继承或者实现关系
 2.要有方法的重写
 3.父类(接口)引用指向子类对象
 
 对于第一个问题,都满足多态的3个前提,所以属于多态
 |