关于Java的隐含强制类型转换的问题

IncRediblE 发布于 2014/04/24 10:14
阅读 587
收藏 0

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

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

    byte a = 1;

但要是这样:

    void test(byte num){}

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



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



加载中
0
j
jackyyuxu

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

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

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

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

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

这个编译器会把错的 

The method test(byte) in the type Post is not applicable for the arguments (int)

IncRediblE
IncRediblE
你怎么不说我去问问orical
Simeone
Simeone
回复 @IncRediblE : 这个你可以问问高斯林
IncRediblE
IncRediblE
是啊,所以明白我的问题么?
0
闲尘
闲尘

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

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

类型转换和提升在编译期完成,和jvm没有关系。

IncRediblE
IncRediblE
好,我修改下,应该问java的编译器机制
0
Lyuans
Lyuans

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

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