JAVA多态

Posted qngq

tags:

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

在程序设计一个方法时,如果我们希望它能够通用,例如要实现一个动物叫的方法,我们可以在方法中接收一个动物类型的参数,当传入猫类对象时就发出猫叫,传入其他动物类型时就发出其相应的叫声。在同一个方法中,这种由于参数类型不同而导致执行效果不同的现象就是多态。

用一个案例来演示多态的使用:

 1 //定义接口Animal
 2 interface Animal {
 3    void shout();//定义抽象方法
 4 }
 5 //cat类实现Animal接口
 6 class Cat implements Animal{
 7    public void shout(){
 8      System.out.println("喵喵");     
 9     }
10 
11 }
12 class Dog implements Animal{
13    public void shout(){
14       System.out.println("汪汪"); 
15    }
16 }
17 //定义测试类
18 public class Ex_2{
19   public static void main(String[] args){
20       Animal an1 = new Cat();//创建Cat对象使用Animal类型变量an1引用
21       Animal an2 = new Dog();//创建Cat对象使用Animal类型变量an1引用
22       animalShout(an1);
23       animalShout(an2);
24 }
25 public static void animalShout(Animal an){
26     an.shout();
27 }
28 }

这里就涉及到对象的类型转换,在多态的使用中,涉及到将子对象当作父类类型使用(向上转型)或者将父类型当中子类型使用(向下转型)的情况。

向上转型的例子:

Animal an1 = new Cat();//将Cat对象当做父类型

     

通过一个案例来了解下向下转型:

 1 //定义Animal接口
 2 interface Animal{
 3    void shout();
 4 }
 5 //定义Cat类实现Animal
 6 class Cat implements Animal{
 7     public void shout(){
 8        System.out.println("喵喵");
 9    }
10   public void sleep(){
11        System.out.println("呼呼...");
12    }
13 }
14 //定义Dog类实现Animal
15 class Dog implements Animal{
16     public void shout(){
17        System.out.println("汪汪");
18    }
19   public void sleep(){
20        System.out.println("wang...");
21    }
22 }
23 //创建测试类
24 public class Ex_3{
25     public static void main(String[] args){
26         Dog  dog = new  Dog();
27         animalShout(dog);
28    } 
29     public static void animalShout(Animal animal){
30        if(animal instenceof Cat){
31        Cat cat = (Cat)animal;//将Animal对象转换成Cat类型
32        cat.sleep();
33        cat.shout();
34    }
35 else{
36   System.out.println("这不是猫");
37 }
38   }
39 }

 

这个案例中 我们把Animal对象转换成了Cat类型。

Cat cat = (Cat)animal;

多态存在的三个必要条件

一、要有继承;

二、要有重写;

三、 父类引用指向子类对象

多态的好处

1)可替换性(substitutability:多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。

2)可扩充性(extensibility:多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。

3)接口性(interface-ability: 态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3 所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle Sphere为了实现多态,完善或者覆盖这两个接口方法。

4)灵活性(flexibility:它在应用中体现了灵活多样的操作,提高了使用效率。

5)简化性(simplicity:多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

以上是关于JAVA多态的主要内容,如果未能解决你的问题,请参考以下文章

每个人单核苷酸多态性(SNP)形成的原因是啥?

多态性和动态铸造

Java多态——代码复用性

Java 多态

java多态/重载方法——一个疑难代码引发的讨论

Java 多态