类型转换的种类
(1). 简单基本数据类型之间的转换
(byte,short,char)--int--long--float--double
●低级到高级的自动类型转换
①下面的语句可以在Java中直接通过:
byte b;
int i=b;
long l=i;
float f=l;
double d=f;
②如果低级类型为char型,向高级类型(整型)转换时,会转换为对应ASCII码值,例如
char c='c';
int i=c;
System.out.println("output:"+i);
输出:output:99;
③对于byte,short,char三种类型而言,他们是平级的,因此不能相互自动转换,可以使用下述的强制类型转换。
short i=99 ;
char c=(char)i;
System.out.println("output:"+c);
输出:output:c;
byte,short,int三种类型都是整型,因此如果操作整型数据时,最好统一使用int型
④对象多态中若有方法:
f(byte x){……};
f(short x) {……};
f(int x) {……};
f(long x) {……};
f(float x) {……};
f(double x) {……};
又有:char y=’A’;那么,语句f(y)会调用哪一个方法呢?答案是:f(int x) {……}方法,因为它的形参比实参“大”且是最“接近”的。
●高级到低级的强制类型转换
-----可能会导致溢出或精度的下降
①当字节类型变量参与运算,java作自动数据运算类型的提升,将其转换为int类型。
byte b;
b=3;
b=(byte)(b*3);//必须声明byte。
②带小数的变量默认为double类型。
float f;
f=1.3f;//必须声明f。
●包装类过渡类型转换
①当希望把float型转换为double型时:
float f1=100.00f;
Float F1=new Float(f1);
double d1=F1.doubleValue();//F1.doubleValue()为Float类的返回double值型的方法
②当希望把double型转换为int型时:
double d1=100.00;
Double D1=new Double(d1);
int i1=D1.intValue();
简单类型的变量转换为相应的包装类,可以利用包装类的构造函数。即:
Boolean(boolean value)、Character(char value)、Integer(int value)、Long(long value)、Float(float value)、Double(double value)
而在各个包装类中,总有形为××Value()的方法,来得到其对应的简单类型数据。利用这种方法,也可以实现不同数值型变量间的转换,例如,对于一个双精度实型类,intValue()可以得到其对应的整型变量,而doubleValue()可以得到其对应的双精度实型变量。
(2). 字符串与其它数据类型的转换
●其它类型向字符串的转换
①调用类的串转换方法:X.toString();
String s = Integer.toString(6);
Integer为基本数据类型int的包装类,提供了一些实用的方法,其它基本数据类型也有类似的包装类,
例如:Float、Boolean、Character、Double、Short、Byte、Long
②自动转换:X+“”;
例如:String s=""+a[0]+a[1]+a[2]+a[3];
③使用String的方法:static String valueOf( T X);
T为boolean、char、char []、double 、float、int、long、Object
●字符串作为值,向其它类型的转换
①先转换成相应的封装器实例,再调用对应的方法转换成其它类型
例如,字符中“32.1”转换double型的值的格式为:
new Float(“32.1”).doubleValue()。也可以用:Double.valueOf(“32.1”).doubleValue()
②静态parseXXX方法
String s = "1";
byte b = Byte.parseByte( s );
short t = Short.parseShort( s );
int i = Integer.parseInt( s );
long l = Long.parseLong( s );
Float f = Float.parseFloat( s );
Double d = Double.parseDouble( s );
③Character的getNumericValue(char ch)方法
(3). 其它实用数据类型转换
引用类型间的转换有自动类型转换和强制类型转换两种。对于类引用类型,只有具有继承关系的类,即父类与子类之间,才可以进行类型的转换。
当引用了某个子类的变量对引用该子类的父类的变量赋值时,会自动进行类型的转换;反之,父类对子类进行赋值时则需要进行强制类型转换。
例如,A为父类,B、C分别继承自类A,分别定义引用这3个类的变量,然后进行各种赋值操作。
定义引用变量:
- Object obj = new Object();
- A objA = new A();
- B objB = new B();
- C objC = new C();
● 子类对父类进行赋值:
- obj = objA; //编译成功,将类A赋给直接父类Object,会自动进行类型转换
- obj = objB; //编译成功,将子类B赋给间接父类Object,会自动进行类型转换
- objA = objC; //编译成功,将子类C赋给直接父类A,会自动进行类型转换
● 父类对子类进行赋值:
- objA = obj; //编译出错,将父类Object赋给直接子类A时,需要强制类型转换
- objA = (A)obj; //编译成功
- objB = obj; //编译出错,将父类Object赋给间接子类B时,需要强制类型转换
- objB = (B)obj ; //编译成功
- objC = objA; //编译出错,将父类A赋给直接子类C时,需要强制类型转换
- objC = (C)objA; //编译成功
● 两个子类间的赋值:
如果两个不同的子类继承自同一个父类,那么这两个子类之间也不能进行类型转换,因为它们之间没有直接或间接的继承关系。
- objB = objC; //编译出错,不能从C类型自动转换为B类型
- objB = (B)objC; //编译出错,不能从C类型强制转换为B类型
● 如果声明了一个父类型的变量,但使其引用子类对象,在编译时,java编译器是根据变量被显示声明的类型去编译,因此该变量的类型被看作父类类型。然后将其进行强制类型转换并赋给引用了另一个子类对象的变量时编译成功,但运行时将抛出java.lang.ClassCastException异常,因为这个变量实际引用的是子类对象,两个子类属于不同的类型,也没有继承关系,所以不能将一个子类强制转换为另一个子类。
- A objAA = new C(); //objAA变量被显示声明为A类型
- objB = (B)objAA; //编译时,objAA的类型被视为A类型,所以编译成功
- //但运行时抛出java.lang.ClassCastException异常
对于引用类型中的数组引用类型,任何两个不同类型的数组之间不能进行类型的转换,但可以将数组转换为java.lang.Object类。
例如:
- Object objArray = new Object();
- int [] num_I = {1,2,3};
- long [] num_L = {4,5,6};
- num_I = num_L; //编译出错,数组引用类型间不能自动进行类型转换
- num_I = (int [])num_L; //编译出错,数组引用类型间不能进行强制类型转换
- objArray = num_I; //编译成功
- objArray = num_L; //编译成功