<华清远见>类型的转换包括:1.基本数据类型的相互转换 2.String字符串与基本数据类型之间的转换 3.父子类之间的向上、向下转型。
前言
类型的转换可以大致分为
1.基本数据类型之间的自动转换、强制转换。
2.String字符串与基本数据类型之间的转换。
3.父子类之间的转换(向上、向下转型)。
一、基本数据类型
基本数据类型(简单数据类型)成员:
(1)整数类型 byte(字节)、short(短整型)、int(默认类型)、long(长整型)
(2)浮点类型 float(单精度浮点型)、double(双精度浮点型)【默认类型】
(3)字符类型 char
(4)布尔类型 boolean
基本数据类型位数(bit):
boolean byte char short int float long double
1 8 16 16 32 32 64 64
1.自动类型转换
整数类型和浮点类型,位数较小的都可以自动转换为位数较大的类型。(浮点型不能自动转换为整型)
其中有几个较为特殊:
int--->char 虽然int位数大于char位数,也可以实现自动类型转换,根据ASCII字节码对应关系进行转换
int--->float、long--->double 转换双方位数相同,可以自动类型转换,但会有精度损失
long--->float long整型所占位数虽然大于float类型,但也可以自动类型转换,同样会发生精度损失
例如以下两种形式均会发生自动类型转换:
int a=1;
double b=a; //int类型自动转换为double类型
double c=1;//默认为int类型,所以同上
注意:
1. 当byte、short、char类型进行运算操作时,会转化为int类型。
byte b1=1;
byte b2=1;
byte a=b1+b2; //错误,运算时转换为int型,int型不能自动转换为byte型
2.当参与运算的两个相关类型,不是同一类型时,结果为位数较大的类型。
int a=1;
double b=1.23;
double c=a+b; //不能用int类型承接
2.强制类型转换
对于无法自动转换类型的情况,也就是我们所说的大转小,可以通过强制措施实现类型的转换:
目标类型 变量名 = (目标类型)变量;
例如:
float a=1.23f;
int b=(int)a;
int c=(int)1.23f;
注意:
1.强制转换类型时可能会发生精度损失或者溢出。
int a=128;
byte b=(byte)a;
System.out.println(b); //byte范围为-128~127,所以发生溢出,输出值为-128
2.浮点数强制转换为整数时,是直接舍弃小数部分,而不是四舍五入
double a=1.99;
int b=(int)a;
System.out.println(b); //输出结果为1
3.String字符串与基本数据类型(不包括布尔类型)之间的转换
1.1 String--->整型、浮点型 :如int、double、float等等,利用类型对应封装类中的parseXX()方法。
String s="123";
int i=Integer.parseInt(s);
1.2 String--->char : 利用String类对象调用CharAt()方法。
String s="a";
char c=s.charAt(0);
2.基本数据类型--->String :
方法一:直接拼接空字符串
char c='a';
String s=c+"";
方法二:利用String类方法String.valueOf()方法
double d=6.26;
String s=String.valueOf(d);
二、类之间的类型转换
类之间的转换也就是将对象或引用赋给引用(造型)的过程。父类可以理解为范围较广的一类,子类可以理解为范围较小的一类,就与基本数据类型中位数较多的类型与位数较少的类型相似,但是,在转换过程中有着很大的不同。
1.向上转型
向上转型就是将子类对象赋给父类引用 (也可以叫做父类引用指向子类对象)。
理解:
1.与基本数据类型相似,范围较小的子类对象可以直接赋给范围较大父类引用,但父类对象不能赋给子类引用。
2.与基本数据类型完全不同的是,父类对象即使通过强制转换赋给子类引用时,编译不会报错,但运行时会报出异常。
class Father{
}
class Son extends Father{
}
class SomeBody{
}
public class Test{
public static void main(String []args){
Son s1=new Son();
Father f1=s1; //1. 正确,可以将子类对象赋给父类引用
Father f2=new Son(); //2. 同上
Father f3=new Father();
Son s3=f3; //3. 编译报错,父类对象不能赋给子类引用
Father f4=new Father();
Son s4=(Son)f4; //4. 即使通过强制转换,编译正常,但运行时会报异常
Son son =new Son();
SomeBody sb=(SomeBody)son; //5. 编译报错,无关类之间无法实现转换
}
}
注意:
1.两个无关类,包括同一个父类的的两个子类之间,无法进行类型转换,会编译报错。
2.向下转型
向下转型就是将子类对象的父类引用赋给子类引用。
理解:
1.是一个将引用赋给引用的过程,也就是向下转型的目标一定是经过了向上转型的。
2.父类引用指向子类A时,可以强制将父类引用转换为子类A。
3.父类引用指向子类A时,如想将父类引用强制转换为同一父类的其他子类B,编译不报错,但会报异常。
class Animal{
}
class Dog extends Animal{
}
class Cat extends Animal{
}
public class Test{
public static void main(String []args){
Animal a_d=new Dog(); //向上转型
//向下转型
Dog d=(Dog)a_d; //正常运行
Cat c=(Cat)a_d; //编译通过,但运行时报异常
}
}
总结
本文仅仅是个人学习的一点点总结,熟悉类型转换机制可以对理解JAVA的基本逻辑机制有较大的帮助。