java转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象。

什么叫父类引用指向子类对象,且听我慢慢道来.

从2个名词开始说起:向上转型(upcasting)、向下转型(downcasting).

举个例子:有2个类,Father是父类,Son类继承自Father。

Father f1 = newSon();   // 这就叫upcasting (向上转型)

// 现在f1引用指向一个Son对象

Son s1 =(Son)f1;   // 这就叫downcasting (向下转型)

// 现在f1还是指向Son对象

第2个例子:

Father f2 = newFather();

Son s2 =(Son)f2;      //出错,子类引用不能指向父类对象

你或许会问,第1个例子中:Son s1 = (Son)f1;问什么是正确的呢。

很简单因为f1指向一个子类对象,Father f1 = newSon(); 子类s1引用当然可以指向子类对象了。

而f2 被传给了一个Father对象,Father f2 = newFather();子类s1引用不能指向父类对象。

总结:

1。父类引用指向子类对象,而子类引用不能指向父类对象。

2。把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转换。

     如:Father f1 = new Son();

3。把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转换。

   如:f1就是一个指向子类对象的父类引用。把f1赋给子类引用s1即 Son s1 =(Son)f1;

          其中f1前面的(Son)必须加上,进行强制转换。

一、向上转型。

通俗地讲即是将子类对象转为父类对象。此处父类对象可以是接口。

1,向上转型中的方法调用。

看下面代码:

[java]
  1. package com.wensefu.others;
  2. public class Animal {
  3. public void eat(){
  4. System.out.println("animal eatting...");
  5. }
  6. }
  7. class Bird extends Animal{
  8. public void eat(){
  9. System.out.println("bird eatting...");
  10. }
  11. public void fly(){
  12. System.out.println("bird flying...");
  13. }
  14. }
  15. class Main{
  16. public static void main(String[] args) {
  17. Animal b=new Bird(); //向上转型
  18. b.eat();
  19. //! error: b.fly(); b虽指向子类对象,但此时丢失fly()方法
  20. dosleep(new Male());
  21. dosleep(new Female());
  22. }
  23. public static void dosleep(Human h) {
  24. h.sleep();
  25. }
  26. }
package com.wensefu.others;  
  1. public class Human {
  2. public void sleep() {
  3. System.out.println("Human sleep..");
  4. }
  5. }
  6. class Male extends Human {
  7. @Override
  8. public void sleep() {
  9. System.out.println("Male sleep..");
  10. }
  11. }
  12. class Female extends Human {
  13. @Override
  14. public void sleep() {
  15. System.out.println("Female sleep..");
  16. }
  17. }

注意这里的向上转型:
       Animal b=newBird(); //向上转型
      b.eat();

此处将调用子类的eat()方法。原因:b实际指向的是Bird子类,故调用时会调用子类本身的方法。

需要注意的是向上转型时b会遗失除与父类对象共有的其他方法。如本例中的fly方法不再为b所有。

2,向上转型的好处。

看上面的代码,

public static void dosleep(Human h) {
      h.sleep();
    }

这里以父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。不然的话,
如果dosleep以子类对象为参数,则有多少个子类就需要写多少个函数。这也体现了JAVA的抽象编程思想。

二、向下转型。

与向上转型相反,即是把父类对象转为子类对象。

看下面代码:

package com.wensefu.other1;  
  1. public class Girl {
  2. public void smile(){
  3. System.out.println("girl smile()...");
  4. }
  5. }
  6. class MMGirl extends Girl{
  7. @Override
  8. public void smile() {
  9. System.out.println("MMirl smile sounds sweet...");
  10. }
  11. public void c(){
  12. System.out.println("MMirl c()...");
  13. }
  14. }
  15. class Main{
  16. public static void main(String[] args) {
  17. Girl g1=new MMGirl(); //向上转型
  18. g1.smile();
  19. MMGirl mmg=(MMGirl)g1; //向下转型,编译和运行皆不会出错
  20. mmg.smile();
  21. mmg.c();
  22. Girl g2=new Girl();
  23. //      MMGirl mmg1=(MMGirl)g2; //不安全的向下转型,编译无错但会运行会出错
  24. //      mmg1.smile();
  25. //      mmg1.c();
  26. if(g2 instanceof MMGirl){
  27. MMGirl mmg1=(MMGirl)g2;
  28. mmg1.smile();
  29. mmg1.c();
  30. }
  31. }
  32. }

Girl g1=new MMGirl(); //向上转型
      g1.smile();
      MMGirl mmg=(MMGirl)g1; //向下转型,编译和运行皆不会出错

这里的向下转型是安全的。因为g1指向的是子类对象。


Girl g2=new Girl();
MMGirl mmg1=(MMGirl)g2; //不安全的向下转型,编译无错但会运行会出错

运行出错:

Exception in thread "main"java.lang.ClassCastException: com.wensefu.other1.Girl
    atcom.wensefu.other1.Main.main(Girl.java:36)
如代码所示,可以通过instanceof来防止出现异常。

Java中的向下转型与向上转型相关推荐

  1. java中的向下转型和向上转型

    关于转型 转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展. 向上转型 向上 ...

  2. java 向上转型_java向上转型和向下转型

    转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展. 向上转型:子类引用的对象 ...

  3. Java从入门到放弃09---多态/向上转型/向下转型/多态内存图/抽象类/关键字abstract不能和哪些关键字共存/接口/类与类,类与接口,接口与接口的关系/抽象类与接口的区别

    Java从入门到放弃09-多态/向上转型/向下转型/多态内存图/抽象类/关键字abstract不能和哪些关键字共存/接口/类与类,类与接口,接口与接口的关系/抽象类与接口的区别 01 多态 多态指的是 ...

  4. JAVA中同目录下定义类,以及对象的创建与使用,内存图的原理

    JAVA中同目录下定义类,以及对象的创建与使用(听课笔记) JAVA中对象的创建与使用(听课笔记) 示例一 同文件目录下,创建了三个类OOTest01,User,Address类,之间的调用 示例二 ...

  5. 【Java工具类】(1)—Java中驼峰与下划线相互转换

    Java工具类(1)-Java中驼峰与下划线相互转换 1.驼峰命名法 /** * 驼峰式命名法 */ public static String toCamelCase(String s) {if (s ...

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

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

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

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

  8. 【Java SE】继承;组合;向上转型;动态绑定;方法重写;静态绑定;多态;抽象类;接口;

    面向对象编程 文章目录 1. 包 1.1 导入包中的类 1.2 静态导入 1.3 将类放到包中 1.4 包的访问权限控制 1.5 常见的系统包 2. 继承 2.1 语法规则 2.2 protected ...

  9. Java面向对象:多态——基于继承的向上转型、方法重写、动态绑定

    Java面向对象:多态 1.多态的概念 2.向上转型和向下转型 (1)向上转型 (2)向下转型 3.方法重写 4.动态绑定与静态绑定 5.多态的优缺点 ======================== ...

最新文章

  1. R语言ggplot2可视化指定图像标题(title)、副标题(subtitle)的内容、字体大小、字体类型、色彩、对齐方式等实战
  2. css工程化和浏览器兼容性问题
  3. Android构建流程——篇七
  4. mapper里面select id 后面一直红名_YTG晨晨改ID“进厂找班上了”,如此自嘲,心态还挺好...
  5. 检查两个列表在Java中是否相等
  6. 从零开始学网络|搞懂OSI参考模型和TCP/IP分层模型,看这篇文章就够了
  7. 好看的个人qq主页-导航页源码
  8. Android 应用开发(8)---语言和语言区域
  9. 【QCustomPlot】1.3 - 运行官方例程Demo,介绍功能
  10. 被罚 50 亿美元,Android 究竟招谁惹谁了?
  11. python有哪些函数怎么用_必须掌握的常用python函数有哪些?
  12. 震精 - PostgreSQL 递归查询 - 树型数据按路径分组输出
  13. Android微信支付爬坑
  14. Dialogs(对话框)
  15. 基于opencv python 的网线线序识别(三)
  16. Trained Ternary Quantization
  17. APP定制开发的优势
  18. Robyn MMM2.0 - Facebook Marketing Science(R)市场营销-广告投放
  19. Python统计文件夹大小
  20. 三行CSS代码搞定镜头平移(Panning Shot)动画

热门文章

  1. 史上最详细Windows版本搭建安装React Native环境配置
  2. eclipse中项目内存溢出问题
  3. php5.3 延迟静态绑定 static关键字
  4. Linux学习十七、正规表达式练习题
  5. PLSQL连接oracel数据库_用户无法登陆_oci.dll_配置问题
  6. “街坊”×××数字平台,昔日的思想,曾经的努力
  7. 办公自动化及工作流技术
  8. pyaudio usb playback_5.5寸触控屏IP电话会议USB全向麦克风NK-OAM600U_影视工业网
  9. 中文整合包_案例 | 美研市场营销和整合营销专业1620Fall 580+申请实例(含MS+PHD)...
  10. pyecharts添加文字_超燃的文字云效果,用Python就能轻松get!