本帖最后由 朱盛文 于 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个前提,所以属于多态 |