第二章、数据类型
2.1、标识符于关键字
标识符:用来标识类名、方法名、类型名、数组名及文件名的有效字符序列称为标识符,简单的说,标识符就是一个名字用来区分它在语言中表示什么含义。下面是规则
- 标识符号由字母、下划线、美元符号组成($)和数字组成,长度不受限制。
- 标识符的第一个字符不能是数字字符。
- 标识符不能是关键字
- 标识符不能是true、false和null(尽管true、false、和null 不是Java的关键字)
关键字:
- 关键字就是具有特定用途或被赋予特定意义的一些单词,不可以把关键字作为标识符来
用,以下是Java的50个关键字。
abstract assert boolean break byte case catch char class const continue default do double else
enum extends final finally float for goto if implements import instanceof int interface long native
new package private protected public return short static strictfp super switch synchronized this
throw throws transient try void volatile while
2.2、数据类型
数据类型:
注:
1) char是无符号的16位整数,字面值必须用单引号括起来; ‘a’
2) String 是类,非原始数据类型;
3) 长整型数字有一个后缀为“L”或“l”,八进制前缀为“0”,十六进制前缀为“0x”;
4) 黙认浮点类型为double;
5) float数据类型有一个后缀为“f”或“F”,Double数据类型后可跟后缀“D”或“d
测试默认值
public class Test {
static byte b;
static short s;
static int i;
static long l;
static char ch;
static double d;
static float f;
static boolean bool;
public static void main(String[] args) {
System.out.println(b); // 0
System.out.println(s); // 0
System.out.println(i); // 0
System.out.println(l); // 0
System.out.println(ch);// 133 我在其他电脑上测试,有的可能是空白,有知道原因的可以评论一下,资料也说是 133 也就是 '\u0000',这个不是很太清楚
System.out.println(d); // 0.0
System.out.println(f); // 0.0
System.out.println(bool); // false
}
}
2.3、变量和作用域
- 局部变量
定义在方法内部,其作用域为所在代码块,也称为临时变量、栈变量。 存在于栈中。
局部变量没有指定默认值,使用前必须手动赋于默认值,否则会报无法通过编译
指定默认值后
如果局部变量的名字和成员变量的名字相同,那么成员变量会被隐藏
- 实例变量
定义在类内部方法之外,其作用域为整个类。如未定义初值,系统会自动为其赋黙认
2.4、操作符
- 注意
System.out.println(3/2) 按整型计算 得1
System.out.println(3.0/2) 按整型计算 得1.5
-
、>> 前面是零补零,前面是一补一;
-
、>>> 无符号右移;
>>和>>>对于负数不一样
正数:>>等于除以X的2次方
负数:正数的结果+1
-
&& 短路与,前面为假,表达式为假,后面不须计算;
-
|| 短路或,前面为真,表达式为真,后面不计算;
例:
if(a<3&(b=a)==0) b赋值
if(a<3&&(b=a)==0) b不赋值
- 三目运算符号
类型 变量名字 = 条件1 操作符号 true(正确的返回值) : false(错误的返回值)
可以代替 if…else
else ---- 可以使用后面的 return 代替 提高代码的可读性
- char字符相加
char = “a” +“b”等于ASCII的数字对应的符号
int test=“a”+“b”等于对应的ASCII的数值相加 #195
-
自增,自减
int b=++a;
等价 a=a+1;
b=a;int b=a++;
等价 b=a;
a=a+1;‘++a(–a)表示在使用a自前,先让x的值增(减)1
++a(–a)表示在使用b自后,先让x的值增(减)1
2.5、类型转换
-
byte ——→ short ——→ int ——→ long
-
char ——→ int - - - → float
-
float ——→ double
-
long - - - → float
-
long - - - → double
-
int ——→ double
注:
1)实箭头表示无信息损失的转换,虚箭头表示转换可能引起损失;
2)int和float同为32位,但float要有几位表示幂的位数,在精度位数上要比int要小,所以有可能会有损失。long转为double同理;
3)char和short同为16位,但char属无符号数,其范围为0~2^16, short的范围为-215~215-1 , 所以char和short不能相互转换;
4)byte、short、char属child型,在计算时会自动转为int型,然后转为更大范围类型(long、short、double)。
强制转换
-
语法:圆括号中给出要转换的目标类型,随后是待转换的变量名。例:doublc x=9.997;int nx = (int)x;
-
如果试图强制转换的类型超出了目标类型的范围,结果是一个被截取的不同的数值;
-
不能在布尔值和任何数字类型间强制类型转换,如确要转换,可使用条件表达式,例:b?1:0。
public class Test {
public static void main(String[] args) {
int a = 128;
byte b = (byte) a;
System.out.println(b); // -128
}
}
原因:
int a 占4个字节
二进制数字
00000000 00000000 00000000 10000000 值位128
byte 1个字节
二进制数字
00000000
强制转换
int a 被切割
10000000 分给了 b
因为:最高位表示是符号位,0代表正数,1代表负数
所以 值为 -128
有符号位与无符号位最明显的区别就是二者的表示范围不同。
(无符号数: 0 ----------------- 255 、有符号数: -128 --------- 0 ---------- 127 )
如果不太清楚可以去了解计算机进制、原码、补码、反码
- 正数的原码、反码、补码,都是它的本身
- 反码:除了符号位之外,其与位都取反 例如 -123 反码 1 0 0 0 0 1 0 0
- 补码=反码 +1
综上:验证了高精度向低精度强制转换时候会有精度丢失。