JAVA 基础
一、 Java编程风格与命名规范
1. 格式规范
a) 缩进嵌套的代码
b) 断开很长的句子
c) 使用空白
d) 不要直接使用Tab控制符
2. 命名规范
a) JAVA源文件的命名
JAVA源文件名必须和源文件中所定义的类的类名相同。且不能为关键字
b) Package的命名
Package名的第一部分应是小写ASCII字符,并且是顶级域名之一,通常是com、edu、gov、mil、net、org或由ISO标准3166、1981定义的国家唯一标志码。Package名的后续部分由各组织内部命名规则决定,内部命名规则指定了各组件的目录名,所属部门名、项目名等。
c) Class/Interface的命名
Class名应是首字母大写的名词, 而且大写中间单词的首字母。命名时应该使其简洁而又具有描述性。异常类的命名,应以Exception结尾。Interface的命名规则与Class相同。
d) 常量的命名
常量名的字母应全部大写,不同单词之间通过下划线连接,并且名字组合应该赋予含义。
e) 变量的命名
- 普通变量
普通变量名的首字母小写,其它每个单词的首字母大写。命名时应该使其简短而又有特定含义,简洁明了的向使用者展示其使用意图。
- 约定变量
所谓约定变量,是指那些使用后即可抛弃(throwaway)的临时变量。通常i、j、k、m和n代表整型变量;c、d和e代表字符型变量。
f) 方法的命名
方法名的第一个单词应是动词,并且首字母小写,其它每个单词首字母大写。
g) 方法参数的命名
选择有意义的名称作为方法的参数名。可能的话,选择和需要赋值的字段一样的名字。
详见Java编程风格与命名规范-ZZ
二、 语法基本元素
1. 关键字
a) 定义:被JAVA语言赋予了特殊含义的单词。
b) 特点:关键字中所有字母都为小写。
c) 注意:goto和const作为保留字存在,目前并不使用。
2.
标识符
a) 含义:标识符就是给类,接口,方法,变量等起名字时使用的连续字符序列。
b) 组成规则:① 英文大小写字母A~Z和a~z ② 数字字符0~9 ③ $ 和 _
c) 注意事项:① 不能以数字开头 ② 不能是Java中的关键字 ③ 区分大小写
④ 不能有空格
3. 数据类型、常量和变量
a) 基本数据类型
byte、short、int、long、float、double、char、boolean
b) 引用数据类型
数组、类、接口。
分类 |
不同类型 |
关键字 |
字节数 |
取值范围 |
默认值 |
整数型 |
字节型 |
byte |
1个字节 |
-27~27-1(-128~127) |
0 |
短整型 |
short |
2个字节 |
-215~215-1(-32768~32767) |
0 |
|
整型 |
Int (默认) |
4个字节 |
-231~231-1 |
0 |
|
长整型 |
long |
8个字节 |
-263~263-1 |
0 |
|
文本型 |
字符型 |
char |
2个字节 |
0~216-1(从0~65536) |
‘\u0000’ |
浮点型 |
单精度浮点型 |
float |
4个字节 |
大约±3.40282347E+38F (有效位数为6~7位) |
0.0f |
双精度浮点型 |
Double (默认) |
8个字节 |
大约±1.79769313486231570E+308 (有效位数为15位) |
0.0d |
|
逻辑型 |
布尔型 |
boolean |
1个字节 |
True/false |
false |
级别从低到高为:(byte-->short),char (这两个平级)--> int--> float--> long--> double
补充: 不同的字符所占的字节是不同的。详见输入输出章节之字符编码。
0x 0
c) 数据类型转换
不同的基本数据类型之间进行运算时需要进行类型转换,除boolean类型外所有的基本数据类型都需要考虑类型转换,其主要应用在算术运算和赋值运算时。
- 自动类型转换:除boolean型外,其他数据类型系统自动从低级别到高级别转换;
- 强制类型转换:把一个高级别的数赋给一个低级别的的变量。
- Ø 溢出处理:待补充
- 补充:同种类型之间才可以进行强制装换。错误举例:String a = (String)2;
正确举例:String a = integer.toString(2)或int i = integer.parseInt(s);
d) 变量
所有局部变量在使用前都得初始化。详见类与对象部分。
e) 常量
在程序执行的过程中其值不可以发生改变的量,Java中常量可分为字面值常量和自定义常量。 eg. final double PI = 3.14;
- 字符串常量 用双引号括起来的内容
- 整数常量 所有整数 12,23,默认为int,长整型加字母‘L ’
- 小数常量 所有小数 12.34,56.7,默认为都double,float加字母‘F’
- Ø 字符常量 用单引号括起来的内容‘a’,‘A’,‘0’和转义字符常量”\n”
- 布尔常量 较为特殊,只有true和false
- 空常量 null (数组部分讲解)
- 符号常量 用一个标识符来表示的常量,修饰符final,eg.#definePI3.14
f)
|
整型常量的三种进制表示形式
- 十进制整数,如12, -314, 0。
- 八进制整数,要求以0开头,如012
- 十六进制数,要求0x或0X开头,如0x12
- 十进制数形式,必须含有小数点,例如:
f) 浮点类型常量两种表示形式
3.14 314.0 时 .314
- 科学记数法形式,如
3.14e2 3.14E2 314E2
g) 转义字符的用法
- System.out.println(“Hello\nWorld”);
- System.out.println(“Hello”+”\n”+”World”);
4. 运算符和表达式
表达式是由运算符与操作数组合而成的,运算符指明对操作数的运算方式。组成表达式的Java操作符有很多种。运算符按照其要求的操作数数目来分,可以有单目运算符、双目运算符和三目运算符,它们分别对应于1个、2个、3个操作数。运算符按其功能来分,有算术运算符、赋值运算符、关系运算符、逻辑运算符、位运算符和其他运算符。
优先级 |
运 算 符 |
含义描述 |
1 |
() ,.,[] |
强制运算、方法调用 |
2 |
++ ,--, + ,~(位取反), !(逻辑取反) |
一元运算、字符串相加 |
4 |
* , / , % |
算术运算 乘除、取余 |
5 |
+ , - |
算术运算 加减(正负) |
7 |
<,>,<= ,>= , |
比较运算、类运算 |
8 |
= = , ! = ,.equals() |
比较运算 |
9 |
& |
逻辑(位)运算 与 |
10 |
^ |
位运算 异或 |
11 |
| |
逻辑(位)运算 或 |
12 |
&& |
逻辑 与(短路) |
13 |
|| |
逻辑 或(短路) |
14 |
?: eg. (关系表达式)?表达式1:表达式2; |
三元 条件运算 |
a) 算术运算符
(* , / , % , + , -)
- %:任何整数模2不是0就是1,所以只要改变被模数就可以实现开关运算。
- +:加法运算符,连接符。举例:123+321+hello=444hello;hello+123+321=hello123321;hello+(123+321)=hello444;
- ++,--:自增自减运算。举例:int a=5;print(4++);//5 print(++4);//7
- * , /:注意小数类型计算问题。1/2*2=0,1/2*2.0=0,1/2.0*2=1.0。整型与整型运算得整型,整形与浮点型运算得浮点型,结果取取决于第一次遇到浮点型的位置。
b) 赋值运算符
(= , *= , /= , %= , += , -=)
c) 比较运算符
(<,>,<= ,>= ,= = , ! =) boolean bo=(i==j);
特点:该运算符的特点是:运算完的结果,要么是true,要么是false。
待补充:==与.equals()区别:
d) 逻辑运算符
(&, | , ^ , ! ,&&, ||)
逻辑运算符除了 ! 外都是用于连接两个boolean类型表达式。
- &:只有两边都为true结果是true。否则就是false。
- |:只要两边都为false结果是false,否则就是true。
- ^:异或:和或有点不一样。
u 两边结果一样,就为false;
u 两边结果不一样,就为true。
- & 和 &&区别:
u &:无论左边结果是什么,右边都参与运算(建议短路与);
u &&: 短路与,如果左边为false,那么右边不参数与运算。
- | 和|| 区别:
u |:两边都运算(建议短路或);
u ||:短路或,如果左边为true,那么右边不参与运算。
三、 流程控制
在Java中,流程控制分为三种基本结构:顺序结构、分支结构和循环结构。
If 判断: |
else If 判断: |
If 判断(嵌套): |
switch 判断: |
||
if (表达式) { //语句1; }else{ //语句2; } 类比: (关系表达式)? 表达式1:表达式2; 注:else语句可用 Continue代替; |
if (表达式1) { //语句1; } else if (表达式2) { //语句2; … } else { //语句3; } |
If (表达式1) { if(表达式2) { //语句1; } else { //语句2; } } else { //语句3; } |
switch (表达式) { case 常量1: 语句1; break; case 常量2: 语句2; break; … default: 语句3; } |
||
while循环: |
do-while循环: |
for循环: |
|||
while(表达式) { //循环体; } |
do{ //循环体; } while(表达式); |
for(初始化;条件;迭代) { //循环体; } |
|||
1. 循环语句
a) 循环是相同动作的集合.
b) 循环次数确定的情况,通常选用for循环;
循环次数不确定的情况,通常选用while或do-while循环。
c) 初始情况不满足循环条件时,while循环一次都不会执行;
do-while循环不管任何情况都至少执行一次。
d) for 循环,若变量在判断条件内初始化,则作用域为循环体(大括号)内。
e) 嵌套循环判断条件:内层循环一圈,外层循环一次。
2. 判断语句
a) 多重if与switch选择结构比较
- 相同点:都是用来处理多分支条件的结构
- 不同点:switch选择结构只能处理等值条件判断的情况;多重if选择结构没有switch选择结构的限制,特别适合某个变量处于某个连续区间时的情况。
b) else If 顺序进行判断,当前面条件不满足时才进行下一步,条件满足,跳过剩余结构,结束判断语句。
c) switch 后面的小括号中的变量应该是int、short、byte、char、枚举类型、String。
d) switch 可进行语句合并,以进行连续区间判断。(省去语句和break)
3. 跳转语句
a) break:结束判断语句,执行完判断体后的语句后,终止离自己最近的外层循环。
do { Stringtitle = input.next(); if (title.equals("exit")) { break; } } while (true);// 跳出死循环 |
b) continue:结束判断语句,终止本次循环,不执行判断体后面语句,进入下一次循环。
publicstaticvoidmain(String[] args) { inti = 0; do { i++; if (i == 3) { // break; // 输出12 continue; // 输出1245 } System.out.println(i); } while (i<5); } |
c) return:结束当前方法的执行并退出,并返回值到调用该方法的语句处。
for (inti = 0; i<10; i++) { if (i % 2 != 0) return; System.out.print(i); } // 运行结果:0 |
4. flag 或index标记的用法
- 循环内判断用flag标记返回判断结果。
- 返回函数返回值时,用flag传递返回值。
- 需要交互输入的函数最好放在测试类的main中,否者传递返回值会很麻烦。
四、 数组
数组是一个变量,存储相同数据类型的一组数据
步骤 |
举例 |
解释 |
声明 |
int[ ] a; |
告诉计算机数据类型是什么 |
分配空间 |
a = new int[5]; |
告诉计算机分配几个连续的空间 |
赋值 |
a[0] = 8; |
向分配的格子里放数据 |
引用 |
a[0] = a[0] * 10; |
引用数据进行计算 |
1. 数组的常用操作
a) 声明数组并分配空间
数据类型[ ] 数组名 = new 数据类型[大小];
b) 数组的初始化(声明的同时赋值)
- 方法1: 边声明边赋值。
int[ ] scores = {89, 79, 76};
int[ ] scores = new int[ ]{89, 79, 76};
- 方法2:动态地从键盘录入信息并赋值。
Scanner input = new Scanner(System.in);
for(int i = 0; i < 30; i ++){
scores[i] = input.nextInt();}
- 创建数组并赋值的方式在一条语句中完成。
- 所有的数组下标默认从0开始,而且访问时不可超出定义的上限,否则会产生越界错误。
- for 遍历 (逆序输出)
c) 数组的遍历
for (intk = array.length - 1; k>= 0; k--) {// 逆序输出 System.out.print(array[k]+"\t"); } |
- for增强型函数
for (inttemp : array) {// 用for增强型函数对数组进行顺序输出 System.out.println(temp); } |
- 对数组进行增添,修改,删除
数组的增添举例: String[] phones = new String[] {"iPones4S", "iPones5", null}; // null 不用加双引号 intindex = -1;// 增加监视器 for (inti = 0; i<phones.length; i++) {// 1.增加iPones6 if (phones[i] == null) { index = i; break; } } if (index != -1) { phones[index] = "iPones6"; } else { System.out.println("数组已满"); } System.out.println(Arrays.toString(phones)); |
注释:数组的修改与删除类似
d) 数组的排序
- 冒泡排序
for (intm = 0; m<array.length - 1; m++) { // 冒泡排序 for (intn = 0; n<array.length - 1 - m; n++) { if (array[n] >array[n + 1]) { inttemp = array[n]; array[n] = array[n + 1]; array[n + 1] = temp; } } } |
e) 使用Arrays 类操作数组
方法名称 |
说明 |
|
Arrays. |
boolean equals(array1,array2) |
比较array1和array2两个数组是否相等 |
sort(array) |
对数组array的元素进行升序排列 |
|
String toString(array) |
将一个数组array转换成一个字符串 |
|
void fill(array,val) |
把数组array所有元素都赋值为val |
|
copyOf(array,length) |
把数组array复制成一个长度为length 的新数组,返回类型与复制的数组一致 |
|
int binarySearch(array, val) |
查询元素值val在数组array中的下标 (要求数组中元素已经按升序排列 |
注释:import java.util.*;
2. 二维数组
一、 数组的初始化
String[][] str = newString[5][]; int[][] scores = newint[][] { { 90, 85, 54 }, { 76, 80 },{ 87 } }; int[][] scores = { { 90, 85, 54 }, { 76, 80 }, { 87 } }; |
二、 数组的遍历
publicclassCase5 { // 二维数组的遍历 publicstaticvoidmain(String[] args) { int[][] scores = newint[][] { { 90, 78, 54 }, { 76 , 80 }, { 87 } }; for (inti = 0; i<scores.length; i++) { //外层数组长度 for (intj = 0; j<scores[i].length; j++) {//内层数组长度 System.out.println(scores[i][j]); } } } } |