一、关键字和保留字
- 关键字: 被Java语言赋予了特殊含义,用做专门用途的字符串
- 特点:关键字中所有字母都为小写
- 例: class; interface; if; native 等
- 保留字:现有Java版本1.8尚未使用,但以后版本可能会作为关键字使用。(自己命名标识符时要避免使用这些保留字)
- 如goto; const;
二、标识符(Identifier)
- 标识符:Java对各种变量、方法和类等要素命名时使用的字符序列成为标识符
- 注:凡是自己可以起名字的地方都叫标识符,如类名,变量名,方法名,包名
- 合法标识符的定义规则:
- 可由26大小写字母,0-9,_或$组成
- 数字不可开头
- 不能使用关键字和保留字,但可以包含关键字和保留字
- 区分大小写,长度无限制
- 不能包含空格
- 标识符命名规范:
- 包名:多单词组成时所有字母均小写xxxyyyzzz
- 类名、接口名:多单词组成时,所有单词首字母大写(大驼峰命名法?):XxxYyyZzz
- 变量名、方法名:第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz
- 常量名:所有字母都大写。多单词时每个单词用下划线链接:XXX_YYY_ZZZ
- 规则不对编译不通过,规范不对编译无问题
- 合法标识符的定义规则:
- 注1:
- 为提高阅读性,起名字最好“见名知意”
- java采用unicode字符集,因此标识符也可以使用汉字声明,但脑子正常就别用
- 注:凡是自己可以起名字的地方都叫标识符,如类名,变量名,方法名,包名
三、变量
- 概念:内存中的一个存储区域,该区域的数据可以在同一类型范围内不断变化
- 变量时程序中最基本的存储单元。包含变量类型、变量名和存储的值。
- 作用:用于在内存中保存数据
- 定义变量的格式: 数据类型 变量名 = 变量值;
- int myAge = 12;
- 或者:
int myAge;
myAge = 12;
- 使用变量的注意事项:
- 变量必须先声明,后使用
- 使用变量名来访问变量中的数据
- 变量都定义在其作用域内,出了作用域变量就失效了。
- 同一作用域内,不可声明两个相同名字的变量,会报错
- Java中变量的类型:
- 按数据类型分类:
- 按声明位置分类:
变量类型详解
基本数据类型:
- 整型
- byte为存储数据最小的单位,1字节 = 8bit。 因此共有2的8次方,共256种组合,因此表数范围为-128~127,小心别超了
- short为2字节存储空间,为-215~215-1
- int为4字节,以此类推
- long为8字节,以此类推
- 注意:定义long型时,必须在变量值后以大L或小l结尾,编译出来的数字是不带L的
- eg: long l1 = 23232655L
- 注意:定义long型时,必须在变量值后以大L或小l结尾,编译出来的数字是不带L的
- 通常定义整形变量时,使用int型
- 浮点型
- 单精度float占4字节存储空间,只能精确到7位有效数字,表数-3.403E38~3.403E38
- 双精度double占8字节,精度位float的2倍
- 注意:Java的浮点型常量默认为double型,声明float型常量必须在后面加 'f' 或 'F'。
- 通常定义浮点型使用double
- 字符类型char:
- 1字符 = 2字节
- char c1 = 'a'; 定义方式,只能写一个字符/一个数字/一个汉字等
- 使用char的用途:
- 声明一个字符 char里的每个字符都对应一个ASCII码
- 转义字符 ex: char c2 = '\n'
- 或直接使用unicode值表示字符型的常量 (类似于c语言) ex: char = '\u0123'
- 注:出现乱码注意下字符集,如utf-8可能无法识别中文,编译运行后会出现乱码
- 布尔型boolean
- 取true/false
- boolean bb1 = true;
- 常在条件判断、循环中使用
- 关于转义字符
- \b 退格符
- \n 换行符
- \r 回车符
- \t 制表符
- \" 双引号
- \' 单引号
- \\ 反斜线
*引用数据类型:
(特殊)字符串类型: String
- String类型变量的使用
- String属于引用数据类型,不属于基本数据类型,因此不能使用强制类型转换。
- 声明String类型变量时,使用一对 "" (注意与声明char区分开,与python不太一样)
- String可以和8种基本数据类型变量做运算,且运算只能是连接运算: + 且运算的结果仍然是String类型
- 例: char c = 'a';
- int num = 10;
- String str = "hello";
- System.out.println(c + num + str); //107hello
- System.out.println(c + str + num); //ahello10
- 例2:打印 * *
- "* *" 可
- '*' + '\t' + '*' 不可 (注意char及其背后的ASCII码)
- '*' + "\t" + '*' 可
- '*' + '\t' + "*" 不可
- '*' + ('\t' + "*") 可
五、数据类型的转换
- 基本数据类型之间的运算规则:
- 自动类型提升:讨论的只是7种基本数据类型变量间的运算,不包含boolean类型的
- byte 、char、 short --> int --> long --> float --> double 其可表示的数的范围依次增加
- 当容量小的数据类型的变量与容量大的数据类型的变量做运算时,结果自动提升为容量大的数据类型。 Eg: long + float --> float类型
- 特别的,当byte、char、short三种类型的变量做运算时,结果为int类型
- 强制类型转换:属于自动类型提升运算的逆运算,即从容量大的数据类型转为容量小的数据类型时会使用
- 若要把double转为int,如下:
- double d1 = 12.9;
- int i1 = (int)d1; // 截断操作,只取整,无视小数部分(损失精度)
- System.out.println(i1);
- 精度损失例2:
- 若要把double转为int,如下:
- 自动类型提升:讨论的只是7种基本数据类型变量间的运算,不包含boolean类型的
int i2 = 129;
byte b = (byte)i2;
System.out.println(b); //结果为-127,原理与二进制有关,无需深究,知道会造成精度损失就行
- 注意一:需要使用强转符:()
- 注意二:强制类型转换,可能导致精度损失
- 整型常量(常数):默认类型为int型
- 浮点型常量:默认类型为double型
- 因此,诸如 byte b = 12;
- float f1 = b + 12.3; 会报错,因为12.3为double类型。
六、运算符
包括: 算数运算符、赋值运算符、比较运算符(关系运算符)、逻辑运算符、位运算符、三元运算符
- 算数运算符
- 对于取模运算,结果的符号与被模数的符号相同
- int m2 = - 12;
- int n2 = 5; m2 % n2 = - 2
- 在开发中经常用%来判断能否除尽的情况
- (前)++,(后)++,(前)--,(后)--
- 好处:自增1还不会改变变量本身的数据类型,如果short类型 + 1, 由于1常量为int,加完会变为int,故++可以自加完还是short
- 赋值运算符 =
- eg:int i1 =10;
int j1 =10;
---------连续赋值--------
int i2, j2;
i2 = j2 =10;
--------------------------
int i3 = 10, j3 =20;
- --------------------------------------
- +=、-=、*=、/=、%= 与++类似,也不会改变变量本身的数据类型,不在赘述
- 比较运算符
- 其运算结果为boolean类型
- == / !=:不仅可以使用在数值类型数据之间,还可以使用在其他引用类型变量之间
- 逻辑运算符
- 逻辑运算符操作的都是boolean类型的变量
- 开发中,推荐使用&&或者||,效率更高
- 位运算符
- 位运算符操作的基本都是整数类型
- 【面试题】 如何写出高效的2 * 8的实现方式? 答案:2<<3 或 8<<1
- 三元运算符
- 条件表达式的结果为boolean类型
- 根据条件表达式真或假,决定执行表达式1还是表达式2
- 三元运算符也可以嵌套使用
- 凡是可以使用三元运算符的地方,都可以改写为if-else,反之不成立
- 如果程序既可以使用三元运算符,又可以使用if-else,则优先使用三元运算符,因为其运行效率高。