关于多态的学习

Posted javahuazai

tags:

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

1.多态的形式

  多态是继封装、继承之后,面向对象的第三大特性。

  多态的格式:父类 变量名 = new 子类();   或者    接口  变量名 = new 实现类();

  多态的前提:(1) 要有继承或实现关系  (2)方法重写

  

2.多态的优点

  提高代码的可扩展性,特别是将子类对象作为参数传入方法的时候。参考以下例子。

  (1)定义了动物类,设置名字属性

 1 public  class Animal {
 2     private String name;
 3 
 4     public String getName() {
 5         return name;
 6     }
 7 
 8     public void setName(String name) {
 9         this.name = name;
10     }
11 }

  (2)定义了猫类、狗类继承动物类

1 class Cat extends Animal {
2 
3 }
4 
5 class Dog extends Animal {
6 
7 }

  (3)定义一个测试类,定义一个以动物类为参数的eat方法,创建猫狗的对象,设置名字属性,将猫狗对象作为参数传入eat方法里。

 1 public class Main {
 2     public static void main(String[] args) {
 3         Cat c = new Cat();
 4         c.setName("波斯猫");
 5         eat(c);
 6 
 7         Dog d = new Dog();
 8         d.setName("阿拉斯加");
 9         eat(d);
10     }
11 
12     public static void eat(Animal animal) {
13         System.out.println(animal.getName() + "在吃饭");
14     }
15   
16 }

  (4)优点:省去了以下的方法定义

1 //    public static void eat(Cat c) {
2 //        System.out.println(c.getName() + "在吃饭");
3 //        
4 //    }public static void eat(Dog d) {
5 //        System.out.println(d.getName() + "在吃饭");
6 //    }

  (5)测试类的运行结果

技术图片

 

 

3.多态的缺点

  无法访问子类独有功能。

  解决方案:向下转型后在调用子类独有功能。

  向下转型(强制转换)格式:子类类型 变量名 = (子类类型) 父类变量名;

  如:Aniaml a = new Cat();
       Cat c =(Cat) a;

  向下转型前提:转型的对象必须属于子类类型,否则报出了  ClassCastException ,类型转换异常。

  如:Aniaml a = new Cat();  Dog d =(Dog) a;   就会报出异常。

    

  

 

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

关于python中多态的理解。

向Linus学习,让代码具有good taste

java 代码片段

学习攻略C++虚函数表及多态内部原理详解

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

JS面向对象 关于类的封装继承多态