1.原型数据byte,short,int,long,float,double,char,boolean,先看一下基本类型介绍:
基本型别 | 大小 | 最小值 | 最大值 |
boolean | ----- | ----- | ------ |
char | 16-bit | Unicode 0 | Unicode 2^16-1 |
byte | 8-bit | -128 | +127 |
short | 16-bit | -2^15 | +2^15-1 |
int | 32-bit | -2^31 | +2^31-1 |
long | 64-bit | -2^63 | +2^63-1 |
float | 32-bit | IEEE754 | IEEE754 |
double | 64-bit | IEEE754 | IEEE754 |
void |
小类型数据可以直接赋给大类型数据例如
int a=1;byte b=2;short c=3;float d=3;double e=4;char f='a';boolean g=true;long l=10;
c=b;
a=f;
d=a;
e=d;
byte型数据不能直接赋给char型数据,因为byte表示的是8位有符号数,而char表示的是16位无符号数。同理short型数据(16位有符号数)与char型数据也不能直接通过赋值转换。
boolean不能与其他任何原型数据转换。
2.大类型数据可以强制转换成小类型数据。
如b=(byte)a;c=(short)a;a=(int)l;b=(byte)f;
3.原型数据的数组没有大小之分,不可相互转换,例如
byte[] ba;
short[]sa;
ba=sa或sa=ba;都是错的,强制转换也不行。
4.对象类型数据的转换
Object类型变量可以直接引用任何类型的对象,具有继承关系的类之间,父类型(大类类型)变量可以直接引用子类型(小类类型)对象,在父类类型的引用变量引用的是子类类型对象或者子子类类型对象时,该引用变量才可以强制转换成对应的子类类型引用。一句话要看该引用变量所引用的具体对象的类型能不能强制转换成目的类型。举例说明如下
正确的转换:
Object oa=new Integer(5);
Integer ia=(Integer)oa;
oa引用的是Integer类型对象,Integer类型引用ia当然可以指向它。
错误的转换:
Object oa=new Object();
Integer ia=(Integer)oa;
oa引用的是Object类型对象,Integer类型引用ia不能指向它的父类类型的对象。
正确的转换:
class A{
}
class B extends A{
}
class C extends B{
}
Object oa=new C();
B b=(B)oa;
oa引用的是C类类型对象,而类C继承了类B,所以B类型引用b可以指向它的子类类型的对象。
5.对象数组的转换关系和类的转换关系一样。
如果B类继承了A类,则
B[]b=new B[2];
A[]a;
a=b;
正确。
A[]a=new B[2];
B[]b;
b=(B[])a;
也是正确的。
6.接口向类(Object类除外)转换一定要用强制转换,不同类型的接口之间可以用强制转换。举例说明如下,
interface A{
}
interface B{
}
class C implements A{
}
class D extends C implements B{
}
A a=new D();
C c=(C)a;//使用了强制转换
A b=new C();
Object o=b;//对于Object没有使用
B c=new D();
A d=(A)c;//这里要用强制转换