02_Java基本语法
关键字和保留字
关键字(keyword)的定义和特点
定义:被Java语言赋予了特殊含义,用做专门用途的字符串(单词)特点:关键字中所有字母都为小写官方地址: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html 保留字(reserved word)
Java保留字:现有Java版本尚未使用,但以后版本可能会作为关键字使 用。自己命名标识符时要避免使用这些保留字 goto 、const
用于定义数据类型的关键字
classinterfaceenumbyteshortintlongfloatdoublecharbooleanvoid用于定义流程控制的关键字ifelseswitchcasedefaultwhiledoforbreakcontinuereturn用于定义访问权限修饰符的关键字privateprotectedpublic
用于定义类,函数,变量修饰符的关键字
abstractfinalstaticsynchronized用于定义类与类之间关系的关键字extendsimplements用于定义建立实例及引用实例,判断实例的关键字newthissuperinstanceof用于异常处理的关键字trycatchfinallythrowthrows用于包的关键字packageimport其他修饰符关键字nativestrictfptransientvolatileassert用于定义数据类型值的字面值truefalsenull
标识符(Identifier)
标识符:
Java 对各种变量、方法和类等要素命名时使用的字符序列称为标识符技巧:凡是自己可以起名字的地方都叫标识符。
定义合法标识符规则:
由26个英文字母大小写,0-9 ,_或 $ 组成数字不可以开头。不可以使用关键字和保留字,但能包含关键字和保留字。Java中严格区分大小写,长度无限制。标识符不能包含空格。
Java中的名称命名规范:
包名:多单词组成时所有字母都小写:xxxyyyzzz类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个 单词首字母大写:xxxYyyZzz 常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ
注意1:在起名字时,为了提高阅读性,要尽量有意义,“见名知意”。
注意2:java采用unicode字符集,因此标识符也可以使用汉字声明,但是不建议使用。
变量
变量的概述
变量的概念:
内存中的一个存储区域该区域的数据可以在同一类型范围内不断变化变量是程序中最基本的存储单元。包含变量类型、变量名和存储的值 变量的作用: 用于在内存中保存数据使用变量注意:
Java中每个变量必须先声明,后使用使用变量名来访问这块区域的数据变量的作用域:其定义所在的一对{ }内变量只有在其作用域内才有效同一个作用域内,不能定义重名的变量 基本语法
int a
;
a
= 10;
int b
=10;
变量的分类:按数据类型
变量的分类:按声明的位置的不同
字节
1. 基本数据类型
整形:byte
(1字节
) short
(2字节
) int
(4字节
) long
(8字节
)
浮点数:float
(4字节
) double
(8字节
)
字符:char
(2字节
)
2. 引用数据类型
类
接口
数组
1字节
= 8 bit
字符编码:Java采用unicode来表示字符
1.ASCII码:
一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255。如一个ASCII码就是一个字节。
2. UTF-8编码:
一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。
3. Unicode编码:
一个英文等于两个字节,一个中文(含繁体)等于两个字节。
符号:英文标点占一个字节,中文标点占两个字节。举例:英文句号“.”占1个字节的大小,中文句号“。”占2个字节的大小。
4. Java采用unicode来表示字符,java中的一个char是2个字节,一个中文或英文字符的unicode编码都占2个字节,但如果采用其他编码方式,一个字符占用的字节数则各不相同。
基本数据类型变量间转换
自动类型转换(精度上升):容量小的类型自动转换为容量大的数据类型。数据类型按容量大小排序为:byte、short、char -> int -> long -> float -> long强制类型转换(精度下降):
自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符:(),但可能造成精度降低或溢出,格外要注意。如:char num = (char)1;通常,字符串不能直接转换为基本类型,但通过基本类型对应的包装类则可以实现把字符串转换成基本类型。如:String a = “43”; int i = Integer.parseInt(a);
基本数据类型与Stirng间转换
String str
= 10 + "";
进制与进制间转换
关于进制
所有数字(字符)在计算机底层都以二进制形式存在。对于整数,有四种表示方式:
二进制(binary):0,1 ,满2进1.以0b或0B开头。十进制(decimal):0-9 ,满10进1。八进制(octal):0-7 ,满8进1. 以数字0开头表示。十六进制(hex):0-9及A-F,满16进1. 以0x或0X开头表示。此处的A-F不区分大小写。 如:0x21AF +1= 0X21B0
原码反码补码
为什么要使用原码、反码、补码表示形式呢?
计算机辨别“符号位”显然会让计算机的基础电路设计变得十分复杂! 于是 人们想出了将符号位也参与运算的方法. 我们知道, 根据运算法则减去一个正 数等于加上一个负数, 即: 1-1 = 1 + (-1) = 0 , 所以机器可以只有加法而没有 减法, 这样计算机运算的设计就更简单了。
原码反码补码的计算
Java整数常量默认是int类型,当用二进制定义整数时,其第32位是符号位; 当是long类型时,二进制默认占64位,第64位是符号位二进制的整数有如下三种形式:
原码:直接将一个数值换成二进制数。最高位是符号位负数的反码:是对原码按位取反,只是最高位(符号位)确定为1。负数的补码:其反码加1。 计算机以二进制补码的形式保存所有的整数。
正数的原码、反码、补码都相同负数的补码是其反码+1
转换流程
运算符
算术运算符
运算符运算范例结果
+正号+33-负号b=4; -b-4+加5+510-减6-42*乘3*412/除5/51%取模(取余)7%52++++自增(前):先自增1,后运算自增(后):先运算,后自增1a=2;b=++a; a=2;b=a++;a=3;b=3 a=3;b=2––自减(前):先自减1,后运算 自减(后):先运算,后自减1a=2;b=- -a a=2;b=a- -a=1;b=1 a=1;b=2+字符串连接“He”+”llo”“Hello”
int a1
= 10;
int b1
= ++a1
;
System
.out
.println("a1 = " + a1
+ ",b1 = " + b1
);
int a2
= 10;
int b2
= a2
++;
System
.out
.println("a2 = " + a2
+ ",b2 = " + b2
);
int a3
= 10;
++a3
;
int b3
= a3
;
short s1
= 10;
s1
++;
System
.out
.println(s1
);
byte bb1
=127;
bb1
++;
System
.out
.println("bb1 = " + bb1
);
int a4
= 10;
int b4
= a4
--;
System
.out
.println("a4 = " + a4
+ ",b4 = " + b4
);
赋值运算符
符号:=
当“=”两侧数据类型不一致时,可以使用自动类型转换或使用强制 类型转换原则进行处理。支持连续赋值。
扩展赋值运算符:+=, -=, *=, /=, %=
开发中,如果希望变量实现+2的操作,有几种方法?(前提:int num = 10;) 方式一:num = num + 2; 方式二:num += 2; (推荐,这种方式不会改变数据类型)
开发中,如果希望变量实现+1的操作,有几种方法?(前提:int num = 10;) 方式一:num = num + 1; 方式二:num += 1; 方式三:num++; (推荐,这种方式不会改变数据类型)
比较运算符(关系运算符)
比较运算符的结果都是boolean型,也就是要么是true,要么是false。比较运算符“==”不能误写成“=” 。| < >= <=:只能使用在数值类型的数据之间。(整数类型和浮点类型 )==和!=:不仅可以使用在数值类型数据之间,还可以使用在其他引用类型变量之间。
运算符运算范例结果
==相等于4==3false!=不等于4!=3true<小于4<3false>大于4>3true<=小于等于4<=3false>=大于等于4>=3trueinstanceof检查是否是类的对象“Hello” instanceof Stringtrue
class CompareTest {
public static void main(String
[] args
) {
int i
= 10;
int j
= 20;
System
.out
.println(i
== j
);
System
.out
.println(i
= j
);
boolean b1
= true;
boolean b2
= false;
System
.out
.println(b2
== b1
);
System
.out
.println(b2
= b1
);
System
.out
.println("hello" instanceof String);
}
}
逻辑运算符
逻辑运算符操作的都是
boolean类型的变量。而且结果也是
boolean类型
1. & 逻辑与
, && 短路与
2. |逻辑或
, ||短路或
3. !逻辑非
4. ^逻辑异或
aba&ba&&ba|ba||b!aa^b
truetruetruetruetruetruefalsefalsetruefalsefalsefalsetruetruefalsetruefalsetruefalsefalsetruetruetruetruefalsefalsefalsefalsefalsefalsetruefalse
结论:
逻辑运算符用于连接布尔型表达式,在Java中不可以写成3<x<6,应该写 成x>3 & x<6 。“&”和“&&”的区别:
单&时,左边无论真假,右边都进行运算;双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。 “|”和“||”的区别同理,||表示:当左边为真,右边不参与运算。异或( ^ )与或( | )的不同之处是:当左右都为true时,结果为false。
理解:异或,追求的是“异”,所以异就是true同就是false!
位运算
位运算是直接对整数的二进制进行的运算
位运算符:操作的是整数类型
& | ^ 与 或 异或
<< :在一定范围内,每向左移1位,相当于* 2
>>:在一定范围内,每向右移1位,相当于/ 2,如果是正数用0填充,如果是负数用1填充
>>> : 无符号右移,用0在左边填充
位运算符
运算符运算范例<<左移3 << 2 = 12 --> 322=12>>右移3 >> 1 = 1 --> 3/2=1>>>无符号右移3 >>> 1 = 1 --> 3/2=1&与运算6&3=2|或运算6|3=7^异或运算6^3=5~取反运算~6 = -7
位运算符的细节
<<空位补0,被移除的高位丢弃,空缺位补0。>>被移位的二进制最高位是0,右移后,空缺位补0; 最高位是1,空缺位补1。>>>被移位二进制最高位无论是0或者是1,空缺位都用0补。&二进制位进行&运算,只有1&1时结果是1,否则是0;|二进制位进行 | 运算,只有0 | 0时结果是0,否则是1;^相同二进制位进行 ^ 运算,结果是0;1^1=0 , 0^0=0 不相同二进制位 ^ 运算结果是1。1^0=1 , 0^1=1~正数取反,各二进制码按补码各位取反 负数取反,各二进制码按补码各位取反
三元运算符
练习
int i
= 1;
i
*= 0.1;
System
.out
.println(i
);
i
++;
System
.out
.println(i
);
int m
= 2;
int n
= 3;
n
*= m
++;
System
.out
.println("m=" + m
);
System
.out
.println("n=" + n
);
int n1
= 10;
n1
+= (n1
++) + (++n1
);
System
.out
.println(n1
);
boolean x
=true;
boolean y
=false;
short z
=42;
if((z
++==42)&&(y
=true))z
++;
if((x
=false) || (++z
==45)) z
++;
System
.out
.println("z="+z
);
程序流程控制
其流程控制方式采用结构化程序设计中规定的三种基本流程结构,即:顺序结构 、 分支结构 、 循环结构
顺序结构:程序从上到下逐行地执行,中间没有任何判断和跳转。分支结构:
根据条件,选择性地执行某段代码。有if…else和switch-case两种分支语句。 循环结构
根据循环条件,重复性的执行某段代码。有while、do…while、for三种循环语句。注:JDK1.5提供了foreach循环,方便的遍历集合、数组元素。
顺序结构
程序从上到下逐行执行,中间没有任何判断和跳转。
分支结构(if、elseif、else、switch-case)
public class SwitchTest {
public static void main(String args
[]) {
int i
= 1;
switch (i
) {
case 0:
System
.out
.println("zero"); break;
case 1:
System
.out
.println("one"); break;
default:
System
.out
.println("default"); break; }
}
}
switch语句有关规则
switch(表达式)中表达式的值必须是下述几种类型之一:byte,short, char,int,枚举 (jdk 5.0),String (jdk 7.0);case子句中的值必须是常量,不能是变量名或不确定的表达式值;同一个switch语句,所有case子句中的常量值互不相同;break语句用来在执行完一个case分支后使程序跳出switch语句块;如果没有break,程序会顺序执行到switch结尾default子句是可任选的。同时,位置也是灵活的。当没有匹配的case时,执行default
循环结构(for、while、do…while)
概述
循环结构:在某些条件满足的情况下,反复执行特定代码的功能
循环语句分类:for 循环 、while 循环 、do…while 循环
循环语句的四个组成:
初始化部分(init_statement)循环条件部分(test_exp):返回值必须是boolean类型循环体部分(body_statement)迭代部分(alter_statement)
for循环
语法格式:for (①初始化部分; ②循环条件部分; ④迭代部分){ ③循环体部分; }
说明:
②循环条件部分为boolean类型表达式,当值为false时,退出循环①初始化部分可以声明多个变量,但必须是同一个类型,用逗号分隔④可以有多个变量更新,用逗号分隔
while循环
语法格式:
①初始化部分 while(②循环条件部分){③循环体部分;④迭代部分; }
说明:
注意不要忘记声明④迭代部分。否则,循环将不能结束,变成死循环。for循环和while循环可以相互转换
do…while
语法格式:
①初始化部分; do{③循环体部分④迭代部分 }while(②循环条件部分);
说明:do-while循环至少执行一次循环体,因为程序由上至下执行所以循环体肯定会被执行一次。
嵌套循环(多重循环)
将一个循环放在另一个循环体内,就形成了嵌套循环。其中, for ,while ,do…while均可以作为外层循环或内层循环。实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的 循环条件为false时,才会完全跳出内层循环,才可结束外层的当次循环,开 始下一次的循环。设外层循环次数为m次,内层为n次,则内层循环体实际上需要执行m*n次。
1. 循环结构的4个要素
- 初始化条件 --
> 只要是表达式就行(比如 int a
= 0, system.out.println
("hahha"))
- 循环条件 --
> 是boolean类型
(true 就走循环体,false就结束循环
)
- 循环体
- 迭代条件
2. for循环
for
(初始化条件
;循环条件
;迭代条件
){
循环体
}
特殊关键字的使用
break的使用
break语句用于终止某个语句块的执行
{...
break;
....
}
break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是 哪一层语句块
label1:
{...
lable2:
{...
label3:
{
...
break label2
;
....
}
}
}
continue的使用
continue 语句
continue只能使用在循环结构中continue语句用于跳过其所在循环语句块的一次执行,继续下一次循环continue语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环
continue语句用法举例
public class ContinueTest {
public static void main(String args
[]){
for (int i
= 0; i
< 100; i
++) {
if (i
%10==0)
continue;
System
.out
.println(i
);
}
}
}
特殊流程控制语句说明
break只能用于switch语句和循环语句中。continue 只能用于循环语句中。二者功能类似,但continue是终止本次循环,break是终止本层循环。break、continue之后不能有其他的语句,因为程序永远不会执行其后的语句。标号语句必须紧接在循环的头部。标号语句不能用在非循环语句的前面。很多语言都有goto语句,goto语句可以随意将控制转移到程序中的任意一条语句上,然后执行它。但使程序容易出错。Java中的break和continue是不同于goto的。