基于数字的强制转换
隐式强制转换
可以通过两种方式进行强制转换。当源类型的范围小于目标类型时,会发生隐式强制转换。
byte byteVar = 42;
short shortVar = byteVar;
int intVar = shortVar;
long longVar = intvar;
float floatVar = longVar;
double doubleVar = floatVar;
显式强制转换
当源类型的范围大于目标类型时,必须执行显式强制转换。
double doubleVar = 42.0d;
float floatVar = (float) doubleVar;
long longVar = (long) floatVar;
int intVar = (int) longVar;
short shortVar = (short) intVar;
byte byteVar = (byte) shortVar;
将浮点数(float、double)强制转换为整数时,数字会向下取整。
数值计算自动转换
static void testNumericPromotion() {
char char1 = 1, char2 = 2;
short short1 = 1, short2 = 2;
int int1 = 1, int2 = 2;
float float1 = 1.0f, float2 = 2.0f;
int1 = char1 + char2;
int1 = short1 + short2;
int1 = char1 + short2;
float1 = short1 + float2;
int1 = int1 + int2;
}
数值计算非自动转换
布尔类型不能强制转换为任何其他基元类型或从任何其他基基元类型强制转换。
通过使用Unicode指定的代码点映射,可以将字符强制转换为任何数字类型。字符在内存中表示为一个无符号的16位整数值(2个字节),因此转换为字节(1个字节)将丢弃其中的8个位(这对ASCII字符来说是安全的)。Character类的实用方法使用int(4个字节)来向代码点值传递值,但短的(2个字节)也足以存储Unicode代码点。
int badInt = (int) true;
char char1 = (char) 65; // A
byte byte1 = (byte) 'A'; // 65
short short1 = (short) 'A'; // 65
int int1 = (int) 'A'; // 65
char char2 = (char) 8253; // ‽
byte byte2 = (byte) '‽'; // 61 截断的代码指向ASCII范围
short short2 = (short) '‽'; // 8253
int int2 = (int) '‽'; // 8253
对象之间的转换
同基本数据类型一样对象也可以显式和隐式转换。
当源类型扩展或实现目标类型(转换为超类或接口)时,会发生隐式转换。
当源类型由目标类型扩展或实现时,必须执行显式强制转换(强制转换为子类型)。当被强制转换的对象不是目标类型(或目标的子类型)时,这可能会产生运行时异常(ClassCastException)。
Float floatVar = new Float(42.0f);
Number n = floatVar; //隐式(浮点赋值数字)
Float floatVar2 = (Float) n; //隐式
Double doubleVar = (Double) n; //产生异常(对象不是Double)
测试是否可以使用instanceof强制转换对象
Java提供instanceof操作符来测试对象是属于某个类型还是属于该类型的子类。然后,程序可以相应地选择强制转换或不强制转换该对象。
Object obj = Calendar.getInstance();
long time = 0;
if(obj instanceof Calendar)
{
time = ((Calendar)obj).getTime();
}
if(obj instanceof Date)
{
time = ((Date)obj).getTime(); //这一行永远不会到达,obj不是日期类型。
}
语法
TargetType target = (SourceType) source;