Java关键字细节

关键字&保留字 (reserved word)
  1. 特殊含义,专门用途的字符串
  2. 均为小写
Java关键字细节  Java关键字细节
保留字:goto, const (命名时避开)

标识符 Identifier :命名时使用的字符序列
    类名,变量名,方法/函数名,接口名,包名。。。
Java关键字细节
*如果不遵循,编译不通过,字节码文件不生成!
 
Java关键字细节
*即使不遵守,也可以编译,运行!
 

 
变量 强类型
包含:变量类型,变量名,值
Java关键字细节
//定义变量
int myAge = 10;
OR 
//变量声明
int myAge;
//变量赋值
myAge = 10;
编译错误
  • 如果变量没声明就使用,会编译失败!
  • 声明了,但没有赋值就使用,会编译失败,未初始化!
  • 不在作用域内
  • 在同一作用域下,定义了同名变量
Java关键字细节
*作用域为定义变量的 {}
Java关键字细节
// Wrong
byte b1 = 34;
byte b1 = 35;
// Allowed
byte b1 = 34;
b1 = 35 // 修改变量的值
 

 
数据类型
通常使用:int,double(范围大,精度高)
Java关键字细节Java关键字细节
 
变量 在类中声明的位置:成员变量和局部变量
 
整数类型
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;
Java关键字细节
  • 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
  • 如果赋值超出类型允许的范围,编译出错!
Java关键字细节
*仅声明作用,print的时候不带着L/l 
*如果不加L,则为int型,也可以通过自动类型提升变为long型;

浮点型
Java关键字细节
  • Float: 尾数精确到7位数字;double: 14位
  • Float表示的数值范围比Long大
  • Float赋值是,值要以“f”或者“F”结尾!与long相
  • 如果不加F,则为double型,不可通过自动类型提升变为float,只能用强制符 (float);

字符类型
Java关键字细节
  • 1 char = 16 bits
  • 不使用单引号或者引号内多于一个字符,编译不通过!
Java关键字细节                                                               Java关键字细节 “ \t ”即为tab键的功能
 
  • 表示转义字符时可以无视 only 1 char限制
  • “\”把后面的char变为特殊字符常量
Java关键字细节
char c6 = '\u0043';
System.out.println(c6); // c
// 定义char类型变量的时候不使用有单引号
char c2 = 97; // print c2 ---> a, 等同于上面的作用; 97是“a”的ASCII码。
用字符对应的ASCII码来复制char,输出为该字符
 
字符集
Java关键字细节
*如果使用utf-8编码,那么‘a’被编译为95,存在内存。用utf-8解码,该字符集知道95对应的是‘a’;如果用Unicode解码,可能95对应的就是其他字符了,最终导致乱码。
  1. ASCII:规定了128个字符编码,e.g. A = 65, 这些符号只占用一个byte的后7位,第一位统一为“0”
    • 缺点:不能表示所有字符;相同的编码表示的字符不一样(A = 65; 水 = 65)
  2. Unicode: 所有符号都有一个独一无二的编码,没有乱码问题
  • 缺点:只规定了符号的二进制代码,却没有规定二进制代码该如何存储:无法区别Unicode和ASCII。计算机无法区分三个字节表示 一个符号(Unicode)还是分别表示 三个符号( ASCII
  1. UTF-8:1-6个字节表示符号。识别长/短字节

 
Java关键字细节
Boolean 型最终转化为int型式保存,所以是占用4个字节???

类型转换:   
 
自动类型转换
Java关键字细节
 
Java关键字细节
  • char + byte // char + short // short + byte 结果一律为int
  • byte + byte ------> int ( 同类型运算也是int)
  • byte, char and short之间不可自动类型提升转换!
  • java做运算时,如果 操作数均在int范围内,那么一律在int空间内运算
  • 解释:short + short容易超出范围;int是够用的范围,所以至少需要int
Java关键字细节
*容量大小不是指占的内存的大小!float占4个bytes,long占8个bytes。但float可以表示更大范围的数字
 
强制类型转换
Java关键字细节
 
Java关键字细节
  • output:12 截断操作,不是四舍五入!
  • 如果其他类型转化为float,不需要以f或者F结尾!
Java关键字细节
**int型式的128有32位,最后8位为1000 000(补码). (2^7 = 128)
**转化为byte(字节)之后,只有8个比特,最后8位是1000 0000的情况, 那么最前面的“1”变为符号位,表示复数,这个是-128的 补码

编码情况:
  1. 定义long的时候没加‘L’或者‘l’
  • e.g. long num1 = 1234;
  • 编译通过,因为 默认‘1234’是int形式 ( 自动类型提升
  1. 定义float的时候没有加‘f’或者‘F’
  • e.g. float num2 = 123.4;
  • 编译失败,因为‘123.4’ 默认是double形式,所以自动类型提升失败;但是可以通过使用强转符来实现:如 float num2 = (float)123.4 
 
  1. 与常量进行运算
                Java关键字细节
  • x = x + 1 ---> int, 因为‘1’默认为int型
  •                

String
  • 不是基本数据类型,是引用数据类型;
  • 声明String变量时,需要使用双引号" "。
String s1 = "Hello World!";
//双引号内可为空
String s1 = "";
// char 类型,单引号内不可为空,否则编译错误!
char c1 = ''; // Wrong
 
  • String可以和8种基本数据类型做运算,但只能是连接运算(+)
Java关键字细节
*Output: 学号:1001,类型仍为String。
 
练习:
Java关键字细节
Java关键字细节
  • char + int 结果为int;int + str结果为str;
  • char + str 结果为str;
Java关键字细节
 
// 输出为 *    *
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
Java关键字细节编译错误,强制符无效!
 

 
进制
                                                                   Java关键字细节
 
Java关键字细节
// 以int类型定义的非10进制整数,在print时都会变为10进制;
int num1 = 0127;
System.out.println(num1); // 87
 
*一个字节
Java关键字细节
*二进制:根据符号位判断正书和负数;
 
Java关键字细节
  • 正数的三种码均相同
  • 计算机底层以 补码方式存储数据
 
 
*-14的三种码(补码看不出是-14)
Java关键字细节
 
给定一个首位为‘1’的二进制字节,那么一定是补码!
 
 
以下为-127的三种码
Java关键字细节
-127 - 1 = -128 补码
Java关键字细节

 

 
怎么获得一个 负数的三种码?(-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取余的逆
*第一个余数是二进制数的最右边一位!
 
进制间转换:先转为二进制再转成其他的
Java关键字细节
 
例:二进制转八进制
Java关键字细节
因为8是2的三次方,所以二进制里面三个比特一组。(111 ---》7)得出0351, 8进制以0开始
2进制转16进制则以4个bits一组。(1111 ---》 15 / F)
 
反之, 8进制或者16进制转化为2进制,则把每个数字转化为3个或者4个bits,合在一起表示二进制。