java中各个类型所占字节为:
byte: 8bit -128~127
char: 16bit
short: 16bit
int: 32bit
float: 32bit
double : 64bit
long: 64bit
关于boolean类型具体在java中占用多少字节
- JAVA规范没有明确指出boolean占几个字节
- JVM规范指出boolean当做int处理,也就是4字节,boolean数组当做byte数组处理。
- JVM以计算机的字长作为最小处理单位。
java自动向上转型是按照
char->int -> long -> float -> double的顺序
在基本类型进行算术运算的时候,会发生小字节类型向大字节类型转换的现象。但是char、byte、short例外。
char、byte、short是同级,他们之间相互转型的话是不安全的。因为编译器在运行时会首先将这三者先扩充转为int类型,然后继续进行计算。
如下程序:
short a=1,b=2;
short c =a+b;
提示错误type mismatch: cannot convert from int to short
,即a+b计算时转为int类型,int类型无法向下自动转型为short
但是当a、b为final时程序正常,因为final类型为常量,在编译阶段直接就赋值给c了,不会经过计算转型。
final short a=1,b=2;
short c =a+b;
当自动转型结合重载
public class Main2 {
private void f(byte a) {
System.out.println("byte:"+a);
}
private void f(char a) {
System.out.println("char:"+a);
}
private void f(Character a) {
System.out.println("Character:"+a);
}
private void f(Serializable a) {
System.out.println("Serializable:"+a);
}
private void f(Object a) {
System.out.println("Object:"+a);
}
private void f(short a) {
System.out.println("short:"+a);
}
private void f(int a) {
System.out.println("int:"+a);
}
private void f(float a) {
System.out.println("float:"+a);
}
private void f(long a) {
System.out.println("long:"+a);
}
private void f(double a) {
System.out.println("double:"+a);
}
private void f(char ... a ) {
System.out.println("char ... :"+a[0]);
}
public static void main(String[] args) {
Main2 m = new Main2();
m.f('a');
}
}
上述重载方法的调用优先级为
char->int -> long -> float -> double -> Character -> Serializable -> Object -> char …
输出为char:a
当注释掉void f(char a)
函数时,输出int:97
,即char向上转型为int,依照向上转型的顺序,char->int -> long -> float -> double的顺序,优先调用重载的相应方法,没有时继续向上转型,最后调用变长参数的重载方法,可见变长参数的重载优先级最低。
注意:这里char可以自动装箱为Character 对象,但是不能自动装箱为Integer