自动转换和强制转换

2019-02-16  本文已影响1人  竹鼠不要中暑

数据类型的转换,分为自动转换和强制转换。自动转换是程序在执行过程中“悄然”进行的转换,不需要用户提前声明,一般是从位数低的类型向位数高的类型转换;强制类型转换则必须在代码中声明,转换顺序不受限制。

自动转换

布尔型和其它基本数据类型之间不能相互转换

自动转换按从低到高的顺序转换。不同类型数据间的优先关系如下:
低--------------------------------------------->高
byte,short,char-> int -> long -> float -> double

运算中,不同类型的数据先转化为同一类型,然后进行运算,转换规则如下:

操作数1类型 操作数2类型 转换后的类型
byte、short、char int int
byte、short、char、int long long
byte、short、char、int、long float float
byte、short、char、int、long、float double double

基本数据的类型在平时写代码中很常见了,比如调用方法时的参数传递。再举个小例子:

        double i = 1/3;
        double j = 1.0/3;
        System.out.println(i); // 0.0
        System.out.println(j); // 0.3333333333333333

这是因为,1/3两个操作数都为int,则运算结果也为int1整除3结果为00再转换为double则为0.0,因此i=0.0;而1.0/3,操作数一个为double,一个为int,运算结果为double,因此j= 0.3333333333333333

强制转换

自动转换是有规则的(从小到大),如果不想遵守这种规则,从大到小,从高到低,就需要强制换了。

  1. 条件是转换的数据类型必须是兼容的。
  2. 格式:(type)valuetype是要强制类型转换后的数据类型。
    举例:
        int a = 97;
        System.out.println((char) a); // a

字符a的十进制Unicode码为97.

引用类型转换

上面的自动转换和强制转换的规则对引用类型的转换也适用,从小到大,父类为大,子类为小。

其实就是一个很简单的道理,猫是动物(自动转换),动物却不一定是猫(不能自动转换)。

public class Animal {
    private String name;

    public Animal(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }
}
public class Cat extends Animal{
    public Cat(String name) {
        super(name);
    }
}
public class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }
}
        Animal cat = new Cat("喵"); //自动转换 让动物变量cat为猫
        Cat cat1 = new Cat("喵喵"); 
        Animal cat2 = cat1; // 自动转换 让动物变量cat为猫
        System.out.println(cat.getName()); // 喵
        System.out.println(cat2.getName()); // 喵喵
        Cat cat = new Cat("喵");
        Animal cat1 = cat;
        Cat cat2 = (Cat) cat1;
        Dog dog = (Dog) cat1;
        System.out.println(cat2.getName()); // 喵
        System.out.println(dog.getName()); // Error:(10, 25) java: 不兼容的类型: Cat无法转换为Dog

上面说到,强制转换也是有条件的:转换的数据类型必须是兼容的,因此Cat无法转换为Dog。

另外,java也可以利用instanceof关键字判断是一个实例对象是否属于一个类,是返回true,否则返回false
语法:

实例 instanceof 类

要说明的一点是,强制类型因为是从大到小的转换,因此存在风险,可能会精度丢失或内存溢出。

上一篇下一篇

猜你喜欢

热点阅读