面向对象三大特性一一多态(polymorphism)

Posted PoeticalJustice

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象三大特性一一多态(polymorphism)相关的知识,希望对你有一定的参考价值。

 1 package com.bjsxt.oop.polymorphism;
 2 
 3 public class Animal {
 4     public void voice(){
 5         System.out.println("动物叫声");
 6     }
 7 }
 8 class Cat extends Animal{
 9     public void voice(){
10         System.out.println("喵喵喵");
11     }
12 }
13 class Dog extends Animal{
14     public void voice(){
15         System.out.println("汪汪汪");
16     }
17 }
18 class Pig extends Animal{
19     public void voice(){
20         System.out.println("吭哧吭哧");
21     }
22 }
 1 package com.bjsxt.oop.polymorphism;
 2 
 3 /**引用变量的2中类型
 4  * 1,编译时类由声明事类型决定
 5  * 2,运行时类型 由实际传入的对象类型决定
 6  * 
 7  * 
 8  * 三个必要条件
 9  * 要有继承
10  * 要有重写
11  * 父类引用指向子类对象
12  * @author Administrator
13  *
14  */
15 public class Test {
16     /*如果没有多态,我们需要把每个子类的叫的方法写一遍,重载动物叫声方法 显然不方便
17     public static void testAnimalVoice(Cat c){
18         c.voice();
19     public static void testAnimalVoice(Dog d){
20         d.voice();
21     public static void testAnimalVoice(Pig p){
22         p.voice();
23     }*/
24     //使用多态就很简单  编译时类由声明事类型决定
25     public static void testAnimalVoice(Animal a){
26         a.voice();
27     }
28     public static void main(String[] args) {
29          //运行时类型 由实际传入的对象类型决定
30         /*父类引用指向子类对象
31         Cat c = new Cat();
32         Animal a = c;
33         我们写成下面这样
34         */
35         Animal c = new Cat();
36         Animal d = new Dog();
37         Animal p = new Pig();
38         testAnimalVoice(c);
39         testAnimalVoice(d);
40         testAnimalVoice(p);
41         
42     }
43 }

 我们试着重写方法

我们每一个动物,重写一个属于自己的方法;

 1 package com.bjsxt.oop.polymorphism;
 2 
 3 public class Animal {
 4     public void voice(){
 5         System.out.println("动物叫声");
 6     }
 7 }
 8 class Cat extends Animal{
 9     public void voice(){
10         System.out.println("喵喵喵");
11     }
12     public void catchMouse(){
13         System.out.println("猫抓老鼠");
14     }
15 }
16 class Dog extends Animal{
17     public void voice(){
18         System.out.println("汪汪汪");
19     }
20     public void seeDoor(){
21         System.out.println("狗看门");
22     }
23 }
24 class Pig extends Animal{
25     public void voice(){
26         System.out.println("吭哧吭哧");
27     }
28     public void sleep(){
29         System.out.println("猪在睡觉");
30     }
31 }
32 class Tiger extends Animal{
33     public void voice(){
34         System.out.println("吼吼吼");
35     }
36     public void eat(){
37         System.out.println("老虎在吃饭");
38     }
39 }

我们试着 调用一下

package com.bjsxt.oop.polymorphism;

/**引用变量的2中类型
 * 1,编译时类由声明事类型决定
 * 2,运行时类型 由实际传入的对象类型决定
 * 
 * 
 * 三个必要条件
 * 要有继承
 * 要有重写
 * 父类引用指向子类对象
 * @author Administrator
 *
 */
public class Test {
    /*如果没有多态,我们需要把每个子类的叫的方法写一遍,重载动物叫声方法 显然不方便
    public static void testAnimalVoice(Cat c){
        c.voice();
    public static void testAnimalVoice(Dog d){
        d.voice();
    public static void testAnimalVoice(Pig p){
        p.voice();
    }*/
    //使用多态就很简单  编译时类由声明事类型决定
    public static void testAnimalVoice(Animal a){
        a.voice();
    }
    public static void main(String[] args) {
         //运行时类型 由实际传入的对象类型决定
        /*父类引用指向子类对象
        Cat c = new Cat();
        Animal a = c;
        我们写成下面这样
        */
        Animal c = new Cat();
        Animal d = new Dog();
        Animal p = new Pig();
        Animal t = new Tiger();
        testAnimalVoice(c);
        testAnimalVoice(d);
        testAnimalVoice(p);
        testAnimalVoice(t);
        
        //我们在我们重写了很多类的方法 我们试着调一下
        //c.cathMouse(); 报错The method cathMouse() is undefined for the type Animal
        //咦?说我们的抓老鼠的方法在Animal类里没定义  我让猫抓老鼠和你Animal有什么关系? 原来编译器不通过(编译器没那么智能,你传什么对象他就是啥了你得声明)是因为
        //编译器 只认证不认人 比如 你掉方法  c.cathMouse(); c是什么呢?  Animal c = new Cat(); c的前面 类型写的是Animal 你就是Animal类型
        //既然 我们想让猫抓老鼠  那么 就强制转型被
        //在编译器的角度看c是Animal 类型我们强制转换(Cat)然后 用 新的Cat c1来接受新的对象
        Cat c1 = (Cat)c;
        c1.catchMouse();
        Dog d1=(Dog)d;
        d1.seeDoor();
        Pig p1 = (Pig)p;
        p1.sleep();
        Tiger t1 = (Tiger)t;
        t1.eat();
        //能把老虎转成猫吗?
        Cat c2 = (Cat)t;
        c2.catchMouse();//通过了,再次证明编译器死板
        //跑起来报错Exception in thread "main" java.lang.ClassCastException: com.bjsxt.oop.polymorphism.Tiger cannot be cast to com.bjsxt.oop.polymorphism.Cat
        //at com.bjsxt.oop.polymorphism.Test.main(Test.java:59)
        //老虎不能转成猫
    }
}

 

以上是关于面向对象三大特性一一多态(polymorphism)的主要内容,如果未能解决你的问题,请参考以下文章

Java 面对对象之多态

OOP 三大特征之多态(Polymorphism)

Java三大特性之---多态

Java入门二十二 面向对象三大特征之多态

理解 Java 的三大特性之多态

面向对象三大特性-多态的思考