浅谈Java多态

多态的概念

1、面向对象程序设计的三大支柱是封装、继承和多态

2.多态面向对象程序设计的一个重要特征,指同一个实体同时具有多种形式,即同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态。

3.多态性就是指在不修改程序代码的情况下,就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态。

类型转换

由于,多态本身是一种向上转型,所以我们先了解一下类型转换

强制类型转换(cast)

double Steve_speed = 108.68;
int now_Steve_speed = (int) Steve_speed;

向上转型(upcasting)

将一个父类的引用指向一个子类对象,自动进行类型转换。

使用格式:

父类类型 变量名 = new 子类类型();
如:Animal a = new Dog();


注意:

1.向上转型不要强制转型。

2.父类引用指向的或者调用的方法是子类的方法,这个称为动态绑定。

3.向上转型后父类引用不能调用子类自己的方法。

向下转型(downcasting)

子类引用指向父类引用的子类对象,通俗的说就是子类实例对象赋值给父类引用,然后父类引用又要赋值给子类引用,这个过程就是向下转型。

使用格式:

子类类型 变量名 = (子类类型) 父类变量名;
如:Dog c =(Dog) a;


注意:

1.只能强转父类的引用,不能强转父类的对象。
2.要求父类的引用必须指向的是当前目标类型的对象。
3.当向下转型后,就可以调用子类类型中所有的成员。

 

多态的前提条件

1.需要有继承关系

2.需要有方法覆盖

3.父类引用指向了子类的实例

实例演示

public class Test {
    public static void main(String[] args) {
       Animal a=new Cat();  // 向上转型 变成父类型
       // 编译时a被认为是Animal类型,运行时被认为是子类型
       Animal b=new Dog();  // 向上转型
       a.eat();   //调用的是子类的方法
       a.work();
       Cat c = (Cat)a;  //向下转型 变成子类型
       Dog d = (Dog)b;
       c.eat();
       d.eat();
    }
}
class Cat extends Animal{
 //   @Override
    public void eat() {
        System.out.println("吃鱼");
    }
}
class Dog extends Animal{
//    @Override
    public void eat() {
        System.out.println("吃骨头");
    }
}
class Animal{
    public void eat(){
        System.out.println("吃什么");
    }
    public void  work(){
     	System.out.println("验证a的内部是Animal类型");
     }
}
 
 

多态的特点

1.可替换性(substitutability):

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

2.可扩充性(extensibility):

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

3.接口性(interface-ability):

多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。

4.灵活性(flexibility):

它在应用中体现了灵活多样的操作,提高了使用效率。

5.简化性(simplicity):

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

总结

        在面向对象编程的时候,我们遇到的对象通常都会具有多种特性,我们想要实现一个对象的编程过程,就需要用到Java的三大特性。如果说,封装是创造了一个初具人形的发条人偶,继承则是给它装上了工具,而多态则为这个人偶赋予了独有的灵魂和思想。

        多态虽然对于初学者来说,有一些难以理解,但其特性动态绑定在实际项目中非常有用,能减少很多繁杂的代码,减轻工作量的同时,其灵活性也大大提高了代码的扩展性,能够避免不同子类的差异,简化程序,使我们的程序更加通用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值