要理解多态性,首先要知道什么是“向上转型”、“向下转型”。

对象的多态性:父子类对象的转换

**向上转型:**子类对象变为父类对象,语法: 父类 父类对象 = 子类实例, 自动;

**向下转型:**父类对象变为子类对象,语法: 子类 子类对象 = (子类)父类实例,强制。

1. 对象向上转型(自动 父->子)

演示代码(对象向上转型):

class A{public void print(){System.out.println("A,public void print(){}");}class B extends A{ //继承A类public void print(){ //方法覆写System.out.println("B,public void print(){}");}
}       public class TestDemo{public static void main(String args[]){A a = new B(); //向上转型   (父类 父类对象 = 子类实例)a.print(); //调用被覆写过的方法}
}
执行结果:
B,public void print(){}

本程序实现了一个对象的向上转型操作,虽然最后调用print()方法的是A类对象,但是由于此时实例化的是子类对象new B();”,而且print()方法被子类覆写了,所以最终调用的就是被B类覆写过的print()方法。


2. 对象向下转型 (强制 子->父)

演示代码(对象向下转型):

public void print(){class B extends A{//继承A类public void print(){//方法覆写
}
public class TestDemo{public static void main(String args[]){A a = new B();//向上转型B b = (B)a;//向下转型 强制将父类对象变为了子类实例b.print();//调用被覆写过的方法}
}

本程序强制将父类对象变为了子类实例,由于本程序在开始实例化的依然是子类对象(new B();),所以最终调用的print()方法依然是被子类覆写过的方法。

演示代码(观察错误代码):

A a = new A();//没有转型B b = (B)a;//向下转型错误:java.lang.ClassCastException: A cannot be cast to Bb.print();
Exception in thread "main" java.lang.ClassCastException: A cannot be cast to Bat TestDemo.main(TestDemo.java:14)

以上的程序在编译时没有发生任何的错误信息,但是在执行时出现了“ClassCastException”错误提示,表示的是类转换异常,即两个没有关系的类互相发生了对象的强制转换,所以可以得出结论:当对象发生向下转型关系前,一定要首先发生对象的向上转型关系。

结论:

1.定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。

2.父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的;

3.父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;

4.对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。


3. 多态的使用

所谓多态就是指 程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。(来源:博客园)


举个例子

下面引用一个关于酒的例子,讲述一下多态。
比如你是一个酒神,对酒情有独钟。某日回家发现桌上有几个杯子里面都装了白酒,从外面看我们是不可能知道这是些什么酒,只有喝了之后才能够猜出来是何种酒。你一喝,这是剑南春、再喝这是五粮液、再喝这是酒鬼酒….在这里我们可以描述成如下:
酒 a = 剑南春

酒 b = 五粮液

酒 c = 酒鬼酒

这里所表现的的就是多态。剑南春、五粮液、酒鬼酒都是酒的子类,我们只是通过酒这一个父类就能够引用不同的子类,这就是多态——我们只有在运行的时候才会知道引用变量所指向的具体实例对象

诚然,要理解多态我们就必须要明白什么是“向上转型”。在继承中我们简单介绍了向上转型,这里就在啰嗦下:在上面的喝酒例子中,酒(Win)是父类,剑南春(JNC)、五粮液(WLY)、酒鬼酒(JGJ)是子类。我们定义如下代码:

   JNC a = new  JNC();

对于这个代码我们非常容易理解无非就是实例化了一个剑南春的对象嘛!但是这样呢?

   Wine a = new JNC();

在这里我们这样理解,这里定义了一个Wine 类型的a,它指向JNC对象实例。由于JNC是继承与Wine,所以JNC可以自动向上转型为Wine,所以a是可以指向JNC实例对象的。这样做存在一个非常大的好处,在继承中我们知道子类是父类的扩展,它可以提供比父类更加强大的功能,如果我们定义了一个指向子类的父类引用类型,那么它除了能够引用父类的共性外,还可以使用子类强大的功能。

但是向上转型存在一些缺憾,那就是它必定会导致一些方法和属性的丢失,而导致我们不能够获取它们。所以父类类型的引用可以调用父类中定义的所有属性和方法,对于只存在与子类中的方法和属性它就望尘莫及了


看看代码

public class Wine {public void fun1(){System.out.println("Wine 的Fun.....");fun2();}public void fun2(){System.out.println("Wine 的Fun2...");}
}public class JNC extends Wine{/*** @desc 子类重载父类方法*        父类中不存在该方法,向上转型后,父类是不能引用该方法的* @param a* @return void*/public void fun1(String a){System.out.println("JNC 的 Fun1...");fun2();}/*** 子类重写父类方法* 指向子类的父类引用调用fun2时,必定是调用该方法*/public void fun2(){System.out.println("JNC 的Fun2...");}
}public class Test {public static void main(String[] args) {Wine a = new JNC();a.fun1();}
}
Output:
Wine 的Fun.....
JNC 的Fun2...

从程序的运行结果中我们发现,a.fun1()首先是运行父类Wine中的fun1().然后再运行子类JNC中的fun2()。

分析:在这个程序中子类JNC 重载 了父类Wine的方法fun1(), 重写 fun2(),而且重载后的fun1(String a)与 fun1()不是同一个方法,由于父类中没有该方法,向上转型后会丢失该方法,所以执行JNC的Wine类型引用是不能引用fun1(String a)方法。而子类JNC重写了fun2() ,那么指向JNC的Wine引用会调用JNC中fun2()方法。
对于多态,可以总结它为:

指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,尽管是重载该方法,该引用是不能使用的。若子类重写了父类中的某些方法,在调用该些方法的时候,必定是使用子类中定义的这些方法(动态连接、动态调用)。


[JAVA]向上转型与向下转型相关推荐

  1. 【Java挠头】继承、抽象、接口、多态、向上转型、向下转型等精妙干货

    –本文摘要–     1.本文的目标读者:是了解Java基础,且对面向对象概念有所了解,但是对Java中继承.抽象类.接口.多态等等概念搞不清的初学者.     2.本文的内容摘要:讲述Java中的一 ...

  2. 重新精读《Java 编程思想》系列之向上转型与向下转型

    前言 今天重读了一下向上转型与向下转型,有些新的体会,了解了向上转型的好处,及如何向下转型.在此分享给大家. 向上转型 向上转型是用来表现新类和基类之间的关系.在传统中,由导出类转型成基类,在继承图中 ...

  3. 第三次学JAVA再学不好就吃翔(part35)--多态向上转型和向下转型

    学习笔记,仅供参考 文章目录 面向对象 多态 多态向上转型和向下转型 多态的好处和弊端 面向对象 多态 多态向上转型和向下转型 我们首先通过以下代码复习一下自动类型提升和强制类型转换: class B ...

  4. Java转型(向上转型和向下转型)

    在Java编程中经常碰到类型转换,对象类型转换主要包括向上转型和向下转型. 5.13.1 向上转型 我们在现实中常常这样说:这个人会唱歌.在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就 ...

  5. Java中的向上转型及向下转型

    我们都知道Java的三大特性:封装.继承.多态. Java中的向上转型及向下转型体现了Java中的继承性及多态性,所谓继承,不难理解,存在于子父类间,子类继承父类中不被私有化的属性和方法.而多态性,顾 ...

  6. java 对象向上转型_JAVA对象向上转型和向下转型

    今天做了一个测试的题目,发现自己还是很多问题没有静下心来做.很多问题是可以自己解决的但是自己一是没有读清题意,二是自己心里太急躁了.所以这个要自己应以为鉴! 对象的转型问题其实并不复杂,我们记住一句话 ...

  7. JAVA中的向上转型和向下转型

    一.向上转型和向下转型 向上转型和向下转型是在JAVA继承操作中用到的东西,在讲到转型之前我们需要认识到继承过程中的对象类型转换,这种转换有两个特点:              1.这是继承过程中发生 ...

  8. java 向下转型运行时错误_Java向上转型和向下转型

    首先定义父类Animal,所有动物都有一个吃东西的方法:子类Dog还增加了一个叫的功能. public classAnimal {public voideat() { System.out.print ...

  9. java 泛型向下转型_Java向上转型和向下转型(附具体样例)

    Java向上转型和向下转型(附具体样例) 熬夜整理的关于Java向上和向下转型的样例,很的通俗易懂哦~~~~ 一.向上转型 package com.sheepmu; class Animal { pu ...

最新文章

  1. 联想e480一键恢复小孔_圆满收官,联想发布数款超智能电脑及平板产品
  2. [luogu2148 SDOI2009] ED (博弈论)
  3. 《那些年啊,那些事——一个程序员的奋斗史》——115
  4. java this.val$_[Java教程]Jquery $(this).attr和$(this).val用法示例
  5. pyspark的ALS协同过滤推荐算法-小结1
  6. java汉字的编码_Java中文编码小结
  7. Linux使用“./可执行文件名“运行可执行文件
  8. 995. Minimum Number of K Consecutive Bit Flips(K 连续位的最小翻转次数)解法(C++ 注释)
  9. Python:利用Entrez库筛选下载PubMed文献摘要
  10. Outlook 与企业微信邮箱通讯录同步
  11. 常用数学符号的读法及意义
  12. 为什么说用友 iuap 是更懂企业业务的数智平台?
  13. 项目文件夹下的obj文件夹
  14. 数码相机和单反相机有什么区别?(已解决)
  15. C++ Vecor 清空内存
  16. 写文本到txt文件的Sub过程
  17. 基于tushare量化交易模型基础构建(偿债能力排名)
  18. C++---STL标准库之set函数全解析,示例讲解,清晰易懂!
  19. firefox下载文件弹出框之终极解决方案-vbs模拟键盘操作
  20. CATIA ImagineShape快速模型

热门文章

  1. java8,java9和java11的特性和区别!
  2. html怎么修改td 的宽度,html td怎么设置宽度
  3. FFC1000系列全频带微波超宽带上下变频器
  4. 六、系统架构 - 高可用架构设计
  5. U盘空闲空间格式化及自动挂载
  6. sed是linux命令吗,Linux12_ sed命令详解
  7. 如何才能使其输入/输出的参数个数不限
  8. 【Python 实战基础】Python 中 PyQt6 的 QPen 介绍
  9. 7-7 到底是不是太胖了
  10. 人工智能学JAVA吗_人工智能是学java吗