第二章 变量与运算符
一、关键字和保留字
-
关键字(keyword)
定义: 被Java语言赋予了特殊含义,用做专门用途的字符串(单词)
特点: 关键字中所有字母都为小写- Java保留字:现有Java版本尚未使用, 但以后版本可能会作为关键字使
用。自己命名标识符时要避免使用这些保留字
goto 、 const
- Java保留字:现有Java版本尚未使用, 但以后版本可能会作为关键字使
二、标识符
- 标识符:
Java 对各种变量、 方法和类等要素命名时使用的字符序列称为标识符
技巧:凡是自己可以起名字的地方都叫标识符。
定义合法标识符规则:
-
由26个英文字母大小写, 0-9 , _或 $ 组成
-
数字不可以开头。
-
不可以使用关键字和保留字,但能包含关键字和保留字。
-
Java中严格区分大小写,长度无限制。
-
标识符不能包含空格。
- Java中的名称命名规范:
- 包名:多单词组成时所有的字母都小写:xxxyyyzzz
- 类名、接口名: 多单词组成时,所有单词的首字母大写: XxxYyyZzz
- 变量名、方法名: 多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写: xxxYyyZzz
- 常量名:所有字母都大写。多单词时每个单词用下划线连接: XXX_YYY_ZZZ
三、变量
-
概念:
- 内存中的一个存储区域
- 该区域的数据可以在同一类型范围内不断变化
- 变量是程序中最基本的存储单元,包含变量类型、变量名和存储的值,在Java中定义变量时必须定义变量的类型,也可以先声明变量不赋值,后面赋值时不必再定义类型
-
Java中的主要数据类型:
-
基本数据类型:
(1)数值型:
- 整数类型
(byte(1字节=8 bit,-128~127)、short(2字节)、int(4字节)、long(8字节,赋值时以L结尾,如果不加L相当于是int转为long,赋值的值为int,当其大于int范围就会报错))
-
浮点类型
float(单精度,4字节,可精确到7位有效数字,表示范围超过long)定义float时变量值的末尾要以f或F结尾
double(双精度,8字节,精度是单精度的2倍)通常定义浮点型采用double
(2)字符型(char,1字符=2字节)
- 定义char型变量,通常使用‘’,内部只能写一个字符
- 表示方式:1.声明一个字符 2.转义字符‘\n’换行符,‘\t’制表符相当于tab键 3.使用 Unicode 值来表示字符型常量 ‘\uXXXX’。其中, XXXX代表一个十六进制整数。
(3)布尔型(boolean)true,false
-
引用数据类型:
(1)类(class)字符串String属于类类型
(2)接口(interface)(3)数组([ ])
-
String类型变量(字符串)使用
- String类型属于引用数据类型
- 声明String类型变量时,使用一对“”
- String可以跟八种数据类型做运算,且运算只能是连接运算,+,结果为String类型
- 多个变量相加时如果没有括号,从左到右计算,如果出现了一个String后面的全为String,前面的根据实际情况计算
- String类型有很多方法,比如.charAt(int index) 来获取指定索引的字符、.equals()判断两个字符串是否相等
-
-
前7种变量之间的运算
-
自动类型提升
当容量小的数据类型的变量与容量大(表示数的范围,不是所占内存)的数据类型的变量做运算时,结果自动提升为容量大的数据类型
byte --> int -->short -->long --> float -->double
特别地,当byte、char、short三种类型的变量做运算时,结果为int型,char当做ascii码计算
-
强制类型转换
-
需要强转符(),括号里写需要强制转换成的类型
-
强转时可能会有精度损失,比如浮点型转换为整型会截断
-
不能把String类型强制转换为其他类型,如果需要转换需要调用特殊的方法如
int num = Interger.parseInt(str);
-
-
注意
- 整型常量默认类型为int型
- 浮点型常量默认为double型
- 所以当声明变量为byte或者float时,在赋值时遇到整数或者浮点数需要进行强制类型转换
-
-
进制
对于整数,不同进制的表示方式:
-
二进制:满2进1,以0b或0B开头表示
最高位为符号位,正数的补码与原码相同,负数的补码为反码+1,反码为除符号位外取反,由负数补码得到原码,也是取反+1
-
十进制:满10进1
-
八进制:满8进1,以数字0开头表示
-
十六进制:0-9及A-F,满16进1,以0x或0X表示,此处的A-F不区分大小写
-
四、运算符
-
算术运算符
+(正号,加,字符串连接),-(负号,减),*,/(当涉及到整型相除想到的不截断的浮点数,需要对任意一个整型变量进行强制转换或者在后面加0.0),%(取模,所得结果的正负只与被模数有关,经常用于判断一个数能不能整除另一个数),++(有两种情况:在前++前的变量先加1取值再执行代码,在后先执行代码后++后的变量再加1取值),–(同++)
-
赋值运算符
=、+=(不会改变变量的数据类型,推荐使用)、-=、*=、/=、%=,还可以连续赋值int i,j;i=j=1;
-
比较运算符(关系运算符)
==、!=、<、>、<=、>=返回值为boolean
-
逻辑运算符
&(逻辑与)、|(逻辑或)、!(逻辑非)
&&(短路与)、||(短路或)、^(逻辑异或)
-
&&和||与&和|的计算结果相同
-
短路是指&&时,当&&前为false时,&&右边的运算不再执行。当为||时,当||前为true时,||右边的运算不再执行
-
-
位运算符(很少用)
位运算是直接对整数的二进制进行的运算
<<(左移)、>>(右移)、>>>(无符号右移)
&(与运算)、|(或运算)、^(异或)、~(取反)
-
左移是整体左移n位,右边空出来的位补零,相当于原来的数乘以2^n,注意第一个不为0的位超过了最高位就不成立了,负数也成立
-
在一定范围内,没向左移一位,相当于除以2,负数也成立,左移时最高位根据以前的数时正数还是负数来取值
-
无符号右移是最高位都用0来补,负数会变成正数
-
-
三元运算符
(条件表达式)?表达式1 : 表达式2
注意:
- 条件表达式的结果为boolean类型
- 根据条件表达式的真或假,决定执行表达式1还是表达式2,为true时执行1,为false执行2
- 表达式1和表达式2可以统一成一个类型的情况下才能使用
- 三元运算符可以嵌套使用
- 凡是用三元运算符的地方都可以改写为if else,反之不成立
-
运算符的优先级
不需要特殊记忆,怕用错就把想先计算的加小括号
五、流程控制
分支结构
-
if语句
-
if(条件表达式){
执行代码块;
}
-
if(条件表达式){
执行代码块1;
}
else{
执行代码块2;
}
-
if(条件表达式1){
执行代码块1;
}
else if (条件表达式2){
执行代码块2;
}
……
else{
执行代码块n;
}
-
如何从键盘获取值:
使用Scanner类
步骤:
-
导包:import java.util.Scanner;
-
Scanner的实例化 Scanner scan = new Scanner(System.in);//System.in指的是从键盘获取输入
-
调用Scanner类的相关方法,来获取指定类型的变量nextInt()(其他的数据类型类型同理)、next()(获取字符串)
注意:需要根据相应的方法,来输入指定类型的值
-
-
如何获取一个随机数:
Math.random() -->返回一个[0.0,1.0)的double类型的值,如要得到整型需要强制类型转换
如果想得到一个[a,b)的数,可以通过(int)(Math.random() * (b - a) + a)
-
-
switch-case结构:
switch(表达式){case 常量1:
语句1;
//break;
case 常量2:
语句2;
//break;
……
case 常量N:
语句N;
//break;
default:
语句;
//break;
}
-
根据switch-case表达式中的值依次匹配各个case中的常量,一旦匹配成功,则进入相应case结构中,执行里面的语句,在调用完执行语句后,仍会继续向下执行其他case结构中的执行语句(不会判断后面的情况直接执行),直到出现break关键字或者执行到末尾才会跳出,因此如果不想执行后面的执行语句需要每一个case里都加入break
-
switch结构中的表达式,只能是如下的6种数据类型之一:
byte、short、char、int、枚举类型、String类型
-
case 后面只能声明常量,不能声明范围
-
break关键字是可选的,根据实际情况添加
-
default是上面的都不满足执行default中的语句,default结构是可选的,不是必须的,而且default的位置是可选的不一定非得放最后,但它仍然是最好考虑的
循环结构
-
for循环
for( 初始化条件; 循环条件; 迭代条件){
循环体;
}
- 循环条件必须是boolean类型
- 当初始化条件或者迭代部分有多个时,中间用,隔开
-
while循环
while(循环条件){
循环体;
迭代条件; //注意得加迭代部分否则会出现死循环
}
-
do-while循环
do{
循环体;
迭代条件;
}while();
-
无限循环
while(true),for( ; ; )
-
循环嵌套
一般为两个for循环嵌套,外层循环表示行,内层循环表示列
-
特殊关键字的使用:break和continue
- break使用在switch-case结构和循环结构中,结束当前循环,默认跳出离关键字最近的循环
- continue使用在循环结构中,结束当次循环
- 注意:这两个关键字的后面都不能紧跟其他执行语句
- 如果在循环嵌套中break在内层循环中想结束外层循环可以在外层循环的for前面加一个标签如label : for(),然后break关键字变成了 break label; continue同理