标签:
Java中的数据类型
在Javac程序中,一切都是对象,那么决定一个类的外观与行为的,或者说定义一个对象的“类型”的便是class关键字。在class关键字之后,跟随一个新数据类型的名称,如
class ATypeName{ /*类主体置于此 }
这样就引入一个新类型,随后便可以用new创建这种类型的一个新对象。在Java语言中,数据类型分为两种,一种是引用数据类型,另一种便是基本数据类型。
在引用数据类型中,定义一个类(在Java中的全部工作就是定义类、制作那些类的对象以及将消息发送给那些对象)可在自己的类中设置两种类型的元素:数据成员(或称为“字段”)以及成员函数(通常称为“方法”)。
而基本数据类型,实际上Java中的基本数据类型是Java中需要特殊对待的一系列类。之所以要特别对待,是因为基本数据类型在创建时不使用new创建变量,而是创建一个并非变量名对应的关键字的“自动”变量。这个变量容纳了具体的值,并置于堆栈中,能够更高效的存取。
Java决定了每种基本数据类型的大小,这些大小并不随机器结构的变化而变化。
主类型 | 大小 | 最小值 | 最大值 | 封装器类型 |
boolean | 1-bit | - | - | Boolean |
char | 16-bit | Unicode 0 | Unicode 216-1 | Character |
byte | 8-bit | -128 | +127 | Byte |
short | 16-bit | -215 | +215-1 | short |
int | 32-bit | -231 | +231-1 | Interger |
long | 64-bit | -263 | +263 -1 | Long |
float | 32-bit | IEEE754 | IEEE754 | Float |
double | 64-bit | IEE754 | IEEE754 | Double |
void | - | - | - | Void |
当对某一个变量赋予的值超出了其数据类型所能够表示的范围是,这个变量所输出的值将发生紊乱,并且不能得到预期的运行结果。
主类型 | 默认值 |
Boolean | false |
Char | null |
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
数据溢出
前文说过,Java中每个基本数据类型的大小是固定的且不会随机器结构的改变而改变,这保证了Java程序强大的可移植性,但如果变量值超出了数据类型所表示的范围,便会出现一些有趣的结果,这便是数据溢出,那么Java对数据溢出会有什么处理呢。
1 public class demo { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 // TODO Auto-generated method stub 8 int x = Integer.MAX_VALUE; 9 System.out.println("x = "+x); 10 System.out.println("x + 1 = "+(x+1)); 11 System.out.println("x + 2 = "+(x+2)); 12 System.out.println("x * 4 = "+(x*4)); 13 } 14 15 }
运行结果为:
x = 2147483647
x + 1 = -2147483648
x + 2 = -2147483647
x * 4 = -4
很明显,int在Java中大小为四字节,且分正负,但在发生了数据溢出时并不会得到编译错误,反而给出了值,这显然不是一件友好的事情。那如何解决数据溢出,换一个更大的容器看起来是一个不错的方法。
1 public class demo { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 // TODO Auto-generated method stub 8 int x = Integer.MAX_VALUE; 9 System.out.println("x = "+x); 10 System.out.println("x + 1 = "+(x+1)); 11 System.out.println("x + 2 = "+(x+2L)); 12 System.out.println("x + 2 = "+((long)x+2L)); 13 System.out.println("x * 4 = "+((long)x*4)); 14 } 15 16 }
运行结果为:
x = 2147483647 x + 1 = -2147483648 x + 2 = 2147483649 x + 2 = 2147483649 x * 4 = 8589934588
显然的,这样可以解决数据溢出问题。那么继续思考一个问题,第一个示例溢出的结果为什么是-4? 可以从第二个示例的结果得到一些启示,8589934588的十六进制是1FFFFFFFC,只留四个字节(int型只占四字节)是FFFFFFFC,这 是补码,并且因为是最高位是1,所以还是个负数。转成原码(除符号位外,取反加1)变为10000004,也就是-4。
数据类型的转换
数据类型的转换方式有两种,一种是“自动类型转换”,另一种是“强制类型转换”
1 public class demo { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 // TODO Auto-generated method stub 8 int x = 30; // 定义整型变量 9 float y = 22.19f; // 定义浮点型变量 10 System.out.println("x / y = " + (x / y)); // 除法操作(浮点数) 11 System.out.println("10 / 3.5 = " + (10 / 3.5)); // 直接使用常量进行除法 12 System.out.println("10 / 3 = " + (10 / 3)); // 直接使用常量进行除法 13 14 } 15 16 }
输出结果:
x / y = 1.3519603 10 / 3.5 = 2.857142857142857 10 / 3 = 3
可以看到,自动类型转换就是在两个大小不一致的数据类型发生运算操作时,较小一方的数据类型会自动转换为较大那一方的数据类型,从而得到较大的那一方的数据类型的输出。
同时,在Java语言中,所有的数据类型在与String类型连接时,都会自动转换为String类型。此外,在数据运算中对于精度不足的数据类型,程序会执行向下取整,并不会执行数学习惯中的四舍五入,例如
public class demo { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("8/5 = "+(8/5)); } }
输出结果是1而非1.6。
对于强制数据类型转换,只需在运算或带参返回方法前加上一对圆括号(),在括号内键入想要转换的数据类型即可。
标签:
原文地址:http://www.cnblogs.com/aladdin-light/p/5493417.html