一、关键字和保留字
关键字:具有特殊含义
特点:所有关键字都是小写的
int final等等
保留字:现在未使用,以后可能以关键字使用
goto、const
二、标识符的命名规范
1、定义:凡是可以自己起名字的都是标识符
2、规则
①字母数字下划线或$
②数字不可以开头
③不可以使用关键字和保留字,但可以包含
④严格区分大小写,长度无限制
⑤不能包含空格
3、命名规范
包名:多单词组成时所有字母都小写 xxxyyyzzz
类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz
变量名、方法名:多单词组成时,第一个单词的首字母小写,第二个开始每个单词首字母大写:xxxYyyZzz
常量名:所有字母都大写,多单词时每个单词用下划线连接:XXX_YYY_ZZZ
4、注意
①见名知意
②Java采用Unicode字符集,因此标识符也可以用汉字声明,不建议使用
三、变量
1、先声明后使用
2、数据类型 变量名=变量值;
强类型语言
3、说明
①变量必须先声明后使用
②变量都定义在其作用域内,在作用域内,它是有效的,换句话说,出了定义域就失效了
③同一个作用域内,不可以声明两个同名的变量
4、数据类型
①按照数据类型分
基本数据类型:数值型:整数类型(byte\short\int\long),浮点类型(double\float);字符型(char);布尔型(boolean)
引用数据类型:类(class)–字符串在类中、接口(interface)、数组([])
②整数类型
1 2 4 8字节
long后面要加l/L
byte范围:-128~127
常用和默认int
③浮点型
单精度 4float
双精度 8double
float后面必须加f或F
float表示数值的范围比long还大 ,但是double的精确度高
常用和默认double
④字符型
一字符=2字节
char c1=‘a’;
转义字符
⑤布尔类型
true false
常在条件判断、循环结构中使用
直接使用unicode制表符
5、变量在类中声明的位置
成员变量 vs 局部变量
6、自动类型转换和强制类型转换
这里讨论的只是七种基本数据类型转换,没有布尔类型
①自动类型转换
当容量小的的数据类型的变量与容量大的数据类型的变量做运算时,结果自动提升为容量大的 byte和short和char—> int–> long–> float–> double 从左向右靠
特别的当byte和short和char三种类型的变量做运算时,结果为int
②强制类型转换
需要使用强转符()
强制类型转换,可能导致精度损失
(int)12.23=12 损失
7、字符串类型
①引用数据类型
②“”
③string可以和八种基本数据类型做运算,且运算只能是连接运算+ 运算的结果仍然是string类型
四、运算符
1、算数运算符
- / % ++ –
前++ ++i:先自增1,然后再运算
后++ i++:先运算,后自增1
2、赋值运算符
= += -= *= /= %=
3、比较运算符
== != < > <= >= instanceof()检查是否为类的对象
4、逻辑运算符
& | ! && || ^
说明: ①逻辑运算符操作的都是布尔类型的变量,位运算符左右是数值型的
②&与&&的区分
相同点:&与&&的运算结果相同
当符号左边是true的时候,二者都会执行符号右边的运算
不同点:当符号左边是false时,&继续执行符号右边的运算。(短路与)&&不再执行符号右边的运算
5、位运算符(了解)
操作的都是整型的数据 针对二进制数来说的左右移动 向左移后补0 向右移 左补0
每向左移一位 相当于2 右移 /2
左移 3<<2=12–>32*2=12
右移 3>>1=1–>3/2=1 最高位时0或1不变
无符号右移 3>>>1=1–>3/2=1 最高位是0(第一个数)
//把其写成二进制 然后用逻辑与或运算 最后出结果
…0 0 0 0
…0 1 0 1
——————
…0 1 0 1
&与运算 6&3=2
| 或 运算 6|3=7
^ 异或运算 6^3=5
~取反运算 ~6=7 0变1 1变0
6、三元运算符(推荐使用)
(表达式)?表达式1:表达式2;
可以嵌套使用
凡是用三元运算符的都可以写成if else的,反之不成立
7、运算符的优先级
五、流程控制
1、分支结构
第一种:
if(条件表达式)
{
执行表达式1;
}
第二种:
if(条件表达式)
{
执行表达式1;
}else
{
执行表达式2;
}
第三种:
if(条件表达式)
{
执行表达式1;
}else if
{
执行表达式2;
}
......
else{
执行表达式n;
}
用键盘输入
①导包:import java.util.Scanner
②Scanner的实例化:Scanner scan=new Scanner(System.in);
③调用Scanner类的相关方法来获取指定类型的变量
int num=scan.nextInt();
nextFloat等也行
switch-case结构
switch(表达式){
case 常量1:
语句1;
break;
case 常量2:
语句2;
break;
......
case 常量N:
语句N;
break;
default:
语句;
break;
}
switch()中的小括号里面,只能是如下的6种数据类型之一:byte、short、char、int、枚举类型、string类型
case后面只能声明常量 效率比if else高
2、循环结构
四个要素: ①初始化条件
②循环条件
③循环体
④迭代条件
第一种
①
while(②)
{
③;
④;
}
第二种
①
do
{
③;
④;
}
while(②)
第三种
for(①;②;④){
③
}
3、break和continue关键字
break:switch-case循环结构种 结束当前循环
continue:循环结构中 结束本次循环
六、数组
1、数组的相关概念
数组名、元素、角标(下标、索引)、数组的长度:元素的个数
2、数组的特点
①数组是有序排列的
②数组是引用变量类型。数组的元素既可以是基本数据类型也可以是引用数据类型
③创建数组对象会在内存中开辟一整块连续的空间
④数组的长度一旦确定不能修改
3、数组的分类
①按照维数:一维数组、二维数组
②按照数组元素的类型:基本数据类型元素的数组、引用数据类型元素的数组
4、一维数组的使用
①一维数组的声明和初始化
//1.1静态初始化:数组的初始化和数组元素的赋值操作同时进行
int [] num;//声明
num=new int[]{1,2,3};
//1.2动态初始化:数组的初始化和数组元素的赋值操作分开进行
String [] names=new String[5];//初始化
总结:数组一旦初始化完成,其长度就确定了
②如何调用数组的指定位置的元素
0----length-1
③如何获取数组的长度
names.length
④如何遍历数组
for循环
⑤数组元素的默认初始化
值为0 0.0 false null
⑥数组的内存解析
栈---局部变量 堆---new的内容
5、二维数组的使用
对于二维数组的理解,我们可以看成是一维数组array1又作为另一个一维数组array2的元素而存在
其实,从数组底层来看,没有多维数组
①二维数组的声明和初始化
//1.1静态初始化:数组的初始化和数组元素的赋值操作同时进行
int [] [] num=new int[][]{{1,2,3},{1,2}};
//1.2动态初始化:数组的初始化和数组元素的赋值操作分开进行
String [] [] names=new String[5][2];//初始化
String [] [] name=new String[5][2];
②如何调用数组的指定位置的元素
arr[ ][ ]
③如何获取数组的长度
.length
④如何遍历数组
⑤数组元素的默认初始化
对于初始化方式1.2.1
外层a[ ]是地址值
内层a[ ][ ]是0
对于初始化方式1.2.1
外层a[ ]是null
内层a[ ][ ]:不能调用,否则报错
⑥数组的内存解析
栈---局部变量
堆---new的内容
第一个数组中的每一个小块指向另一个数组
int [] arr4={1,2,3};正确
6、数组的工具类
在帮助文档中
① boolean equals(int[] a,int[] b) 判断两个数组是否相等。
②String toString(int[] a) 输出数组信息。
③void fill(int[] a,int val) 将指定值填充到数组之中。
④ void sort(int[] a) 对数组进行排序。
⑤ int binarySearch(int[] a,int key) 对排序后的数组进行二分法检索指定的值。
7、数组中常见异常
数组脚标越界异常(ArrayIndexOutOfBoundsException)
int[] arr = new int[2];
System.out.println(arr[2]);
System.out.println(arr[-1]);
访问到了数组中的不存在的脚标时发生。
空指针异常(NullPointerException)
int[] arr = null;
System.out.println(arr[0]);
arr引用没有指向实体,却在操作实体中的元素时。