java中数据类型精度由小到大的顺序为:byte<short<int<long<float<double (我们知道boolean,不存在精度的说法,而char类型我们单独讨论)(坚持看完,看懂这篇文章 )
知识点1:实数类型默认是double , 整形类型默认是int
知识点2:精度小的类型自动转换精度大的类型;
知识点3:容量大的类型转换为容量小的类型时,要加强制转换符;
知识点4:byte,short,char之间不会互相转换,并且三者在计算时首先转换为int类型;(字符‘a’=97)
知识点5:如果进行 + - * / %运算的时候,最少会被提升为int。运算符的结果只可能为以下类型
int < long < float < double(这就需要转换了)
举例:1: byte a=1; (对)
2: int a=1; byte b=a; (错) 。需要改成byte b=(byte)a;才对。
我们先不管是怎么原理,从上面的代码我们知道可以把精度转换分成2种,一种是右面是数据类型常量(3,4,5.0等)
另一种就是右面是数据类型的变量(a+1,a等),下面类详解。
(结论一):如果是数据类型变量在运算与赋值,比如 int a=1; byte=(byte)a ,这是严格按照精度的的要求来转化的。而这种对于char类型来讲,char<int<long<float<double. 而char与byte、short 之间的赋值转换。必须强制转换。
(结论二):如果是数据类型常量在初始化,赋值。 比如 byte a=1; char c=97; 而此时你会发现与知识点1与知识点3矛盾了。(按理说,1是int,赋值给byte,必须强转。而现在不用强转)。
查找资料得知:可以这么说byte是int的子集,byte表示范围是-128-127;在这个范围内可以用整形常量(注意一定是整形常量不是整形变量)复制给byte类型的,这样做的目的就是为了节约更多的资源。
同理可得:byte a=127 ; short b =127 ; char c=127(只要赋的int值不超过类型的范围就不用强转,超过的话,比如byte a=(byte)128)。可能此时你会想到float a=4.5f 或者float a=(float)4.5。答案是他们之间不存在子集的说法,所以你还是老老实实的转换吧!而byte a='a'; short b='a'; int c='a';
由此可知:byte short char int 既可以赋值97 也可以赋值‘a’。而其他的按照精度表走就行了。
如有不懂或者错误之处,望朋友指出。经常在线