文档章节

向上、下转型理解★★★

L
 LM_Mike
发布于 2017/08/07 23:45
字数 657
阅读 15
收藏 0

首先感谢这位大神的博客,我在其代码下加个人理解,有可能不正确,希望看出来的可以指出,加以改正

A类:
package a.b;

public class A {

void aMthod() {

       System.out.println("A method");

}

}

A的子类B:
package a.b;

public class B extends A {

void bMethod1() {

       System.out.println("B method 1");

}

void bMethod2() {

       System.out.println("B method 2");

}

}

C类:
package a.b;

public class C {

     public static void main(String[] args) {

            A a1 = new B(); // 向上转型

            a1.aMthod();    // 调用父类aMthod(),a1遗失B类方法bMethod1()、bMethod2()

            B b1 = (B) a1; // 向下转型,编译无错误,运行时无错误

            b1.aMthod();    // 调用父类A方法

            b1.bMethod1(); // 调用B类方法

            b1.bMethod2(); // 调用B类方法

            A a2 = new A();

            B b2 = (B) a2; // 向下转型,编译无错误,运行时将出错

            b2.aMthod();

            b2.bMethod1();

            b2.bMethod2();

     }

}

个人理解

为什么第一个向下转型成功? 因为

A a1 = new B(); // 向上转型,这个a1对象其实指向的是子类B的一个对象
//举例:鸟 = new 八哥
//有时为了代码简洁,操作时我不关注它是八哥,所以向上转型会遗失八哥独有的方法,比如嗑瓜子
/*上面用法多见于传参,你传的是鸟就行,然后执行传进来的方法,这里举例为执行叫
你传八哥,就执行八哥的模仿人说话,你传啄木鸟就执行啄木鸟的叽叽喳喳,
此时,你就不能执行八哥的嗑瓜子方法,因为有可能传其他的品种的鸟,因此会向上转型遗失独有的方法
*/
/*但是有时我又想使用八哥独有的嗑瓜子方法,这时候,
a1对象(其实指向B的一个对象实例,在此,a1本来就指向一个B类的实例(八哥),只是强调返回的八哥是一只鸟),
所以向上转型为八哥,当然没问题*/
B b1 = (B) a1; // 向下转型,编译无错误,运行时无错误

为什么第二个向下转型不安全? 因为

 A a2 = new A();//沿用鸟和八哥的例子,这里毫无疑问new出来的a2是一只鸟,具体是什么鸟,不知道
 B b2 = (B) a2; // 向下转型,编译无错误,运行时将出错
/*因为a2是鸟类(父类)的一个实例对象,不确定是什么品种,
这时候你将a2向下转为八哥,肯定是不行的,
因为自然界里鸟有可能是一只啄木鸟,你将有可能是啄木鸟的鸟转换为八哥,肯定是不行的*/

本文转载自:http://blog.csdn.net/shanghui815/article/details/6088588

L
粉丝 1
博文 270
码字总数 41374
作品 0
深圳
私信 提问
Netty学习笔记1:5种IO模型

1 阻塞IO模型 从字面来理解,就是调用时可能被阻塞,什么叫阻塞,要知道一个进程有N种状态,学过OS都知道如果阻塞,就会把当前进程放在某个条件的阻塞队列里。直到条件满足了,才会转移此进程...

强子哥哥
2014/07/19
0
8
书单丨成为机器学习大神,你不能不懂数学

     编者按:如何自学机器学习?需要哪些数理基础?怎样从入门到进阶,成就大神之路?对于这些问题,作为毕业后投身机器学习研究的数学博士、微软亚洲研究院机器学习组主管研究员陈薇无...

微软亚洲研究院
2018/09/06
0
0
十余款进阶Clouder技能认证上线,打造全方位云+数据人才成长路径

2018伊始,阿里云Apsara Clouder认证上线10余款进阶版技能认证。在前期技术入门基础上,新上线的认证进一步细化了云上技能应用场景划分,提升技术及场景深度,打造全方位的云+数据人才成长路...

云大学小编
2018/01/04
0
0
前端工程师必备技能汇总

本文来源:https://github.com/JacksonTian/fks 项目起源 还记得@jayli 的这幅前端知识结构图么。 图片的形式具有诸多的不便。缺失源图的我们,无法为此图贡献些什么,随着时间的迁移,或许有...

oschina
2014/04/11
21.6K
108
互联网约炮圣地Top10(转载)

曾经,一位创业者和我深谈过,他告诉我“一个产品无论多好,在中国想获得成功,都必须先用刚需去推动“,当初我并不能理解这句话,但是随着近年来陌陌和微信这些产品依靠“刚需”迅速崛起,这...

韭零后张子游
2013/06/12
3.2K
19

没有更多内容

加载失败,请刷新页面

加载更多

Guava RateLimiter + AOP注解实现单机限流、统计QPS

1、基于springboot项目pom.xml添加如下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId></dependency><d......

铁骨铮铮
39分钟前
3
0
龙芯版办公软件下载

金山wps office   rpm包:http://ftp.loongnix.org/os/loongnix/1.0/os/Packages/w/wps-office-10.8.0.6472-1.a20p1.mips64el.rpm   deb包:http://packages.deepin.com/loongson/pool/......

gugudu
45分钟前
2
0
BI报表分析和数据可视化,推荐这三个开源工具!

开源篇 一、Superset 1、技术架构:Python + Flask + React + Redux + SQLAlchemy 2、使用人群: (1)开发/分析人员做好看板,业务人员浏览看板数据 (2)业务人员可自行编辑图表,查看满足...

飓风2000
51分钟前
3
0
CountDownLatch

CountDownLatch的概念 CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。 CountDownLatch能够使一个线程在等待另外一些线程...

少年已不再年少
今天
2
0
centos7 新手阿里云服务器安装mongodb

简介 MongoDB 是一个基于分布式 文件存储的NoSQL数据库 由C++语言编写,运行稳定,性能高 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案 MongoDB特点 模式自由 :可以把不同结构的文档存...

醉雨
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部