黑马程序员技术交流社区

标题: 关于最基础的java变量中的自动和强制类型提升中一些问题 [打印本页]

作者: laugh    时间: 2014-9-15 23:02
标题: 关于最基础的java变量中的自动和强制类型提升中一些问题
[qq]354017992[/qq]
各位大神晚上好,我一个零基础自学java的新人有个不懂的地方想问下大家,如果感觉问的太幼稚,请轻喷。:)
我自学是看的毕老师的视频,在看到变量与常量的时候有点迷惑

如题
在变量自动和强制类型转换中,同一个字母x,表达的意思不一样,这样不冲突吗?如果有多个定义,那么x该取哪个值?例如:
数据类型    变量名=初始值
int    x=3
x=x+3,


可不可以有x=x+y?若可以,那么java会取两个x钟哪一个?

作者: 臭和尚    时间: 2014-9-15 23:02
二楼说的正确,x = x +3与数学中的未知数不同,定义一个变量,这个变量就类似于一个容器

int    x=3
x=x+3,
等式右边就好比水,左边就好比杯子,int  x=3,就等同于把3个量的水加到x这个杯子里,
x=x+3,此时右边的杯子中有3个量的水,再加3个量的,倒入到左边的杯子里。
这个就是赋值运算,和传统数学中的未知数不同
作者: ooEye    时间: 2014-9-15 23:17
变量名是唯一的,对于int x = 3; x = x+2;表示取出x的值3,加上2,然后将结果再存到x。你可以认为x是一个存放东西的盒子
作者: Kevinneo    时间: 2014-9-15 23:54
可以,最后结果会赋值给等号左边的x
作者: cherry@cookie    时间: 2014-9-16 01:25
类型转换,你写的不会发生类型转换,因为x为int型,x+3仍为int型,所以不存在类型转换,如果定义byte  x=3      ;x=x+3会发生自动类型转换,如果定义char     x=‘3’;int   y=(int)(x+3);会发生强制类型转换,纯手机打字,有错的地方望见谅,毕老师的视屏讲的很详细,多看看就理解了。
作者: cherry@cookie    时间: 2014-9-16 01:27
自动类型转换byte,short,->int
作者: liuxiang    时间: 2014-9-16 09:11
强制转换只需理解成不同类型的变量,位数少的转换成位数多的变量类型进行运算
作者: 夕默    时间: 2014-9-16 10:07
你可能是第一次接触编程语言,其实,在计算机运算诸如x=x+2的计算公式时,是先运算x+2,再将x+2的计算结果赋给x。(从右往左进行运算)这个还涉及到运算符运算的优先级问题。楼主可以看看优先级的相关知识,这样理解x=x+2相对清晰些。
其次,这里的x是一个内存单元的名字,这里的x所代表的内存单元里面所放的内容是可以读可取的。计算机在进行x=x+2处理时,首先计算x+2,这时在内存中读出x的初始值3,然后将3加上2的结果5赋给x(x=5)。

以后还会涉及到深一点的诸如difine宏定义的内容(貌似这个很喜欢考),懂得了计算机是怎么处理的就好理解多了。
作者: 夕默    时间: 2014-9-16 10:19
如果你已经定义了x,也定义了y,这两个值都是有效值,那么先取x与y进行和运算,再将结果赋给x。其实这两个x代表的是一个内存空间位置。“=”这个赋值运算将x的原始值覆盖掉了。
作者: ouz123456m    时间: 2014-9-16 11:17
看了你的问题,感觉你应该是对变量的在内存中的存储原理还不是很清楚!下面我发表我的一点拙见,希望能够对你有些帮助。
首先,当你在int x = 3时,java虚拟机会在内存中开辟出一块空间用来存储int类型的数据,而你给其赋了一个初值3,你要知道变量一旦创立出来了它就总在内存中占了一个存储数据的位置(直到被java虚拟机回收或者程序终止),然而这个存储位置上的存储的数据是可以改变的,你最初给其赋了一个初值3,然而下面你想要改变这个变量的值,你可以将其再赋另外的值比如:5(x = 5),这样最初那个值3就会被消除而5这个值就会被添加在这个位置上。
作者: AlanHand    时间: 2014-9-16 12:11
其实就是一句话,编译器先从右边开始编译,也就是说先从右边开始运算,当运算右边的时候谁知道左边有一个同样的变量呢,等右边运算完在看左边,这才发现左边的也是同一个变量,那又怎样呢?右边的运算已经结束了
作者: 十万一千    时间: 2014-9-16 16:34
你的提问让我比较困惑,首先,一个变量标识符在它的作用域范围内是不可能出现二义性,如果有,那么至少会产生一个编译时错误;还有,你说的 如果有多个定义,我不太明白是什么意思,假设是一个标识符被重复定义了,并且通过编译了,那么在这些若干定以后使用它肯定是取最后一次定义的结果的。
作者: Minemineㄟ无心    时间: 2014-9-16 17:48
往往编程里的“=”你可以看成是赋值符号,这里的x就是一个无名变量,右边给它=个什么,它就变成了什么,所以最终JAVA只取进过计算后的左边的x,右边的只是算法的一部分,不是最终结果。现在,应该比较通俗易懂了吧。
作者: lanzy1989    时间: 2014-9-16 21:07
黑马币给不给啊。。。
作者: MR.J    时间: 2014-9-16 21:07
其实这种问题没必要用黑马币来提问,你发了一般会有人给你回复。黑马币不好挣的。以后要用来换技术分为好。
还有就是,x的类型会取哪一个,这题中的两个x类型是一样的,所以不会区分。

如果有多个类型的定义,最终取什么样的类型,会在运行过程中有语句体现,比如int型的x,最终要与double型的y相加,要看要求最终保留什么类型的,如果要保留int型的,你就把double型的y用    (int)b强转就行了。你不用想太复杂。

作者: 黑马的小菜鸟    时间: 2014-9-17 13:10
关于基本类型转化与提升问题

1、自动类型转换:

也成为隐式类型转化。当一个“小”(指范围小)数据与“大”数据进行运算时,java默认会向“大”数据方向转换,然后再运算,如上面的程序中的运算,就是讲i = 5转为i = 5.0在和f进行运算,然后再提升为double类型。

注:

a.所有byte、short、char类型的值将提升为int类型。

b.自动类型转换关系:byte -->short(char) -->int -->long -->float -->double

2、强制类型转换:

和自动转换类型相反,格式:int i = (int)6.53;,就是将“大”数据强转为“小”数据。

注:

a.会损失精度,如6.53转完后为6,会将小数点后的值去除,只保留整数位。

b.强制类型转换关系:double -->float -->long -->int -->short(char) -->byte

c.对于int m = (int)'a';//结果为97,因为a在ASCll码中的值为97。
作者: yingsun    时间: 2014-9-18 01:17
定义变量最后赋给的值才会保留,之前的就会消失了。所以按程序的运行顺序,最后面赋给的值就是变量的值。
作者: jtshawn    时间: 2014-9-20 10:31
所谓变量,就是内存里面的一个区域,用来存储数据的。举个例子,变量就好比一个透明的盒子,里面可以放置你事先安排好的东西,比如放水果。当你放苹果在里面的时候,它就是苹果,但是后面我想要放个梨进去,所以就得把苹果拿走,然后才能放梨进去。

关于lz问的: int x = 3;  x = x + 3;  或  x = x + y;  取值的问题,就是先把3存到x里面。然后x = x+3;这个语句要先运算x+3,然后运算结果在赋给x。  x =x+y; 也是同理。


ps  我也是看毕老师视频自学的,比你提前了一点,以后有什么问题,可以来多多交流。
作者: 高泳    时间: 2014-9-20 13:06
可以有x=x+y,前提是要定义x,y,将x,y的值相加赋值给x。
强制转换在x,y的类型不同是使用。
作者: 暴风    时间: 2014-9-20 15:57
x当然取最近被付的值
作者: hike_2008    时间: 2014-9-21 11:20
ooEye 发表于 2014-9-15 23:17
变量名是唯一的,对于int x = 3; x = x+2;表示取出x的值3,加上2,然后将结果再存到x。你可以认为x是一个存 ...

好吧, 能说你的头像比回答更好么
作者: yueyazhishang    时间: 2014-9-22 14:16
黑马币。。
作者: 九零零    时间: 2014-9-22 22:39
没有搞懂楼主说的“在变量自动和强制类型转换中,同一个字母x,表达的意思不一样”这句话的意思;x=x+3是把x的值加上3之后再赋值给x,这时x的值是6.   x=x+y的值同样是把x和y的值进行加法运算后赋值给x。
作者: 荣英洁    时间: 2014-9-23 19:36
x=x+y   表示先把x+y 的值进行相加,然后把相加后的值赋给 x
作者: xizhiqiang    时间: 2014-9-23 23:15
本帖最后由 xizhiqiang 于 2014-9-23 23:17 编辑

在这种情况下,取值取得都是等号右边的值,变量自动转换是低位向高位转换,例如你定义的long类型,但是你赋值是int类型的,则会转换为long类型的即系统会自动类型转换;把高位赋值给低位的时候必须要强制类型转换,
作者: xizhiqiang    时间: 2014-9-23 23:18
x=x+y,java若取的话肯定会取左边的x,
作者: 崔小旭    时间: 2014-9-24 11:28
不可以,它会报找不到符号因为你没有定义y,如果定义了y就可以这样写。int    x=3,意思是将3赋值给x,同理:x=x+3,意思就是将x+y的值重新赋值给x。你说的这种情况x最后得取值是你最后给x赋的值
如果定义了多个int x;看你定义在局部还是成员位置在JAVA中存在着访问顺序的,先访问局部变量在访问成员变量,在访问父类的成员变量一直找到object。
作者: 崔小旭    时间: 2014-9-24 11:31
标题: RE: 关于最基础的java变量中的自动和强制类型提升中一些问题
)类型转换
                A:boolean类型不参与转换。
                B:隐式转换(从小到大)
                        byte,short,char -- int -- long -- float -- double
                C:强制转换(从大到小)
                        格式:
                                (数据类型)数据;

作者: 崔小旭    时间: 2014-9-24 11:36
char,short,byte三者之间做运算会自动提升成int类型;强制转换就是将一种类型强制转换成另一种类型除隐士转换外,格式(byte)int,隐士转换会损失精度
作者: 肖建伟    时间: 2014-10-5 10:27
看到大家回复都比较详细了!总之,记住等号左边是赋完值的结果。
作者: 紫缘ぶ逸影    时间: 2014-10-10 10:54
=是赋值运算  就是  右边的表达式 运算出来的结果 赋值给=左边的变量  
==是等于的意思  就是两边进行比较




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2