Java关键字细节
关键字&保留字 (reserved word)
-
特殊含义,专门用途的字符串
-
均为小写
保留字:goto, const (命名时避开)
标识符 Identifier :命名时使用的字符序列
类名,变量名,方法/函数名,接口名,包名。。。
*如果不遵循,编译不通过,字节码文件不生成!
*即使不遵守,也可以编译,运行!
变量 强类型
包含:变量类型,变量名,值
//定义变量
int myAge = 10;
OR
//变量声明
int myAge;
//变量赋值
myAge = 10;
编译错误:
-
如果变量没声明就使用,会编译失败!
-
声明了,但没有赋值就使用,会编译失败,未初始化!
-
不在作用域内
-
在同一作用域下,定义了同名变量
*作用域为定义变量的
{}内
// Wrong
byte b1 = 34;
byte b1 = 35;
// Allowed
byte b1 = 34;
b1 = 35 // 修改变量的值
数据类型:
通常使用:int,double(范围大,精度高)
变量
在类中声明的位置:成员变量和局部变量
整数类型:
1byte =
_ _ _ _ _ _ _ _
最大可表示255;可是只能表示到127,因为128是1000 0000,这时第一个数字表示+-,所以1000 000 是负数,补码,原码代表-128.
一旦第一个数字变为“1”之后,就需要引入第二个byte,即使不适用;否则第一个byte表示的数字开始变为
负数
。
2 bytes =
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
, 当第一个byte用完时,也就是超过255时,才会使用第二个byte位置;
short 128 [0000 0000 1000 0000]但是强制类型转换为 byte之后,只剩1000 0000,这时是-128;
-
1 byte = 8 bits, each bit has two options (0, 1) so a byte can represent 2^8 = 256 items -------> represent half positive and half negatve and an 0, so it's -128 to 127
-
Short, 2 bytes, (2^8)^2 = 2^16 items, half represent negative and half represent positive, 2^16 / 2 = 2^15
-
如果赋值超出类型允许的范围,编译出错!
*仅声明作用,print的时候不带着L/l
*如果不加L,则为int型,也可以通过自动类型提升变为long型;
浮点型:
-
Float: 尾数精确到7位数字;double: 14位
-
Float表示的数值范围比Long大
-
Float赋值是,值要以“f”或者“F”结尾!与long相同
-
如果不加F,则为double型,不可通过自动类型提升变为float,只能用强制符 (float);
字符类型:
-
1 char = 16 bits
-
不使用单引号或者引号内多于一个字符,编译不通过!
-
表示转义字符时可以无视 only 1 char限制
-
“\”把后面的char变为特殊字符常量
char c6 = '\u0043';
System.out.println(c6); // c
// 定义char类型变量的时候不使用有单引号
char c2 = 97; // print c2 ---> a, 等同于上面的作用; 97是“a”的ASCII码。
用字符对应的ASCII码来复制char,输出为该字符。
字符集:
*如果使用utf-8编码,那么‘a’被编译为95,存在内存。用utf-8解码,该字符集知道95对应的是‘a’;如果用Unicode解码,可能95对应的就是其他字符了,最终导致乱码。
-
ASCII:规定了128个字符编码,e.g. A = 65, 这些符号只占用一个byte的后7位,第一位统一为“0”
-
缺点:不能表示所有字符;相同的编码表示的字符不一样(A = 65; 水 = 65)
-
-
Unicode: 所有符号都有一个独一无二的编码,没有乱码问题
-
缺点:只规定了符号的二进制代码,却没有规定二进制代码该如何存储:无法区别Unicode和ASCII。计算机无法区分三个字节表示 一个符号(Unicode)还是分别表示 三个符号( ASCII )。
-
UTF-8:1-6个字节表示符号。识别长/短字节
Boolean 型最终转化为int型式保存,所以是占用4个字节???
类型转换:
自动类型转换
-
char + byte // char + short // short + byte 结果一律为int
-
byte + byte ------> int ( 同类型运算也是int)
-
byte, char and short之间不可自动类型提升转换!
-
java做运算时,如果 操作数均在int范围内,那么一律在int空间内运算。
-
解释:short + short容易超出范围;int是够用的范围,所以至少需要int
*容量大小不是指占的内存的大小!float占4个bytes,long占8个bytes。但float可以表示更大范围的数字
强制类型转换
-
output:12 截断操作,不是四舍五入!
-
如果其他类型转化为float,不需要以f或者F结尾!
**int型式的128有32位,最后8位为1000 000(补码). (2^7 = 128)
**转化为byte(字节)之后,只有8个比特,最后8位是1000 0000的情况,
那么最前面的“1”变为符号位,表示复数,这个是-128的
补码!
编码情况:
-
定义long的时候没加‘L’或者‘l’
-
e.g. long num1 = 1234;
-
编译通过,因为 默认‘1234’是int形式 ( 自动类型提升)
-
定义float的时候没有加‘f’或者‘F’
-
e.g. float num2 = 123.4;
-
编译失败,因为‘123.4’ 默认是double形式,所以自动类型提升失败;但是可以通过使用强转符来实现:如 float num2 = (float)123.4
-
与常量进行运算
-
x = x + 1 ---> int, 因为‘1’默认为int型
-
String
-
不是基本数据类型,是引用数据类型;
-
声明String变量时,需要使用双引号" "。
String s1 = "Hello World!";
//双引号内可为空
String s1 = "";
// char 类型,单引号内不可为空,否则编译错误!
char c1 = ''; // Wrong
-
String可以和8种基本数据类型做运算,但只能是连接运算(+)
*Output: 学号:1001,类型仍为String。
练习:
-
char + int 结果为int;int + str结果为str;
-
char + str 结果为str;
// 输出为 * *
System.out.println("* *"); // ok
System.out.println('*' + '\t' + '*'); // wrong 93 int
System.out.println('*' + "\t" + '*'); // ok
System.out.println('*' + '\t' + "*"); // wrong 51*
System.out.println('*' + ('\t' + "*")); // ok
-
转义符与基本数据类型 “+”,结果为int!
-
转义符与str “+”, 结果为连接转义之后的内容与str!
-
float or int加上""(空str)之后变为str
String s1 = 23 + "";
// s1 = "23"
-
str类型不能转化为int类型,可以使用 int num1 = Integer.parserInt(str1); 来实现str转为int
进制:
// 以int类型定义的非10进制整数,在print时都会变为10进制;
int num1 = 0127;
System.out.println(num1); // 87
*一个字节
*二进制:根据符号位判断正书和负数;
-
正数的三种码均相同
-
计算机底层以 补码方式存储数据
*-14的三种码(补码看不出是-14)
给定一个首位为‘1’的二进制字节,那么一定是补码!
以下为-127的三种码
-127 - 1 = -128 补码
怎么获得一个
负数的三种码?(-14)
-
先得到(+14)的二进制表示 ----》0000 1110
-
第一位从0变为1 ---》1000 1110
-
去反码:1111 0001
-
加1得到补码
-
1111 0010 (-14的补码)
*-128很特殊:
-
+128为1000 0000
-
-128的原码和补码均为:1000 0000
-
反码为1111 1111
-
过程:
-
由+128得到 -128的原码为1000 0000
-
反码为1111 1111
-
补码 (+1)1000 0000
-
*通过
位运算符或者
强转符运算之后,一旦首位变为“1”(原码),则该数字表示负数,那么就会开始从原码转变为
补码!
10进制转2进制:除2取余的逆
*第一个余数是二进制数的最右边一位!
进制间转换:先转为二进制再转成其他的
例:二进制转八进制
因为8是2的三次方,所以二进制里面三个比特一组。(111 ---》7)得出0351, 8进制以0开始
2进制转16进制则以4个bits一组。(1111 ---》 15 / F)
反之,
8进制或者16进制转化为2进制,则把每个数字转化为3个或者4个bits,合在一起表示二进制。