故事背景

  在《西游记》原著第六回,孙悟空大闹天宫反下界,玉帝派十万天兵围剿,却被打得落花流水。玉帝不得不放下架子,请自己外甥二郎神回来支援。孙悟空与二郎神本事差不多,两人斗得不分胜负,但二郎神有梅山六兄弟助阵,而孙的阵营只是乌合之众。两人战斗正酣时,孙悟空闻后方阵营攻破,猴子被打散,心中发慌败下阵来。

  为了逃脱梅山六兄弟的围追堵截,孙悟空摇身一变,变作一个麻雀,飞在树桃头钉住。这个变化太low了,二郎神一眼就识破假象,立即变成饿鹰扑了过来。孙悟空只得又变成大鹚老冲天而起,二郎神则变成大海鹤,钻上云宵来嗛……

  几经斗法,孙悟空最后变成一座土地庙,牙齿作门扇,舌头变菩萨,眼睛变窗棂,但尾巴却不好收拾,只得竖在后面,变成一根旗竿。这个变化迷惑性很大,一般神仙还真看不破。不料二郎神赶到,见一根旗竿立在后面,顿时笑了:“是这猢狲了!他今又在那里哄我。我也曾见庙宇,更不曾见一个旗竿竖在后面的。断是这畜生弄谊!他若哄我进去,他便一口咬住。我怎肯进去?等我掣拳先捣窗棂,后踢门扇!”孙悟空一听,妈妈呀,这二郎神好狠!“门扇是我牙齿,窗棂是我眼睛;若打了牙,捣了眼,却怎么是好?”于是赶紧收了法相,逃命去了。

  这七十二变的最大缺陷是:若是变飞禽、走兽、花木、器皿、昆虫之类,可以连身子一起变;但如果变人物,却只是头脸变了,身子变不过来,还有一身黄毛,两块红股,一条尾巴。原因:七十二变化本身就是人研制出来的,也是为人量身打造的,故孙悟空学会后会存在缺陷。

java中的七十二变

我们看一下,java的七十二般变化吧!

public class Multicast{
public static void main (String[] args){
System.out.println((int)(char)(byte) -1);
}
}

上面的程序以int 数值-1 开始,然后从int转型为byte,之后转型为char,最后转型回int。第一个转型将数值从32 位窄化到了8 位,第二个转型将数值从8 位拓宽到了16 位,最后一个转型又将数值从16 位拓宽回了32 位。这个数值最终是回到了起点吗?

是不是想起了《看我七十二变》:

  看我七十二变

  今天新鲜改变再见

  美丽极限爱漂亮没有终点

  追求完美的境界

  人不爱美天诛地灭

  别气馁旧观念抛到一边

  现在就开始改变

  麻雀也能飞上青天

运行看结果吧

65535

为什么会这样呢?我们将程序一步步分开来看:

    public static void main (String[] args){
int i=-1;
byte b=(byte)-1; //
char c=(char)b; //
int r=(int)c; //
System.out.println(r);
}

第一步:int转byte

  byte b=-1 窄化后没有改变值

第二步:byte转char

  从byte 到char 的转型稍微麻烦一点,因为byte 是一个有符号类型,而char是一个无符号类型。在将一个整数类型转换成另一个宽度更宽的整数类型时,通常是可以保持其数值的,但是却不可能将一个负的byte 数值表示成一个char。因此,从byte 到char 的转换被认为不是一个拓宽原始类型的转换,而是一个拓宽并窄化原始类型的转换(widening and narrowing primitive conversion):byte 被转换成了int,而这个int 又被转换成了char

char c=65535//符号扩展

第三步:char转int

  int r=65535//零扩展

因为byte 是一个有符号的类型,所以在将byte 数值-1 转换成char 时,会发生符号扩展。作为结果的char 数值的16 个位就都被置位了,因此它等于2的16次方-1,即65535。

从char 到int 的转型也是一个拓宽原始类型转换,它将执行零扩展而不是符号扩展。作为结果的int 数值也就成了65535,

这正是程序打印出的结果。

深入:java如何七十二变?

jls-5强制类型转换,定义标识如下:

- 表示不运行任何强制类型转换

≈ 表示标识抓获(§5.1.1)

ω 表示拓宽基本类型转换 (§5.1.2)

η 表示窄化基本类型转换 (§5.1.3)

ωη 表示拓宽和窄化类型转换 (§5.1.4)

⇑ 表示拓宽引用类型转换 (§5.1.5)

⇓ 表示窄化引用类型转换(§5.1.6)

⊕ 表示装箱转换 (§5.1.7)

⊗表示拆卸类型转换 (§5.1.8)

到基本类型的强制类型转换

到引用类型的强制类型转换

更详细的资料请参照JSL5描述,链接地址见参考资料【3】

参考资料

【1】https://baike.baidu.com/tashuo/browse/content?id=1275b5b5f23ff153017f164c&fr=qingtian&lemmaId=11061

【2】https://baike.baidu.com/item/%E4%B8%83%E5%8D%81%E4%BA%8C%E5%8F%98/11061?fr=aladdin#2_2

【3】https://docs.oracle.com/javase/specs/jls/se12/html/jls-5.html

【4】java解惑

孙悟空的七十二变是那般?--java类型的七十二变揭秘的更多相关文章

  1. OAF_开发系列26_实现OAF中Java类型并发程式开发oracle.apps.fnd.cp.request(案例)

    20150730 Created By BaoXinjian

  2. [转]oracle数据类型和对应的java类型

    地址: http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/java.102/B19275-03/datacc.htm ...

  3. [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. JAVA类型信息——反射机制

    JAVA类型信息——反射机制 一.反射机制概述 1.反射机制:就是java语言在运行时拥有的一项自我观察的能力,java通过这种能力彻底了解程序自身的情况,并为下一步的动作做准备. 2.反射机制的功能 ...

  5. JAVA类型信息——Class对象

    JAVA类型信息——Class对象 一.RTTI概要 1.类型信息RTTI :即对象和类的信息,例如类的名字.继承的基类.实现的接口等. 2.类型信息的作用:程序员可以在程序运行时发现和使用类型信息. ...

  6. Java类型

    Java类型    本地类型         描述boolean    jboolean       C/C++8位整型byte       jbyte          C/C++带符号的8位整型c ...

  7. Oracle数据类型对应Java类型

    SQL数据类型 JDBC类型代码 标准的Java类型 Oracle扩展的Java类型   1.0标准的JDBC类型:     CHAR java.sql.Types.CHAR java.lang.St ...

  8. Java JDBC中,MySQL字段类型到JAVA类型的转换

    1. 概述 在使用Java JDBC时,你是否有过这样的疑问:MySQL里的数据类型到底该选择哪种Java类型与之对应?本篇将为你揭开这个答案. 2. 类型映射  java.sql.Types定义了常 ...

  9. JDBC、Hibernate、Java类型对照表

    Hibernate映射类型 java类型 标准SQL类型 integer java.lang.Integer integer long java.lang.Long bigint short java ...

随机推荐

  1. ThreadLocal可以解决并发问题吗?

    前言 到底什么是线程的不安全?为什么会存在线程的不安全?线程的不安全其实就是多个线程并发的去操作同一共享变量没用做同步所产生意料之外的结果.那是如何体现出来的呢?我们看下面的一个非常经典的例子:两个操 ...

  2. Win10环境下安装压缩包版本MySQL-8.0.13

    准备工作 系统环境:Windows 10 1803版本: 压缩包:MySQL-8.0.13 Windows zip包下载: 安装过程 1. 加载安装包到你的安装目录 将下载的MySQL压缩包解压并移到 ...

  3. String类中intern方法的原理分析

    一,前言 ​ 昨天简单整理了JVM内存分配和String类常用方法,遇到了String中的intern()方法.本来想一并总结起来,但是intern方法还涉及到JDK版本的问题,内容也相对较多,所以今 ...

  4. hdu-6621 K-th Closest Distance

    题目链接 K-th Closest Distance Problem Description You have an array: a1, a2, , an and you must answer ...

  5. gym/102059 E

    gym/102059 待通过:A.D.G.J.M 已补过:E E:电路题,判断一个图是不是简单电路.不需要特殊的技巧,利用set存图,把度数为2的点都删掉,融入到一条边上即可. #include &l ...

  6. 【LeetCode】116#填充同一层的兄弟节点

    题目描述 给定一个二叉树 struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; } 填充 ...

  7. Vue 利用指令实现禁止反复发送请求

    前端做后台管控系统,在某些接口请求时间过长的场景下,需要防止用户反复发起请求. 假设某场景下用户点击查询按钮后,后端响应需要长时间才能返回数据.那么要规避用户返回点击查询按钮无外乎是让用户无法在合理时 ...

  8. AWGN

    高斯白噪声的功率谱密度服从均匀分布,幅度分布服从高斯分布: 白噪声是指它的二阶矩不相关,一阶矩为常数,是指先后信号在时间上的相关性: 高斯白噪声在任意两个不同时刻上的随机变量之间,不仅是互不相关的,而 ...

  9. android 百度地图入门01 (史上最详没有之一)

    最近一直和百度地图打交道,写几篇博客记录一下吧,目前最新版是4.0的 ,之前我用的是3.7的, 就以4.0的为例说一下最基本的配置流程吧. 一.准备工作 1.申请一个百度地图开发者账户--地址:htt ...

  10. TabHost创建的2种方式

    一.如果是自定义TabHost步骤如下 1.必须给tabHost跟标签设置一个android:id="@android:id/tabhost"> 2.必须创建TabWidge ...