java类型转换详解(自动转换和强制转换)

Posted nianzhilian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java类型转换详解(自动转换和强制转换)相关的知识,希望对你有一定的参考价值。

自动转换

class Hello
{
	public static void main(String[] args)
	{
		//自动转换
		int a = 5;
		byte b = 6;
		int c = a + b;
		System.out.println(c);
	}
}

 a是int类型,b是byte类型 当二者进行加法运算时(根据同类型相加结果还是同类型) 由于int的范围比byte的取值范围大这个时候jvm会自动将b转换成int类型

强制转换

//强制转换
		int a = (int)8.8;

 强制转换就是将前面加上要转换的类型就可以了。

下面来看比较特殊的

class Hello
{
    public static void main(String[] args)
    {
        byte b = 3;//正确
        int x = 3;//正确
        b = x;//错误
        
    }
}

 

 上面代码在编译的时候会报错 常量3的类型为int   int类型可以赋值给byte的变量    但是b=x这个时候就不行了呢   因为根据常量优化机制  这种方式只针对 常量  不针对变量 也就是说大范围的不能赋值给小范围  除非用强制转换类型

在看下面的也遵循上面的原则

class Hello
{
	public static void main(String[] args)
	{
		byte b1=3,b2=4,b;//正确
		b = b1 + b2;//错误   因为b1  b2这个时候是变量(常量优化机制只针对常量不针对变量)
		b = 3 + 4;//正确
		
	}
}

 

 在看一个例子

class Hello
{
    public static void main(String[] args)
    {
        
        short s = 1;
        s = s + 1;//错误

        和
        
        short s = 1;
        s+=1;//正确
    }
}

 

 上面的代码从表面上看是没什么区别的 为什么第二种写法就正确了呢?

第一种算的时候  会将s自动转换为int类型在进行加法运算(低精度转高精度)  然后得出的结果是int类型  在赋值给short类型 这样是不合适的(高精度不能赋值给低精度类型)所以会报错 正确的写法如下面代码

class Hello
{
	public static void main(String[] args)
	{
		
		short s = 1;
		s = (short)(s + 1);

		System.out.println(s);
	}
}

 那第二种为什么是可行的呢?

因为+=、-+、*=、/=  这些运算符比较特殊  本身就具有强制类型转换的作用。

 

以上是关于java类型转换详解(自动转换和强制转换)的主要内容,如果未能解决你的问题,请参考以下文章

跟我20天学Java:02-自动类型转换,表达式的自动类型转换,强制类型转换

Java数据类型转换:强制类型转换+自动类型转换

Java 自动转换和强制转换

Java数据类型转换(自动转换和强制转换)

Java自动类型转换和强制类型转换(隐含)

今天聊一聊Java引用类型的强制类型转换