夜雪天狼
学习笔记
技术博文
转载备份
心灵鸡汤
目录
java语法简介
发布者:caijw
阅读量:61838
发布时间:2013-06-07 03:17:09
# 关键字 被Java赋予了特殊含义的单词,体现上都是英文小写 ## 关键字列表 1. 用于定义数据类型的关键字 1. 基本数据类型: * 整数类型:byte、short、int、long * 浮点类型:float、double * 字符类型:char * 布尔型:boolean 2. 引用数据类型:class(类);interface(接口) 2. 用于定义数据类型值的关键字 true(真) false(假) null(空) 3. 用于定义流程控制的关键字 * 判断:if、else、switch、case、default * 循环:for、while、do * 重新循环:continue * 跳出循环或跳出switch结构:break * 返回:return 4. 用于定义访问权限修饰符的关键字 private(私有的) default(默认) protected(受保护的) public(公有的) 5. 用于定义类、函数,变量修饰符的关键字 abstract(抽象的) final(最终的) static(静态的) synchronized(同步的) enum(枚举) 6. 用于定义类与类与接口之间关系的关键字 extends(继承) implements(实现) 7. 用于定义建立实例及引用实例,判断实例的关键字 new(建立实例) this(当前引用) super(父类引用) instanceof(判断对象类型) 8. 用于异常处理的关键字 try(检查异常) catch(捕获异常) finally(最终执行) throw throws:用于抛出异常,但使用位置不同 9. 用于包的关键字 package(创建包) import(导入包) 10. 其他修饰关键字 native(本地) strictfp(strict float point,精确浮点) transient(变量修饰符,用它声明一个实例变量,在对象序列化时不会被序列化) volatile(类型修饰符,用来修饰被不同线程访问和修改的变量) assert(断言,可以看作是异常处理的一种高级形式,用于捕捉我们在代码中做出的假设) 11. 注:main不是关键字,却是被虚拟机所识别的一个名称,是程序的入口 -separator- # 标识符 在程序中自定义的一些名称。由25个英文字母大小写,数字0-9,符合 _ $组成。 ## 定义合法标识符的规则 1. 数字不可以开头 2. 不可以使用关键字 3. 注:Java中严格区分标识符的大小写。在起名字的时候,为了提高阅读性,要尽量有意义。 ## Java中的名称规范 1. 包名:多单词组成时所有字母都小写:xxxyyyzzz 2. 类名接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz 3. 变量名和函数名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz 4. 常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ -separator- # 常量 Java中固定不变的、表示不能改变的数值 ## 常量的分类 1. 整数常量:所有整数 2. 小数常量:所有小数 3. 布尔型常量:较为特有,只有两个数值:true false 4. 字符常量:将一个数字字母或者符号用单引号('')标识 5. 字符串常量:将一个或者多个字符用双引号("")标识 6. null常量:只有一个数值就是:null ## 整数的三种表现形式 十进制:0-9,满10进1 八进制:0-7,满8进1。用0开头表示 十六进制:0-9,A-F,满16进1。用0x开头表示 ## 进制的基本转换 1. 十进制-->二进制 简而言之:除2取余数 2. 二进制-->十进制 如1100的十进制等于:23*1+22*1+21*0+20*0=12。 简而言之:乘以2的幂数。 3. 十进制<-->八进制<-->十六进制 有简便的算法就是,可以先将十进制转换为二进制,再转换为八进制和十六进制。这就利用了一个八进制位相当于三个二进制位,而一个十六进制位相当于四个二进制位。 负数的二进制表现形式:只要将对应的正数取反加1就行了。如:-6的二进制 4. 注:负数的最高位都为1 -separator- # 变量 内存中的一个存储空间。有自己的名称(变量名)和类型(数据类型) ## 作用 用来不断的存放同一类型的数据,并可以重复使用。 ## 定义变量的格式 数据类型 变量名 =初始化值; ## 数据类型 Java中有两种数据类型:1、基本数据类型;2、引用数据类型。 以下讲解基本数据类型:说明:Java程序中,整数默认:int,小数默认:double ## 类型的自动提升 在运算中,当低类型数据与高类型数据进行计算时,系统会自动将表达式中的低类型数据提升到高类型。如: byte b = 3 ; int c; c= b + 2; //b会自动提升为int类型进行运算 ## 强制类型转换 当程序中,数据类型需要变换时,可以进行强制转换。如: byte b = 3; b = b + 4;//报错 b = (byte)b+4;//强制类型转换,强制将b+4的结果转换为byte类型,再赋值给b -separator- # 运算符 ## 算术运算符 1. 进行取模运算时,如果有负数,运算结果取决于运算左边有没有负数 2. 字符串数据和任何数据使用 +都是相连接,最终都会变成字符串 ## 赋值运算符 符号:=,+=,-=,*=,/=,%= int a,b,c; a=b=c =3; int a = 3; a+=5;//等同运算a=a+5; ## 比较运算符 1. 比较运算符的结果都是boolean型,也就是要么是true,要么是false 2. 比较运算符“==”不能误写成“=” ## 逻辑运算符 逻辑运算符用于连接boolean类型的表达式 1. &:只要两边的boolean表达式结果,有一个为false,那么结果就是false。只有两边都为true,结果为true 2. |:两边只要有一个为true,结果为true;只有两边都为false,结果为false 3. ^:两边相同结果是false,两边不同结果是true &和&&的区别: 单&时:左边无论真假,右边都进行运算 双&时:如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算 “|”和“||”的区别同理:双或时,左边为真,右边不参与运算 ## 位运算符 1. 左移:<< 空位补0,被移除的高位丢弃,空缺位补0 2. 右移:>> 被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,空缺位补1。 3. 无符号右移:>>> 被移位二进制最高位无论是0或者是1,空缺位都用0补。 4. 与: & 二进制位进行&运算,只有1&1时结果是1,否则是0。 5. 或:| 二进制位进行 |运算,只有0 | 0时结果是0,否则是1。 6. 异或: ^ 任何相同二进制位进行 ^运算,结果是0;1^1=0 , 0^0=0。不相同二进制位 ^运算结果是1。1^0=1 , 0^1=1。 7. 反码:~ 对二进制进行取反 ## 三元运算符 格式:(条件表达式)?表达式1:表达式2 1. 如果条件为true,运算后的结果是表达式1 2. 如果条件为false,运算后的结果是表达式2 -separator- # 转义字符 通过 \ 来转变后面字母或符号的含义 ## 常用转义字符 \b:退格 \n:换行 \t:制表符,相当于tab键 \r:回车 \\:表示反斜杠 \':表示单引号 \":表示双引号 -separator- # 流程控制语句 主要有:判断结构、选择结构和循环结构 ## 判断结构——if ```java //第一种 if(条件表达式) { //执行语句; } //第二种 if(条件表达式) { //执行语句; } else { //执行语句; } //第三种 if(条件表达式) { //执行语句; } else if (条件表达式) { //执行语句 } else { //执行语句; } ``` if语句特点: 1. 每一种格式都是单条语句,被{}括起来的多条语句也可以作为单条语句 2. 第二种格式与三元运算符的区别:三元运算符好处是:可以简化if else代码;弊端是运算完要有值出现。 3. 条件表达式无论写成什么样子,最终的结果不是true就是 false ## 选择结构——switch ```java switch(表达式) { case 取值1: 执行语句; break; case 取值2: 执行语句; break; //... default: 执行语句; break; } ``` switch语句特点: 1. switch语句选择的类型只有四种:byte,short,int, char。 2. case之间与default没有顺序。先执行第一个case,没有匹配的case执行default。 3. 结束switch语句的两种情况:1、遇到break结束;2、执行到switch结尾结束。 4. 如果匹配的case或者default没有对应的break,那么程序会继续向下执行,运行可以执行的语句,直到遇到break或者switch结尾结束 注:JDK1.5以后可以接收枚举类型,JDK1.7以后可以接收字符串。 if和switch语句很像。具体什么场景下,应用哪个语句呢?如果判断的具体数值不多,而且符合byte short int char这四种类型。虽然两个语句都可以使用,建议使用switch语句,因为效率稍高。其他情况:对区间判断,对结果为boolean类型判断,使用if,if的使用范围更广。 ## 循环结构——while,do while,for ```java /** while和do while的区别: 1. while:先判断条件,只有条件满足才执行循环体。 2. do while:先执行循环体,再判断条件,条件满足,再继续执行循环体。 */ //while语句格式: while(条件表达式) { 执行语句; }; //do while语句格式: do { 执行语句; } while(条件表达式); /** for语句说明: 1、for里面的连个表达式运行的顺序,初始化表达式只读一次,判断循环条件,为真就执行循环体,然后再执行循环后的操作表达式,接着继续判断循环条件,重复这个过程,直到条件不满足为止 2、while与for可以互换,区别在于for为了循环而定义的变量在for循环结束就是在内存中释放。而while循环使用的变量在循环结束后还可以继续使用。 3、最简单无限循环格式:while(true){}, for(;;){},对于for来讲,不写条件表达式默认就是ture。无限循环存在的原因是并不知道循环多少次,而是根据某些条件,来控制循环。 for语句格式: */ for(初始化表达式;循环条件表达式;循环后的操作表达式) { 执行语句; }; ``` 注: > 什么时候使用循环结构?当要对某些语句执行很多次时,就使用循环结构。 > 一定要明确哪些语句需要参与循环,哪些不需要 ## 流程控制语句中的关键字——break,continue * break(跳出)语句:应用范围:选择结构和循环结构 * continue(继续)语句:应用于循环结构 注: a、这两个语句离开应用范围,存在是没有意义的 b、这个两个语句单独存在时,下面都不可以有语句,因为执行不到。 c、continue语句是结束本次循环继续下次循环。 -separator- # 函数 定义在类中的具有特定功能的一段独立小程序,也称方法。 ## 格式 ```java /** 返回值类型:函数运行后的结果的数据类型 参数类型:是形式参数的数据类型 形式参数:是一个变量,用于存储调用函数时传递给函数的实际参数 实际参数:调用函数时传递给形式参数的具体数值 return:用于结束函数 返回值:该值会返回给调用者 */ 修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,…){ 执行语句; return 返回值; } ``` ## 特点 定义函数可以将功能代码进行封装,便于对该功能进行复用 函数只有被调用才会被执行 函数的出现提高了代码的复用性 对于函数没有具体返回值的情况,返回值类型用关键字void表示,那么该函数中的return语句如果在最后一行可以省略不写 ## 注意事项 1、函数中只能调用函数,不可以在函数内部定义函数 2、定义函数时,函数的结果应该返回给调用者,交由调用者处理 ## 定义函数的前提 1、明确要定义的功能最后的结果是什么 2、明确在定义该功能的过程中,是否需要未知内容参与运算 ## 函数重载(override) 1、概念 > 在同一个类中,允许存在一个以上的同名函数,只要它们的参数列表的个数或者参数类型不同即可 2、特点 > 与返回值类型无关,只看参数列表 3、好处 > 方便于阅读,优化了程序设计 4、什么时候用到重载 > 当定义的功能相同,但参与运算的未知内容不同。那么,这时就定义一个函数名称以表示起功能,方便阅读,而通过参数列表的不同来区分多个同名函数。 -separator- # 数组 同一种类型数据的集合。是一种容器,用来装东西的 可以自动给数组中的元素从0开始编号,方便操作这些元素 ## 一维数组 格式1:元素类型 [ ]数组名 = new 元素类型 [元素个数或数组长度] ; > 如:int [] arr = new int [3]; 格式2:元素类型 []数组名 = new 元素类型 [ ]{元素1,元素2,…}; > 如:int [] arr = new int []{1,2,3,4,5}; 格式3:简写的静态初始化格式 > 如:int [] arr={1,2,3,4,5}; 其中:new是用来在堆内存中产生一个容器实体 ## 数组操作常见问题 ```java //数组角标越界异常(ArrayIndexOutOfBoundsException):访问到了数组中的不存在的角标时发生 int[] arr = new int[4]; System.out.println(arr[4]); //空指针异常(NullPointerException):arr引用没有指向实体,却在操作实体中的元素时。 int[]arr = null; System.out.println(arr[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][]; > 此种格式中每个一维数组都是默认初始化值null。 格式3:int[][] arr = {{3,8,2},{2,7},{9,0,1,6}}; > 每一个一维数组中具体元素都初始化了 ## 数组常见操作 数组的常见操作有排序,查找 常见的排序方式:冒泡排序和选择排序。在Java已经定义好了一种排序方式,在开发使用中,直接调用即可。排序的方式有很多,其中最快的排序方式为希尔排序 查找的常用方式就是二分查找 数组排序--选择排序 ```java //使用选择排序方式对指定的数组进行排序 class Demo { public static void main(String[] args) { int[] arr= {1,11,5,3,9,55,23,67,18}; //输出原数组 printArray(arr); //调用排序方法 selectSort(arr); //输出排序后的数组 printArray(arr); } /* 选择排序 1、先用0角标上的元素依次与其他元素进行比较,将较小值元素存放到0角标。 2、然后再拿1角标上的元素依次进行比较,以此类推。 */ public static void selectSort(int[] arr) { //外循环遍历数组 for (int x=0;x
arr[y]) { //arr[x]=arr[y]; //arr[y]=temp; swap(arr,x,y); } } } } //遍历数组 public static void printArray(int[] arr) { System.out.print("["); for (int x=0;x
arr[y+1]) swap(arr,y,y+1); } } } //遍历数组 public static void printArray(int[] arr) { System.out.print("["); for (int x=0;x
max) return min; else if(key>arr[mid]) min=mid+1; else max=mid-1; mid=(max+min)>>>1;//折半操作 } return mid; } //折半查找(二) public static int halfSearch2(int[] arr,int key) { int min=0,max=arr.length-1,mid; while(min
>>1;//折半操作 if(key>arr[mid]) min=mid+1; else if(key