概述:
变量就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。
内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。
因此,通过定义不同类型的变量,可以在内存中储存整数、小数或者字符。
分类:
Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
基本数据类型 | byte | short | int | long | char | float | double | boolean |
---|---|---|---|---|---|---|---|---|
类型 | 整数类型 | 整数类型 | 整数类型 | 整数类型 | 文本类型 | 浮点类型 | 浮点类型 | 布尔型 |
封装类 | Byte | Short | Integer | Long | Character | Float | Double | Boolean |
缓存类 | ByteCache | ShortCache | IntegerCache | LongCache | CharacterCache | 无 | 无 | 无 |
缓存值 | (-128到127) | (-128到127) | (-128到127) | (-128到127) | (0到127) | 无 | 无 | 无 |
8 种类型表示范围如下:
byte:8位,最大存储数据量是256,存放的数据范围是-128~127之间。
short:16位,最大数据存储量是65536,数据范围是-32768~32767之间。
int:32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1。
long:64位,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1。
float:32位,数据范围在3.4e-45~1.4e38,赋值时可以加上f或F也可以不加。
double:64位,数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。
boolean:只有true和false两个取值。
char:16位,存储Unicode码,用单引号赋值
封装类的缓存范围测试
public class TestMain {
public static void main(String[] args) {
testShort();
testInteger();
testFloat();
testCharacter();
}
public static void testShort(){
Short i1 = 127;
Short i2 = 127;
System.err.println(i1 == i2);
i1 = 128;
i2 = 128;
System.err.println(i1 == i2);
}
public static void testInteger(){
Integer i1 = 127;
Integer i2 = 127;
System.err.println(i1 == i2);
i1 = 128;
i2 = 128;
System.err.println(i1 == i2);
}
public static void testFloat(){
Float i1 = 127F;
Float i2 = 127F;
System.err.println(i1 == i2);
i1 = 128F;
i2 = 128F;
System.err.println(i1 == i2);
}
public static void testCharacter(){
Character i1 = 127;
Character i2 = 127;
System.err.println(i1 == i2);
i1 = 128;
i2 = 128;
System.err.println(i1 == i2);
}
}
结果:
true
false
true
false
false
false
true
false
Java中的char类型
1、JAVA中,char占2字节,16位。可在存放汉字
2、char赋值
char a='a'; //任意单个字符,加单引号。
char a='中';//任意单个中文字,加单引号。
char a=111;//整数。0~65535。十进制、八进制、十六进制均可。输出字符编码表中对应的字符。
注:只能放单个字符。
3、char运算
char类型是可以运算的因为char在ASCII等字符编码表中有对应的数值。
在JAVA中,对char类型字符运行时,直接当做ASCII表对应的整数来对待。
示例:
char m='a'; ——a。
char m='a'+'b'; ——Ã。 //char类型相加,提升为int类型,输出对应的字符。注,在CMD.exe用输出结果是问题?,不同的编码输出显示不一样。Eclipse中须改成UTF-8。
int m='a'+'b'; ——195。//195没有超出int范围,直接输出195。
char m='a'+b; ——报错。//因为b是一个赋值的变量。
char m=197; ——Ã。 //输出字符编码表中对应的字符。
char m='197; ——报错。//因为有单引号,表示是字符,只允许放单个字符。
char m='a'+1; ——b。//提升为int,计算结果98对应的字符是b。
char m='中'+'国'; ——42282。
char m='中'+'国'+'国'+'国'; ——报错。int转char有损失。因为结果已经超出char类型的范围。
int m='中'+'国'+'国'+'国'; ——86820
char m='中'+1; ——丮。//1是int,结果提升为int,输出对应的字符。
char m='中'+"国"; ——报错。String无法转换为char。
System.out.println('中'+"国"); ——中国。//没有变量附值的过程。String与任何字符用“+”相连,转换为String。
总结:
==用单引号''标识,只能放单个字符。==
==char+char,char+int——类型均提升为int,附值char变量后,输出字符编码表中对应的字符。==
Java自动类型转换
1)两种类型是彼此兼容的
2)转换的目的类型占得空间范围一定要大于转化的源类型
正向过程:由低字节向高字节自动转换
byte-short-char>int->long->float->double
逆向过程:使用强制转换,可能丢失精度。
int a=(int)3.14;
格式:目标类型 变量=(目标类型)源类型变量/常量
Java定义了若干使用于表达式的类型提升规则:
1)所有的byte型. short型和char型将被提升到int型(例外: final修饰的short, char变量相加后不会被自动提升。)
2)如果一个操作数是long形 计算结果就是long型;
3)如果一个操作数是float型,没有double类型,计算结果就是float型;
4)如果一个操作数是double型,计算结果就是double型;
易错点:
byte b1=1,b2=2,b3,b6;
final byte b4=4,b5=6;
b6=b4+b5;
b3=(b1+b2); //会发生编译错误
System.out.println(b3+b6);
//没有final修饰的变量相加后会被自动提升为int型,与目标类型byte不相容,需要强制转换(向下转型)。
byte b;
b=3;
b=(byte)b*3 //编译出错,因为(byte)的运算级别比*高,所以会先转换b后再*3
b=(byte)(b*3) //正确
自动装箱与自动拆箱
什么是拆箱什么是装箱
装箱就是 自动将基本数据类型转换为包装器类型;
拆箱就是 自动将包装器类型转换为基本数据类型。
拆箱与装箱是如何实现的
装箱和拆箱的实现过程:装箱过程是通过调用包装器的valueOf方法实现的,而拆箱过程是通过调用包装器的 xxxValue方法实现的。(xxx代表对应的基本数据类型)。
注意,Integer、Short、Byte、Character、Long这几个类的valueOf方法的实现是类似的。
Double、Float的valueOf方法的实现是类似的。
综合范例
public class Main {
public static void main(String[] args) {
Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3L;
Long h = 2L;
System.out.println(c == d);
System.out.println(e == f);
System.out.println(c == (a + b));
System.out.println(c.equals(a + b));
System.out.println(g == (a + b));
System.out.println(g.equals(a + b));
System.out.println(g.equals(a + h));
}
}
结果:
true
false
true
true
true
false
true