java中的基本数据类型
在java中有一句话叫做一切皆对象,这句话我是这么理解的:java中所有的操作的基本单位都是一个一个的对象。但java中有八种数据类型不是对象。为什么会存在这种特殊的类型呢!这里我引用java编程思想中的一句原话:
在程序设计中经常用到一系列类型,他们需要特殊对待。可以把它们想象成“基本”类型,之所以特殊对待,是应为new将对象储存在‘堆’里,故用new创建一个对象——特别是非常小的、简单的变量不是很有效,他们不用new来创建对象,而是创建一个并非是引用的“自动”变量。这个变量直接储存值,并置于堆栈之中,因此更加有效。
java不是一切皆对象吗?有基本数据类型不矛盾吗?因为八种基本数据类型有对应的包装类,所以并不影响说java不是一切皆对象
八种基本数据类型
虽然long和double都是64位,但是double的取值范围比long要广,因为浮点数和整数用位的表示方式不同。float和int同理。
和其他语言比较不同的是,java中的char是两个字节所以能存一个汉字。
它们的默认值只有是属性的时候才会有,如果是局部变量,在使用前必须赋值,不然报错。
java中的整数类型默认是int类型。long a=21000000000l,超过了int的值,后面要跟l,或者强转。
小数默认是double,float a=5.5f,后面要跟f或强转,float只能精确到7位小数。
char和short虽然都是16位,但是取值范围不同,所以不能互相赋值。但是可以short a=‘a’ ,char c=100;但是不能a=c或者c=a;
boolean虽然可以用1或者零就可以表示,但是并不是只占一位。不同的虚拟机实现不同,在HotSpot 1.8中,boolean变量的长度为4 Byte,而boolean数组中,每个boolean长度为1 Byte。
基本数据类型重载
java中基本数据类型会发生重载,并且会发生精度提升匹配:
public void display(byte var){
System.out.println("这是byte方法"+var);
}
public void display(short var){
System.out.println("这是short方法"+var);
}
public void display(char var){
System.out.println("这是char方法"+var);
}
public void display(int var){
System.out.println("这是int方法"+var);
}
public void display(long var){
System.out.println("这是long方法"+var);
}
public void display(float var){
System.out.println("这是float方法"+var);
}
public void display(double var){
System.out.println("这是double方法"+var);
}
public void display(boolean var){
System.out.println("这是boolean方法"+var);
}
我在main方法中执行以下内容
BaseType baseType=new BaseType();
byte var1=1;
short var2=1;
char var3=1;
int var4=1;
long var5=1;
float var6=1;
double var7=1;
boolean var8=false;
baseType.display(var1);
baseType.display(var2);
baseType.display(var3);
baseType.display(var4);
baseType.display(var5);
baseType.display(var6);
baseType.display(var7);
baseType.display(var8);
因为存在对应的方法,所以会执行对应的方法。输出以下内容:
当我去掉第一个display方法时,由于没有参数byte类型的方法,当实参为byte类型时,他会去寻找看是否有short类型的方法,如果没有再去找int,一直找到“最近”的那个类型。输出如下:
short和char因为都是2个字节,所以属于同一级别。当实参为short或char时,如果没有对应的方法,会去找参数为int的方法。
对应的提升路径:
- byte->short->int->float->double
- char->int->float->double
但是高精度的实参,就不能使用低精度或者说低范围参数的方法。
思考一下执行system.out.println(1.0/0)会发生什么?