关键字的定义和特点
- 定义:被Java语言赋予了特殊含义,用做专门用途的字符串(单词)
- 特点:关键字中所有字母都为小写
保留字
Java保留字:现有Java版本尚未使用,但以后版本可能会作为关键字使用。自己命名标记符时要避免使用这些保留字 byValue、cast、future、 generic、 inner、 operator、 outer、 rest、 var 、 goto 、const
文本编辑器
标识符标识符:
- Java 对各种变量、方法和类等要素命名时使用的字符序列称为标识符
- 凡是自己可以起名字的地方都叫标识符。
定义合法标识符规则:
- 由26个英文字母大小写,0-9 ,_或 $ 组成
- 数字不可以开头。
- 不可以使用关键字和保留字,但能包含关键字和保留字。
- Java中严格区分大小写,长度无限制。
- 标识符不能包含空格。
注意:在起名字时,为了提高阅读性,要尽量有意义,“见名知意”。
Java中的名称命名规范:
- 包名:多单词组成时所有字母都小写:xxxyyyzzz
- 类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz
- 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz
- 常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ
变量的概念:
- 内存中的一个存储区域
- 该区域有自己的名称(变量名)和类型(数据类型)
- Java中每个变量必须先声明,后使用
- 该区域的数据可以在同一类型范围内不断变化
使用变量注意:
- 变量的作用域:一对{ }之间有效
- 初始化值
定义变量的格式:数据类型 变量名 = 初始化值
变量是通过使用变量名来访问这块区域的
变量的分类-按数据类型
- 对于每一种数据都定义了明确的具体数据类型,在内存中分配了不同大小的内存空间。
- 补充:变量的分类-按声明的位置的不同
- 在方法体外,类体内声明的变量称为成员变量。
- 在方法体内部声明的变量称为局部变量。
注意:二者在初始化值方面的异同:
同:都有生命周期 异:局部变量除形参外,需显式初始化。
基本数据类型
整数类型:byte、short、int、long
- Java各整数类型有固定的表数范围和字段长度,不受具体OS的影响,以保证java程序的可移植性。
- java的整型常量默认为 int 型,声明long型常量须后加‘l’或‘L’
浮点类型:float、double
- 与整数类型类似,Java 浮点类型也有固定的表数范围和字段长度,不受具体OS的影响。
- Java 的浮点型常量默认为double型,声明float型常量,须后加‘f’或‘F’。
- 浮点型常量有两种表示形式:
① 十进制数形式:如:5.12 512.0f .512 (必须有小数点)
② 科学计数法形式:如:5.12e2 512E2 100E-2
字符类型:char
- char 型数据用来表示通常意义上“字符”(2字节)
- 字符型常量的三种表现形式:
① 字符常量是用单引号(‘ ’)括起来的单个字符,涵盖世界上所有书面语的字符。例如:char c1 = ‘a’; char c2 = ‘中’; char c3 = ‘9’;
② Java中还允许使用转义字符‘\’来将其后的字符转变为特殊字符型常量。例如:char c3 = ‘\n’; // '\n’表示换行符
③ 直接使用 Unicode 值来表示字符型常量:‘\uXXXX’。其中,XXXX代表一个十六进制整数。如:\u000a 表示 \n。 - char类型是可以进行运算的。因为它都对应有Unicode码。
布尔类型:boolean
- boolean 类型适于逻辑运算,一般用于程序流程控制:
① if条件控制语句;
② while循环控制语句;
③ do-while循环控制语句;
④ for循环控制语句; - boolean类型数据只允许取值true和false,无null。
不可以0或非 0 的整数替代false和true,这点和C语言不同。
字符串: String类
- 值null可以赋值给任何引用类型(类、接口、数组)的变量,用以表示这个引用类型变量中保存的地址为空。
- String类属于引用类型,可用null赋值。凡是引用类型,都可以用null作为值,也就是说可以在初始化的时候赋值为null。
- String类是一个典型的不可变类,String对象创建出来就
不可能被改变。创建出的字符串将存放在数据区,保证
每个字符串常量只有一个,不会产生多个副本。
String s0 = “hello”;
String s1 = “hello”;
String s2 = “he” + “ll”+”o”;
System.out.println(s0 ==s1);
System.out.println(s0 ==s2);
Eclipse安装(推荐)
官网下载,方法看以下网址官方下载
网盘下载(推荐)
链接:https://pan.baidu.com/s/1qqiI22OgkW2aw1hTHIjFfQ
提取码:zugz
解压,使用
基本数据类型转换- 自动类型转换:容量小的类型自动转换为容量大的数据类型。数据类型按容量大小排序为:
- 有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算。
- byte,short,char之间不会相互转换,他们三者在计算时首先转换为int类型。
- 当把任何基本类型的值和字符串值进行连接运算时(+),基本类型的值将自动转化为字符串类型。
练习1:编译运行以下代码
强制类型转换
- 自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符(()),但可能造成精度降低或溢出,格外要注意。
- 通常,字符串不能直接转换为基本类型,但通过基本类型对应的包装类则可以实现把字符串转换成基本类型。
- 如: String a = “43”; int i = Integer.parseInt(a);
- boolean类型不可以转换为其它的数据类型。
练习2:判断能否通过编译
运算符运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
- 算术运算符
- 赋值运算符
- 比较运算符(关系运算符)
- 逻辑运算符
- 位运算符
- 三元运算符
算数运算符
算术运算符的注意问题
- 如果对负数取模,可以把模数负号忽略不记,如:5%-2=1。 但被模数是负数则不可忽略。此外,取模运算的结果不一定总是整数。
- 对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。
例如:int x=3510;x=x/1000*1000; x的结果是? - “+”除字符串相加功能外,还能把非字符串转换成字符串.例如:System.out.println(“5+5=”+5+5); //打印结果是?5+5=55
- 以下二者的区别:
System.out.println(’’ + ‘\t’ +’’);
System.out.println("" + ‘\t’ +’’);
练习3:算术运算符:自加、自减
赋值运算符
- 符号:=
① 当“=”两侧数据类型不一致时,可以使用自动类型转换或使用强制类型转换原则进行处理。
② 支持连续赋值。 - 扩展赋值运算符: +=, -=, *=, /=, %=
- 思考1:
short s = 3; s=s+2; ① s+=2; ② ①和②有什么区别?
- 思考2:
boolean b1 = false; //区分好==和=的区别。 if(b1=true) System.out.println("结果为真"); else System.out.println("结果为假");
- 思考3:
int i = 1; i *= 0.1; System.out.println(i);// i++; System.out.println(i);//
比较运算符
- 比较运算符的结果都是boolean型,也就是要么是true,要么是false。
- 比较运算符“==”不能误写成“=” 。
逻辑运算符
&—逻辑与 | —逻辑或 !—逻辑非
&& —短路与 || —短路或 ^ —逻辑异或
- 逻辑运算符用于连接布尔型表达式,在Java中不可以写成3<x<6,应该写成x>3 & x<6 。
- “&”和“&&”的区别:
① 单&时,左边无论真假,右边都进行运算;
② 双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。 - “|”和“||”的区别同理,||表示:当左边为真,右边不参与运算。
- 在不需要逻辑运算两边都参与运算的时候,尽量使用&&和||
- 异或( ^ )与或( | )的不同之处是:当左右都为true时,结果为false。
理解:异或,追求的是“异”!
练习4:请写出每题的输出结果
位运算符
左移<<
:m左移n个单位,即 m = m * 2 ⁿ
(有符号)右移>>
:m右移n个单位,即 m = m / 2 ⁿ
有符号右移看右移后首位是0还是1,是0前面空位补0,是1前面空位补1
无符号右移>>>
:当正数无符号右移时候,与右移>>
一致。
无符号右移,移动之后不管首位是0还是1,空位直接补0。
与运算:按位进行&运算
。都是1结果为1,其他情况都是0。
或运算:按位进行|运算
。都是0结果为0,其他情况结果都是1。
异或运算:按位进行^运算
。都是0或者都是1的时候,结果是0,其他情况结果都是1。
反码:二进制按位取反
- 位运算是直接对二进制进行运算
三元运算符
运算符的优先级
程序流程控制-
顺序结构
① 程序从上到下逐行地执行,中间没有任何判断和跳转。 -
分支结构
① 根据条件,选择性地执行某段代码。
② 有if…else和switch两种分支语句。 -
循环结构
① 根据循环条件,重复性的执行某段代码。
② 有while、do…while、for三种循环语句。
③ 注:JDK1.5之后提供了foreach循环,方便的遍历集合、数组元素。
顺序控制
顺序结构
Java中定义成员变量时采用合法的前向引用。如:
public class Test{
int num1 = 12;
int num2 = num1 + 2;
}
错误形式:
public class Test{
int num2 = num1 + 2;
int num1 = 12;
}
分支语句1: if-else语句
if语句三种格式:
1. if(true){
执行代码块;
}
2. if(条件表达式){
执行代码块;
}
else{
执行代码块;
}
3. if(条件表达式){
执行代码块;
}
else if (条件表达式){
执行代码块;
}
……
else{
执行代码块;
}
if-else语句应用举例
public class TestAge{
public static void main(String args[]){
int age = 75;
if (age< 0) {
System.out.println("不可能!");
} else if (age>250) {
System.out.println("是个妖怪!");
} else {
System.out.println(“人家芳龄 " + age +" ,马马乎乎啦!");
}
}
}
分支结构2:switch语句
switch(变量){
case 常量1:
语句1;
break;
case 常量2:
语句2;
break;
… …
case 常量N:
语句N;
break;
default:
语句;
break;
}
switch语句应用举例
public class Test{
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,枚举,String;
- case子句中的值必须是常量,且所有case子句中的值应是不同的;
- default子句是可任选的,当没有匹配的case时,执行default
- break语句用来在执行完一个case分支后使程序跳出switch语句块;如果没有break,程序会顺序执行到switch结尾
switch和if语句的对比
if和switch语句很像,具体什么场景下,应用哪个语句呢?
- 如果判断的具体数值不多,而且符合byte、 short 、int、 char这四种类型。虽然两个语句都可以使用,建议使用swtich语句。因为效率稍高。
- 其他情况:对区间判断,对结果为boolean类型判断,使用if,if的使用范围更广。
循环结构
- 循环语句功能
在某些条件满足的情况下,反复执行特定代码的功能 - 循环语句的四个组成部分
① 初始化部分(init_statement)
② 循环条件部分(test_exp)
③ 循环体部分(body_statement)
④ 迭代部分(alter_statement) - 循环语句分类
① for 循环
② while 循环
③ do/while 循环
for 循环语句
- 语法格式
for(初始化表达式①; 布尔值测试表达式②; 更改表达式){ 语句或语句块③; }
- 应用举例
public class ForLoop { public static void main(String args[]){ int result = 0; for(int i=1; i<=100; i++) { result += i; } System.out.println("result=" + result); } }
while 循环语句
-
语法格式
[初始化语句] while( 布尔值测试表达式){ 语句或语句块; [更改语句;] }
-
应用举例
public class WhileLoop { public static void main(String args[]){ int result = 0; int i=1; while(i<=100) { result += i; i++; } System.out.println("result=" + result); } }
do-while 循环语句
-
语法格式
[初始化语句] do{ 语句或语句块; [更改语句;] }while(布尔值测试表达式);
-
应用举例
public class WhileLoop { public static void main(String args[]){ int result = 0, i=1; do{ result += i; i++; }while(i<=100); System.out.println("result=" + result); } }
嵌套循环
- 将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for ,while ,do…while均可以作为外层循环和内层循环。
- 实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为false时,才会完全跳出内层循环,才可结束外层的当次循环,开始下一次的循环。
- 设外层循环次数为m次,内层为n次,则内层循环体实际上需要执行m*n=mn次。
特殊流程控制语句1
-
break 语句
-
break语句用于终止某个语句块的执行
{ …… break; …… }
-
break终止当前所在的循环
-
break 语句用法举例
public class TestBreak{ public static void main(String args[]){ for(int i = 0; i<10; i++){ if(i==3) break; System.out.println(" i =" + i); } System.out.println("Game Over!"); } }
特殊流程控制语句2
- 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); } } }
特殊流程控制语句3
- return:并非专门用于结束循环的,它的功能是结束一个方法。当一个方法执行到一个return语句时,这个方法将被结束。
- 与break和continue不同的是,return直接结束整个方法,不管这个return处于多少层循环之内
特殊流程控制语句说明
- break只能用于switch语句和循环语句中。
- continue 只能用于循环语句中。
- 二者功能类似,但continue是终止本次循环,break是终止本层循环。
- break、continue之后不能有其他的语句,因为程序永远不会执行其后的语句。
一维数组声明
一维数组的声明方式: type var[] 或 type[] var;
例如:
int a[];
int[] a1;
double b[];
Mydate[] c; //对象数组
动态初始化:数组声明且为数组元素分配空间与赋值的操作分开进行
int[] arr = new int[3];
arr[0] = 3;
arr[1] = 9;
arr[2] = 8;
静态初始化:在定义数组的同时就为数组元素分配空间并赋值。
int a[] = new int[]{ 3, 9, 8};
int[] a = {3,9,8};
数组元素的引用
- 定义并用运算符new为之分配空间后,才可以引用数组中的每个元素;
- 数组元素的引用方式:数组名[数组元素下标]
- 数组元素下标可以是整型常量或整型表达式。如a[3] , b[i] , c[6*i];
- 数组元素下标从0开始;长度为n的数组合法下标取值范围: 0 —>n-1;如int a[]=new int[3]; 可引用的数组元素为a[0]、a[1]、a[2]
- 每个数组都有一个属性length指明它的长度,例如:a.length 指明数组a的长度(元素个数)
- 数组一旦初始化,其长度是不可变的
数组元素的默认初始化
数组是引用类型,它的元素相当于类的成员变量,因此数组一经分配空间,其中的每个元素也被按照成员变量同样的方式被隐式初始化。例如:
public class Test {
public static void main(String argv[]){
int a[]= new int[5];
System.out.println(a[3]); //a[3]的默认值为0
}
}
多维数组:二维数组[][]:数组中的数组
格式1(动态初始化):int[][] arr = new int[3][2];
定义了名称为arr的二维数组
二维数组中有3个一维数组
每一个一维数组中有2个元素
一维数组的名称分别为arr[0], arr[1], arr[2]
给第一个一维数组1脚标位赋值为78写法是:arr[0][1] = 78;
格式2(动态初始化):int[][] arr = new int[3][];
二维数组中有3个一维数组。
每个一维数组都是默认初始化值null (注意:区别于格式1)
可以对这个三个一维数组分别进行初始化
arr[0] = new int[3]; arr[1] = new int[1]; arr[2] = new int[2];
注:
int[][]arr = new int[][3]; //非法
格式3(静态初始化):int[][] arr = new int[][]{{3,8,2},{2,7},{9,0,1,6}};
定义一个名称为arr的二维数组,二维数组中有三个一维数组
每一个一维数组中具体元素也都已初始化
第一个一维数组 arr[0] = {3,8,2};
第二个一维数组 arr[1] = {2,7};
第三个一维数组 arr[2] = {9,0,1,6};
第三个一维数组的长度表示方式:arr[2].length;
注意
- 注意特殊写法情况:int[] x,y[]; x是一维数组,y是二维数组。
- Java中多维数组不必都是规则矩阵形式
数组排序
- 插入排序:直接插入排序、折半插入排序、Shell排序
- 交换排序:冒泡排序、快速排序(或分区交换排序)
- 选择排序:简单选择排序、堆排序
- 归并排序
- 基数排序
冒泡排序
排序思想:
相邻两元素进行比较,如有需要则进行交换,每完成一次循环就将最大元素排在最后(如从小到大排序),下一次循环是将其它的数进行类似操作。
数组操作常见问题
数组下标越界异常(ArrayIndexOutOfBoundsException)
int[] arr = new int[2];
System.out.println(arr[2]);
访问到了数组中的不存在的脚标时发生。
空指针异常(NullPointerException)
int[] arr = null;
System.out.println(arr[0]);
arr引用没有指向实体,却在操作实体中的元素时。