★ 基本数据类型间的转换
1、Java要做到平台无关性,所有的基本数据类型所占的字节数量均是固定的。
boolean ——1/8字节(1 bit) byte —— 1字节 char —— 2字节 short —— 2字节
int —— 4字节 long —— 8字节 float —— 4字节 double —— 8字节
2、基本数据类型间的转换
(1) 所占字节数相对少的基本类型可以自动向字节数相对多的转换。
byte c=(byte)-1; //强制转化为byte型
int i=c; //自动转化为整型
System.out.println(i);//打印结果:-1
比如上面的byte型可以自动转化为int型,但这种转化是带符号扩展的。因为byte是有符号类型。这里有一个例外,就是char,它是一个无符号类型,因此自动扩展成int、long等类型时是不带符号扩展的。
char c=(char)-1;
int i=c; //自动转化为整型
System.out.println(i); //打印结果:65535
上面的代码首先将整型0xFFFFFFFF(32bits)强制类型截短为0xFFFF(16bits)。而这个数的类型是char,那么它表示的数是65535,扩展成int类型的时候是无符号扩展,高位补0,因此变量i=0x0000FFFF(65536)。
(2) 所占字节数多的向字节数少的转换要强制执行。
大范围类型多出的bit将会被截去。
int i=10000;
byte j=(byte)i; //4字节强制转化为1字节
System.out.println(j);//打印结果: 16
(3) 字节一样多的,long向double类型转化也需要强制类型转化,反向不需要。
(4) boolean型不能与其他任何数值类型之间转换。
★
类类型间的转换
这里有一句很经典的话:男人绝对是人,人可能不是男人,只有原来是男人的人才有希望变回男人。
1、类类型的自动转换,只能在继承层次中自下而上的自动转换(向上转型),即子类自动转换为父类。
//自动向上转型
class Employee{
}
class Manager extends Employee{ //继承关系
}
Manager m=new Manager();
Employee e=m; //Manager类型自动转换为Employee类型
2、强制类型转换
在继承层次中将一个父类的变量转变成子类类型,必须强制类型转换。但这种转换并不是一定成功的:
//运行失败
class Employee{
}
class Manager extends Employee{
}
Employee e=new Employee(); //e的实际类型为Employee
Manager m=(Manager)e; //强制转换为Manager
注意:上面的代码编译时可以通过,但运行的时候会产生一个ClassCastException
的非检查异常。如果不捕获这个异常,程序将终止。再看一段代码:
//运行成功
class Employee{
}
class Manager extends Employee{
}
Employee e=new Manager(); //多态,e的实际类型为Manager
Manager m=(Manager)e; //强制类型转换
这段代码可以正常运行。
如果父类引用的是一个子类的类型(多态情况下)。这是可以通过强制类型转换把父类变量赋值类子类变量。否则强制类型转换将以ClassCastException异常结束。
3、instanceof检查能否成功的向下转型
在类类型强制转换的程序设计中,要养成一个良好的习惯:在转换之前 ,使用instanceof运算符查看是否能成功转换。
instanceof运算符用来判断一个对象是不是某个类或其子类的实例。
class Employee{
}
class Manager extends Employee{
}
//e1的引用是Employee类型,e1对象是Employee类的实例,
Employee e1=new Employee();
System.out.println("e1:"+e1 instanceof Manager);
//e2的引用是Employee类型,e2对象是Manager类的实例,
Employee e2=new Manager();
System.out.println("e2:"+e2 instanceof Manager);
//运行结果: e1 : false
e2 : true
因此如果instanceof为false的时候,编译器将不会进行这个转化
if(e1 instanceof Manager){
Manager m=(Manager)e1;
}
总结:(1) 类类型只能在继承层次内进行类型转换
(2) 在向下转型之前,应该使用instanceof进行检查
分享到:
相关推荐
java解惑java解惑java解惑java解惑java解惑java解惑
Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑
JAVA解惑,你面包括一些java经典的问题。
Java PUZZLE Java 解惑 Java PUZZLE Java 解惑 Java PUZZLE Java 解惑Java PUZZLE Java 解惑 Java PUZZLE Java 解惑 Java PUZZLE Java 解惑
Java解惑中文版 Java解惑 java健壮程序
Java解惑.pdf Java解惑.pdf Java解惑.pdf Java解惑.pdf
《Java解惑》《Java解惑》《Java解惑》《Java解惑》《Java解惑》《Java解惑》
JAVA解惑.pdf JAVA解惑.pdf JAVA解惑.pdf
Java解惑 Java解惑 Java解惑
java 解惑 java 解惑 java 解惑 java 解惑 java 解惑 java 解惑 java 解惑 java 解惑 java 解惑
与java相关的的学习,适合初学者,可以看看
讲述如何在程序中避免程序缺陷和程序陷阱的,解惑的过程中,介绍了一些Java编程语言中许多不易被掌握的知识点,其阅读价值非常高,适合具有Java知识的学习者和有编程经验的Java程序员阅读。
Java解惑,是一本以大量java实例,讲述如何在程序中避免程序缺陷和程序陷阱的,解惑的过程中,介绍了一些Java编程语言中许多不易被掌握的知识点,其阅读价值非常高,适合具有Java知识的学习者和有编程经验的Java...
JAVA面试题解惑系列合集 JAVA面试题解惑系列合集 JAVA面试题解惑系列合集
"java解惑" PDF版本
《Java解惑》 布洛克 著;陈昊鹏 译 扫描清晰带目录,仅供参阅,请支持正版
JAVA解惑
Java解惑,罗列你意想不到的100道java疑惑
该书特写了95个有关Java或其类库的陷阱和缺陷的谜题,其中大多数谜题都采用了短程序的方式,这些程序的行为与其看似的大相径庭。在每个谜题之后都给出了详细的解惑方案,这些解惑方案超越了对程序行为的简单解释,向...