关于数据类型强制转换的学习——java基础

基于数字的强制转换

隐式强制转换
可以通过两种方式进行强制转换。当源类型的范围小于目标类型时,会发生隐式强制转换。

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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值