13 变量类型 :运算时,补码运算,运算器不知道符号位,自动溢出
long 64bit 9964L(l)
double 64bit 123.13D(d) 或e3
float 1123.f
double/0=Infinite或-Infinite
char unicode 16位
都是有符号的。
>>不认识符号位
>>>符号位不动
instanceof 对象或其子类的对象
break 可以带标号,一次跳出多层循环;
强制类型转换和自动类型转换 ,
|
无论在C/C++还是在Java,强制类型转换已经不是陌生的概念了。但是要想全面掌握Java中类型转换的要点可不那么简单,本文将带领大家一同了解有关Java类型转换的所有要点。 数值类型的类型转换 众所周知,Java有两种数据类型:基本数据类型与引用数据类型;Java又有两种基本的类型转换原则:拓宽转换原则(widening conversion)与缩小转换原则(narrowing conversion)。 byte short int long float double (long转float会失真) 当目标类型的范围比源类型的范围大时遵循拓宽转换原则,不必强制转换。如: |
short s = b;
反之则遵循缩小转换原则,即
当目标类型的范围比源类型的范围小时遵循缩小转换原则,必须强制转换。如:
short s = 10;
byte b = (byte)s;
需要注意的是拓宽转换原则不丢失数据。如:
缩小转换原则在超出目标类型的取值范围时会导致数据丢失。如:
上例输出结果为:
转换前:257
转换后:1
字符类型与数值类型之间的转换
基本数据类型char等同于一个无符号短整型,范围从0x0000到0xFFFF。
从其它数值类型转换到char类型时,必须进行强制转换。如:
将char类型转换成其它数值类型时,除byte、short必须强制转换外,int long float double均不必强制转换。如:
引用类型的类型转换
引用类型的赋值常见于具有继承关系的两种类型的转换。如下面的例子:
当目标类型与源类型存在父子关系时,不必强制转换。
上例是一个典型的多态。但如果要从父类引用转换成子类引用,即
当源类型与目标类型存在父子关系时,必须进行强制转换。如:
当然,如果子类引用指向的是一个父类对象,转换时会抛出ClassCastException异常。(真实的父对象不能转化为子对象)
进一步,如果要从一个引用类型转换成不相关的另一个引用类型,即
当源类型与目标类型不存在父子关系时,转换无法进行,编译时会出现错误。
数值类型与包装类之间的转换
JDK1.5之后引入了自动装箱的概念。也就是说
将一个基本数据类型转换到对应的引用类型时,不必强制转换。如:
int i = 10;
Integer iObj = i;反之亦然。即
将一个基本数据类型的引用类型转换到基本数据类型时,不必强制转换。
Integer iObj = new Integer(10);
int i = iObj;//运行时可能异常,因为实际是i=iObj.value(),iObj为null时,会异常。
表达式中的类型提升原则
在算术运算和位运算中,数值类型的数据按以下原则进行类型提升:
byte、short和char型自动转成int型;如:
如果有一个操作数是long型,则整个表达式的结果用long型表示;如:
位运算不能操作float及double类型,因此在算术运算中
如果有一个操作数是float型,则整个表达式的结果用float型表示;如:
如果有一个操作数是double型,则整个表达式的结果用double型表示。如:
特殊的类型提升
Java表达式中有一种特殊的表达式,? 表达式。? 表达式是一个特殊的赋值表达式,它会按照算术运算中的类型提升原则将 : 两端的操作数提升至统一的类型。如:
byte b = 10;
short s = 20;
int i = (b == 10) ? b : s;
需要指出的是
如果 : 两端有一个操作数是引用类型,则整个表达式的结果用Object型表示。
int i = 10;
String str = "Hello";
Object obj = (i == 10) ? i : str; // 在这里变量i进行了自动装箱操作
本文详细介绍了Java中的类型转换原理,包括基本数据类型间的转换规则、引用类型间的转换、数值类型与包装类之间的转换以及表达式中的类型提升原则等内容。
7591

被折叠的 条评论
为什么被折叠?



