第二章:基本语法
2021年3月20日
11:14
关键字(keyword)的定义和特点
Ø定义:被Java语言赋予了特殊含义,用做专门用途的字符串(单词)
Ø特点:关键字中所有字母都为小写
标识符(Identifier)
标识符:
ØJava 对各种变量、方法和类等要素命名时使用的字符序列称为标识符
Ø技巧:凡是自己可以起名字的地方都叫标识符。
l定义合法标识符规则:
Ø由26个英文字母大小写,0-9 ,_或 $ 组成
Ø数字不可以开头。
Ø不可以使用关键字和保留字,但能包含关键字和保留字。
ØJava中严格区分大小写,长度无限制。
Ø标识符不能包含空格。
lJava中的名称命名规范:
Ø包名:多单词组成时所有字母都小写:xxxyyyzzz
Ø类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz
Ø变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz
Ø常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ
l 注意1:在起名字时,为了提高阅读性,要尽量有意义,“见名知意”。
l 注意2:java采用unicode字符集,因此标识符也可以使用汉字声明,但是不建议使用。
Java定义的数据类型
一、变量按照数据类型来分:
基本数据类型:
整型:byte short int long 存储空间从小到大
浮点型:float double
字符型:char
布尔型:boolean
引用数据类型:
类(class)(字符串属于这个)
接口(interface)
数组(array)
二、变量在类中声明的位置:
成员变量 局部变量
byte(1字节=8bit)的取值范围 -128 ~ 127
声明long型变量,必须以“l”或“L”结尾
Java 的浮点型常量默认为double型,声明float型常量,须后加‘f’或‘F’
float比long的取值范围还要大,但是精度不如long
定义char型变量,通常使用一对'',内部只能写一个字符
表示方式:1.声明一个字符 2.转义字符 3.直接使用Unicode值表示字符型常量
char c1 = '\n';
char c2 = '\u0028';
//布尔型
boolean bb1 = true;
//bb1 = 0;编译错误,Java的布尔型只能取两个值之一:true、false
\\n 可以输出\n
\" 可以输出"
char相加,是Unicode编码相加。用""双引号括住才是字符串相加
char c1 = '中';
System.out.println(c1 + 1);//20014
System.out.println('中' + '国');//42282
自动类型提升:
当容量小的数据类型的变量与容量大的数据类型的变量做运算时,结果自动提升为容量大的数据类型。(此时的容量大小指的是,表示数的范围的大和小。比如float容量要大于long的容量)
byte、char、short → int → long → float → double
特别的:当byte、char、short三种类型的变量做运算时,结果为int型(包括两个同类型运算)
整型常量,运算时默认类型为int型
浮点型常量,运算时默认类型为double型
byte b = 5;
b = b + 3;//编译失败,b+3此时变成了int
char c = '';//编译不通过
String c = "";//编译没问题
char c = 'a';
int num = 10;
String str = "hello";
System.out.println(c + num + str);//a10hello × 107hello
System.out.println(c + str + num);//ahello10
System.out.println(c + (num + str));//a10hello
System.out.println((c + num) + str);//107hello
System.out.println(str + num + c);//hello10a
“+”作为连接运算符还是加运算符,主要看有没有String。有String就是连接运算符,没有就是加号
********按单步的运算结果看
c + num + str,结果是char和num先相加,再和String连接
a的ASCII码是97,A是65
String str1 = 4;//编译错误,int无法转换为String
String str1 = "123"; int num1 = (int)str1;//编译错误,无法强转 int num1 = Integer.parseInt(str1); |
二进制,以0b或0B开头
十进制
八进制,以数字0开头
十六进制,以0x或0X开头,A-F不区分大小写
字节的第一位是符号位,0代表正数,1代表负数
原码除符号位取反变成反码,反码+1变成补码
计算机以二进制补码的形式保存所有的整数
Ø正数的原码、反码、补码都相同
Ø负数的补码是其反码+1
例如:
10101011是-43的原码
11010100是-43的反码
11010101是-43的补码
十进制转二进制:除2取余的逆
char c2 = 97;
System.out.println(c2);//a
char可以用ASCII码赋值,不用加单引号,但是通常不这么用
char c4 = '5'; int i2 = c4; //53 int i2 = (int)c4; //53 |
两种效果一样,char不用强转,可以直接赋值给int
int num1 = 12; int num2 = 5; double result6 = (double)num1 / num2; //2.4 double result7 = (double)(num1 / num2); //2.0 // 强转的优先级跟括号一样 |
//取余(取模)运算: %
//结果的符号与被模数的符号相同
//开发中,经常使用%来判断能否被除尽的情况
++i 先自增1,后运算
i++ 先运算,后自增1
自增1不会改变变量本身的数据类型
short s1 = 10; //s1 = s1 + 1;//编译失败 //s1 = (short)(s1 + 1);//正确 s1++;//自增1不会改变变量本身的数据类型 short s2 = s1++; //s1=12,s2=11 |
+=不会改变变量本身的数据类型
int n2 = 10; n2 += (n2++) + (++n2); //n2 = n2 + (n2++) + (++n2) = 10 + 10 + 12 System.out.println(n2); //32 |
比较运算符
== != < > <= >= instanceof
比较运算符的结果是boolean类型
int i = 10; int j = 20; System.out.println(i == j);//false System.out.println(i = j);//20,把j赋值给i,然后输出i boolean b1 = true; boolean b2 = false; System.out.println(b2 == b1);//false System.out.println(b2 = b1);//true |
逻辑运算符
& 逻辑与 && 短路与
| 逻辑或 || 短路或
! 逻辑非 ^ 逻辑异或
逻辑运算符操作的都是boolean类型的变量,结果也都是boolean型的变量
//区分 & 与 && // 相同点1:& 与 && 的运算结果相同 // 相同点2:当符号左边是true时,二者都会执行符号右边的运算 // 不同点:当符号左边是false时,&继续执行符号右边的运算,&&不再执行符号右边的运算 // 开发中,推荐使用&& //区分:| 与 || // 相同点1:| 与 | 的运算结果相同 // 相同点2:当符号左边是false时,二者都会执行符号右边的运算 // 不同点3:当符号左边是true时,|继续执行符号右边的运算,||不再执行符号右边的运算 // 开发中,推荐使用|| |
开发中,推荐使用 && 和 ||
& 和 | 属于逻辑运算符还是位运算符,取决于操作的数据类型,如果是布尔型就是逻辑运算符,如果是数值就是位运算符
三元运算符可以嵌套使用
如果程序既可以使用三元运算符,又可以使用if-else结构,那么优先选择三元运算符。原因:简洁、执行效率高。
如何从键盘获取不同类型的变量:需要使用Scanner类
具体实现步骤:
1. 导包: import java.util.Scanner;
2. Scanner的实例化:Scanner scan = new Scanner(System.in);
3. 调用Scanner类的相关方法,来获取指定类型的变量
Scanner scan = new Scanner(System.in); int num = scan.nextInt(); //对于char型的获取,Scanner没有提供相关的方法。只能获取一个字符串 next(); 字符串 nextBoolean(); nextByte(); nextDouble(); |
if(b = false){};
这种写法,是先把false赋值给b,然后再用b判断,类似于
System.out.println(b = 4);
先把4赋值给b,然后再输出b
int y = 1; if(y > 2) System.out.println(y); //不会输出 System.out.println("第二条输出"); //正常输出 //有输出,下面第二条输出语句跟if是并列的。if不带大括号,只可以包含一条语句。 |
int m = 4; int n = 1; if(m > 2) if(n > 2) System.out.println(m + n); //System.out.println("atguigu"); else //就近原则,这个else会跟着离它最近的if,所以上面的if变成了大环境 System.out.println("m is " + m); |
没有大括号的情况下,else会遵循就近原则,跟着离它最近的if
获取随机数
//如何获取一个随机数: 10 - 99 int value = (int)(Math.random() * 90 + 10); //[0.0,1.0) -- [0.0,90.0) -- [10.0,100.0) -- [10,99] //公式:[a,b] : (int)(Math.random() * (b - a + 1) + a) |
判断字符串是否相等字符串.equals("字符串");
switch-case结构:
1.格式 switch(表达式){ case 常量1: 执行语句1; //break; case 常量2: 执行语句2; //break; ... default: 执行语句n; //break; } 2. 说明: ① 根据switch表达式中的值,依次匹配各个case中的常量。一旦匹配成功,则进入相应case结构中,调用其执行语句。 当调用完执行语句以后,则仍然继续向下执行其他case结构中的执行语句,直到遇到break关键字或此switch-case结构末尾结束为止。 ② break,可以使用在switch-case结构中,表示一旦执行到此关键字,就跳出switch-case结构 ③ switch结构中的表达式,只能是如下的6种数据类型之一: byte 、 short 、 char 、 int 、 枚举类型(JDK5.0新增) 、 String类型(JDK7.0新增) ④ case之后只能声明常量,不能声明范围 ⑤ break关键字是可选的 ⑥ default:相当于if-else结构中的else。 default结构是可选的,而且位置是灵活的。放在其他位置不影响default的作用(兜底),但是如果default放在前面并且没有break的话,default执行之后会继续往下执行其他case,直到碰到break。 ⑦ case常量的值不可以相同,会编译失败 |
可以通过不写执行语句和break的方式实现多个case匹配一样的执行语句
switch(表达式){ case 0: case 1: case 2: 执行语句; break; case 3: case 4: 执行语句2; break; } |
可以用switch-case不写break依次执行的特性计算某一天是当年的第几天(case倒着写,从12写到1,到第几月的时候就把前几个月的时长加上)
//获取当前时间距离1970-01-01 00:00:00的毫秒数 long start = System.currentTimeMillis(); //返回long类型 |
for(int j = 2;j <= Math.sqrt(i);j++){} //Math.sqrt(double) 开方,参数是double类型,返回也是double类型 //计算i是否为质数的时候,只需要判断小于等于根号i的整数有没有i的约数就可以了,不用遍历到i |
break 结束当前循环,默认结束的是包裹此关键字最近的一层循环
continue 结束当次循环
结束指定标识的一层循环结构 label:for(;;){ for(;;){ //break; //默认跳出包裹此关键字最近的一层循环 //continue; break label; //结束label循环 continue label; //结束当次label循环,进入label的下一次循环 } } |
break和continue关键字后面都不能声明执行语句(编译失败:无法访问的语句)
string.toUpperCase(); //将此 String 中的所有字符都转换为大写
string.toLowerCase(); //将此 String 中的所有字符都转换为小写
结尾
使用 Microsoft OneNote 2016 创建。 版权所有:古木苏