数据类型
1. Java是一种强类型语言,针对每种数据都提供了对应的数据类型。
2. JAVA只有两种数据类型:基本数据类型,引用数据类型
3. 基本数据类型:8种
a) 整数:JAVA中没有无符号的整数。JAVA中整数可以表示十进制,八进制(用0开头),十六进制(用0X或0x开头)。但不能表示二进制。
i. byte:1个字节,-27---27-1
8位带符号数
/*
byte b1 = 127;
byte b2 = (byte)128; //-128
byte b3 = (byte)129; //-127
byte b4 = (byte)130; //-126
byte的范围:-128 ~ 127
*/
ii. short:2个字节,-215---215-1
16位带符号数
iii. int:4个字节,-231---231-1,JAVA中的整数默认为int类型。
32位带符号数
iv. long:8个字节,-263---263-1,在整数的后面加L或l表示long类型的整数。
64位带符号数
b) 浮点数:浮点数的运算会产生误差。
i. float:4个字节,在浮点数后面加F或f.
32位,标准IEEE 754
ii. double:8个字节,JAVA中浮点数默认为double类型。
32位,标准IEEE 754
c) 字符类型:char,值必须放在一对单引号中,并且单引号中只能有一个字符。
JAVA使用Unicode编码集,所有的字符均为2个字节,所以ava语言中的字符char可以存储一个中文汉字。
ASCII码
'a' 97
'A' 65
'0' 48
d) 布尔类型:boolean,只有两个值:true/false。JAVA中boolean类型不能转换为其它类型。占用1个字节。
class DataTypeDemo { public static void main(String[] args) { //定义变量的格式: //数据类型 变量名 = 初始化值; //定义一个字节变量 byte b = 10; System.out.println(10); System.out.println(b); //定义一个短整型变量 short s = 100; System.out.println(s); //定义一个整型变量 int i = 1000; System.out.println(i); //超过了int的范围 //int j = 1000000000000; long j = 1000000000000L; //long j = 100L; System.out.println(j); //定义浮点数据变量 float f = 12.345F; System.out.println(f); double d = 12.345; System.out.println(d); //定义字符变量 char ch = 'a'; System.out.println(ch); //定义布尔变量 boolean flag = true; System.out.println(flag); } }
4. 变量
a) 格式:数据类型 变量名[=值];
b) JAVA是强类型的语言。
c) 当变量没有赋值时不能使用,否则编译失败。
d) 在同一个范围内不能出现同名的变量。
e) 标识符(类名,变量名,方法名,包名等)的命名规则:
i. 标识符由字母,数字,下划线,美元符组成。
ii. 不能使用数字开头。
iii. 不能使用关键字(JAVA中关键字均为小写)。
f) Java命名规范:变量名均为小写。如果变量名由多个单词组成,从第二个单词开始,每个单词首字母大小,其它均为小写(如:userName,userAge,password)
5. 常量(最终变量)
a) 使用final关键字。
final datatype CONSTANTNAME = VALUE;
final double PI = 3.14159;
b) 从不改变的永久数据(即常量只能赋值一次)
6. 基本数据类型的类型转换
a) 基本类型比较大小:先比较精度,精度大的类型大。如果精度相同,比较字节数,字节数大的类型大。
b) 自动转换:JVM会自动将小类型转换为大的类型。
/*
byte b1 = 127;
byte b2 = (byte)128; //-128
byte b3 = (byte)129; //-127
byte b4 = (byte)130; //-126
byte的范围:-128 ~ 127
*/
byte,short,char -- int -- long -- float – double
long: 8个字节 -2^63~2^63-1
float:4个字节 -3.4028235E+38~3.4028235E+38
3.4*10^38 > 2*10^38 > 2*8^38 = 2*2^3^38 = 2*2^114 > 2^63-1
它们的底层存储结构不同,float表示的数据范围比long的范围要大。
c) 手动转换(强制转换):使用(类型)形式将大类型转换为小类型。精度损失问题
格式:目标数据类型 变量名 = (目标数据类型) (被转换的数据);
注意: boolean类型不能转换为其他的数据类型
默认转换(从小到大的转换)
A:byte,short,char—int—long—float—double
B:byte,short,char相互之间不转换,他们参与运算首先转换为int类型
//定义一个byte类型,一个int类型,做加法 byte a = 3; int b = 4; byte c = a + b; //这个是有问题的 int c = a + b; //可能损失精度 byte c = (byte) (a + b); //用强制类型转换改进 System.out.println((int)1.7); //结果为1,当double型值被转换为int型值时,小数部分被截去 System.out.println((double)1/2); //结果为0.5,因为1首先被转换为1.0,然后用2除1.0 System.out.println(1/2); //结果为0,因为1和2都是整数,那么对他们做除法的结果也必须是整数 double d = 4.5; int i = (int)d; //类型转换不改变被转换的变量,d在类型转换之后值不变。
面试题:
byte b1=3,b2=4,b;
b=b1+b2; //有问题的,是类型提升。先将b1和b2转换为int型后参与运算。
b=3+4; //只要整形直接量是在目标变量允许的范围内,那么将整形直接量赋给short型或byte型变量时,就不需要显示的类型转换。
哪句是编译失败的呢?为什么呢?
byte b = 130; //有问题,因为byte的范围是:-128到127。
byte b = (byte) 130; System.out.println(b); //结果是多少呢? -126
byte b = (byte) 300; System.out.println(b); //44
/*
分析过程:
我们要想知道结果是什么,就应该知道是如何进行计算的。
而我们又知道计算机中数据的运算都是补码进行的。
而要得到补码,首先要计算出数据的二进制。
A:获取130这个数据的二进制。
00000000 00000000 00000000 10000010
这是130的原码,也是反码,还是补码。
B:做截取操作,截成byte类型的了。
10000010
这个结果是补码。
C:已知补码求原码。
符号位 数值位
补码: 1 0000010
反码: 1 0000001
原码: 1 1111110
*/ 2+4+8+16+32+64=126
思考题1:请问下面这个有没有问题
double d = 12.345;
float f = d;
float f = (float)d; //把double赋值给float,加了强制类型转换
思考题2:看看下面两个定义有没有区别呢?
float f1 = (float)12.345; // f1其实是通过一个double类型转换过来的。
float f2 = 12.345f; // f2本身就是一个float类型。
思考题3:
A:字符参与运算
是查找ASCII里面的值
'a' 97
'A' 65
'0' 48
System.out.println('a');
System.out.println('a' + 1);
B:字符串参与运算
这里其实是字符串的连接
System.out.println("hello"+'a'+1); // helloa1;字符串数据和其他数据做+,结果是字符串类型。这里的+不是加法运算,而是字符串连接符。
System.out.println('a'+1+"hello"); //结果为:98hello ‘a’是字符不是字符串
System.out.println("5+5="+5+5); //5+5=55
System.out.println(5+5+"=5+5"); //10=5+5
7. 字符型char数据与数值型数据之间的转换
char型数据可以转换成任意一种数值类型。
整数转换成char类型,只用到该数据的低十六位,其余部分都被忽略。例如:
char ch = (char)0XAB0041;
System.out.println(ch); //A
浮点型转换成char型,首先将浮点值转换成int型,然后将int型转换为char型。
char ch = (char)65.25;
System.out.println(ch); //A
char型数据转换成数值型,字符的统一码就被转换成某个特定的数值。
int i = (int)'A';;
System.out.println(i); //65
转换结果适用于目标变量,就可以使用隐士转换方式;否则,必须使用显示转换方式:
byte b = 'a';
int i = 'a';
因为统一码\uFFF4不适用于一个字节范围内,下面的转换就是不正确的:
byte b = '\uFFF4';
为了强制赋值,就必须使用显示转换方式:
byte b = (byte)‘\uFFF4’;
所有数值运算符都可以用在char型操作数上。
如果另一个操作数是一个数字或字符,那么char型操作数就会被自动转换成一个数字。
如果另一个操作数是一个字符串,字符就会与该字符串相连。