Java学习之路--多态

来源:互联网 发布:多用户建站cms系统 编辑:程序博客网 时间:2024/05/17 07:17

Java 多态

多态是同一个行为具有多个不同表现形式或形态的能力。
多态性是对象多种表现形式的体现。

现实中,比如我们按下 F1 键这个动作:
--如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;
--如果当前在 Word 下弹出的就是 Word 帮助;
--在 Windows 下弹出的就是 Windows 帮助和支持。
同一个事件发生在不同的对象上会产生不同的结果。

多态存在的三个必要条件:
--继承
--重写
--父类引用指向子类对象

比如:

Parent p = new Child();
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
以下是一个多态实例的演示,详细说明请看注释:

public class Test {    public static void main(String[] args) {      show(new Cat());  // 以 Cat 对象调用 show 方法      show(new Dog());  // 以 Dog 对象调用 show 方法                      Animal a = new Cat();  // 向上转型        a.eat();               // 调用的是 Cat 的 eat      Cat c = (Cat)a;        // 向下转型        c.work();        // 调用的是 Cat 的 catchMouse  }                  public static void show(Animal a)  {      a.eat();          // 类型判断        if (a instanceof Cat)  {  // 猫做的事情             Cat c = (Cat)a;              c.work();          } else if (a instanceof Dog) { // 狗做的事情             Dog c = (Dog)a;              c.work();          }      }  }abstract class Animal {      abstract void eat();  }    class Cat extends Animal {      public void eat() {          System.out.println("吃鱼");      }      public void work() {          System.out.println("抓老鼠");      }  }    class Dog extends Animal {      public void eat() {          System.out.println("吃骨头");      }      public void work() {          System.out.println("看家");      }  }  

执行以上程序,输出结果为:

吃鱼抓老鼠吃骨头看家吃鱼抓老鼠


例子:

1、

class Father {private int money;public int getMoney() {return money; }public void setMoney(int money) {this.money = money; }public void printInfo() {System.out.println("This is Father");}}class Son extends Father{public void printInfo() {System.out.println("This is son");}public void playGame() {System.out.println("playGame ...");}}class Daughter extends Father{public void printInfo() {System.out.println("This is daughter");}}public class Cnv {public static void main (String args[]) {Son son = new Son();Daughter daughter = new Daughter();Father f = son; /*  */f.printInfo();//f.playGame();f = daughter;f.printInfo();}}

运行结果:

This is sonThis is daughter


分析:

向下转换,分别调用son,daughter的printInfo方法。


2、

class Father {        private int money;        public int getMoney() {return money; }        public void setMoney(int money) {this.money = money; }        public void printInfo() {System.out.println("This is Father");}}class Son extends Father{        public void printInfo() {System.out.println("This is son");}        public void playGame() {System.out.println("playGame ...");}}class Daughter extends Father{        public void printInfo() {System.out.println("This is daughter");}}public class Cnv2 {        public static void main (String args[]) {                Father f = new Son();                f.printInfo();                Son son = (Son)f;   /* Son son = new Son(); */                son.printInfo();        }}

运行结果:

This is sonThis is son


3、

class Father {private int money;public int getMoney() {return money; }public void setMoney(int money) {this.money = money; }public void printInfo() {System.out.println("This is Father");}}class Son extends Father{public void printInfo() {System.out.println("This is son");}public void playGame() {System.out.println("playGame ...");}}class Daughter extends Father{public void printInfo() {System.out.println("This is daughter");}}public class Cnv3 {public static void main (String args[]) {Father f = new Father();Son s = new Son();Daughter d = new Daughter();print(f);print(s);print(d);}public static void print(Father f) {f.printInfo();}public static void print(Son s) {s.printInfo();}public static void print(Daughter d) {d.printInfo();}}

运行结果:

This is FatherThis is sonThis is daughter


4、

class Father {private int money;public int getMoney() {return money; }public void setMoney(int money) {this.money = money; }public void printInfo() {System.out.println("This is Father");}}class Son extends Father{public void printInfo() {System.out.println("This is son");}public void playGame() {System.out.println("playGame ...");}}class Daughter extends Father{public void printInfo() {System.out.println("This is daughter");}}public class Cnv4 {public static void main (String args[]) {Father f = new Father();Son s = new Son();Daughter d = new Daughter();print(f);print(s);print(d);}public static void print(Father f) {f.printInfo();}}
运行结果:

This is FatherThis is sonThis is daughter


5、
class Father {private int money;public int getMoney() {return money; }public void setMoney(int money) {this.money = money; }public void printInfo() {System.out.println("This is Father");}public void drink() {System.out.println("drink ...");}}class Son extends Father{public void printInfo() {System.out.println("This is son");}public void playGame() {System.out.println("playGame ...");}}class Daughter extends Father{public void printInfo() {System.out.println("This is daughter");}public void dance() {System.out.println("dance ...");}}public class Cnv5 {public static void main (String args[]) {Father f = new Father();Son s = new Son();Daughter d = new Daughter();printAction(f);printAction(s);printAction(d);}public static void printAction(Father f) {if (f instanceof Son) {Son son = (Son)f;son.playGame();}else if (f instanceof Daughter) {Daughter d = (Daughter)f;d.dance();}else if (f instanceof Father) {f.drink();}}}
运行结果:

drink ...playGame ...dance ...


分析:

java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。


结论:由以上五个例子可以清晰的分析出来java多态的各种特性。

0 0
原创粉丝点击