6
回答
关于Java的隐含强制类型转换的问题
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

Java隐含强制类型转换在何时发生?

目前知道的就是这样,比如:

    byte a = 1;

但要是这样:

    void test(byte num){}

    test(1); //需要将1强转为byte



所以,我想问的是隐含强制类型转换,java编译器机制到底怎么做的,为什么不在满足条件的所有情况都去这样处理?



举报
IncRediblE
发帖于4年前 6回/550阅
共有6个答案 最后回答: 4年前

在java中整数默认都是int型。

对于整数字面量,Java编译系统会自动匹配字面量的类型。第一行代码就是用字面量直接赋值

--- 共有 3 条评论 ---
jackyyuxu回复 @IncRediblE : 可以看一下这个 Java虚拟机提供几种进行整数算术运算的操作码,他们执行基于int和long类型的运算。当byte、short和char类型值参与算术运算时,首先会将它们转换为int类型。 操作码:iadd,从栈中弹出两个int类型数,相加,然后将所得int类型结果压回栈。 操作码:ladd,从栈中弹出两个long类型数,相加,然后将所得long类型结果压回栈 4年前 回复
jackyyuxu回复 @IncRediblE : 默认是int是指的运算。并不是指存储。 4年前 回复
IncRediblE好,终于让我catch到了这个point。那我还有一点不太明白的就是整数默认是int型,这个整数怎么体现呢。 4年前 回复

菜鸟表示:不知道问题问的是什么??

--- 共有 7 条评论 ---
IncRediblE@Jast 那是,问题都没看懂,着急回答什么?就你理解的那个层次,你以为别人不懂? 4年前 回复
666B回复 @IncRediblE : 原来我不懂啊 4年前 回复
IncRediblE@Jast 你不懂,就不要回答嘛 4年前 回复
666B回复 @IncRediblE : 这要你说?? 4年前 回复
IncRediblE回复 @Jast : 首先得弄明白我的问题,隐含类型转换的效果发生于何种情形。一般来说可以直接将int(当然是-128~127之间)值赋给byte变量,这里不需要强转,隐含的。但是当一个形参是byte类型,接受一个int值时,就不会发生隐含类型转换了。现在明白问题了么? 4年前 回复

问得是 JVM怎么工作的么?  好牛逼   菜鸟表示完全不懂

--- 共有 4 条评论 ---
IncRediblE回复 @闲尘 : 其实我比较困惑的地方是,Java本身有这个隐含类型转换,应该每个地方遇到相同的情况都应该触发隐含转换,事实是像我上面的简单举例一样,并没有这样做,所以想知道为什么 4年前 回复
闲尘回复 @IncRediblE : 又回头看了一下你的问题,什么时候隐式转换 都是标准定义的 就好像红绿灯一样 标准说不可以就不可以 当然 我不是学java的 具体什么时候可以转换 ,什么时候不可以转换 我无法回答... 4年前 回复
闲尘回复 @IncRediblE :这个问题很简单啊 词法分析器自动完成的 4年前 回复
IncRediblE我修改了下问题了,可以解释一下么 4年前 回复

各个数据类型 占 不同大小的字节  隐式转换是由占用字节数小的数据类型转占用字节数大的数据类型,相反就要进行 强转 ,现如LZ所说 因为int占的字节数比byte大所以要进行强转

--- 共有 2 条评论 ---
IncRediblE之前我看到一本书将转型分为3种,自动,强制,隐含。你说的那种分在自动,我说的这种分在隐含 4年前 回复
IncRediblE有一点得探讨下,我开始写的byte b = 1;这个其实也是隐转了,虽然都是说短位数向长位数会隐转,但实际在数值范围内,比如b是可以直接等于-128到127之间的数的,我们都知道默认整型是int。 所以对于这种隐转你是怎么理解的呢? 4年前 回复
顶部