张孝祥IT课堂 -Java就业培训教程 主讲老师:□□□
第二讲 java 编程基础
Java的基本语法(1) java代码的位置 java是严格区分大小写的 java是一种自由格式的语言 java程序有三种注释方式 代码分为结构定义语句和功能执行语句 功能执行语句的最后必须用分号结束 java程序有三种注释方式
Java的基本语法(2) java中的标识符 java中的包、类、方法、参数和变量的名字,可由任意顺序的大小写字母、数字、下划线(_)和美元符号($)组成,但标识符不能以数字开头,不能是关键字。 合法的标识符: indentifier username user_name _userName $username 非法的标识符: class 98.3 Hello World
java的关键字 abstract do implement private this boolean double import protected throw break else instanceof public throws byte extend int return transient case false interface short true catch final long static try char fianlly native strictfp void class float new super volatile continue for null switch while default if package synchronized 注:java 无sizeof ,goto, const 关键字,但不能用goto const作为变量名
java中的常量(1) 整型常量 长整型常量 单精度浮点数 双精度浮点数 布尔常量 十进制(12) ,十六进制 (0x12),八进制(012) 长整型常量 13L 单精度浮点数 5.1f,.4f ,2e3f ,0f 双精度浮点数 5.1,.4,2e-3,0d 布尔常量 true和false
java中的常量(2) 字符常量 字符串常量 null常量 ‘a’ , ‘8’, '\u0027' ‘\r‘表示接受键盘输入,相当于按下了回车键; ‘\n‘是换行; ‘\t‘是制表符,相当于table键; ‘\b‘是退格键,相当于Back Space; ‘\‘‘是单引号,而‘\“‘是双引号; ‘\\‘是一个斜杠“\”。 字符串常量 “Hello World“,”123”, "Welcome \nXXX" null常量 null常量只有一个值,用null表示,表示对象的引用为空
变量的概念与作用 变量就是系统为程序分配的一块内存单元,用来存储各种类型的数据。根据所存储的数据类型的不同,有各种不同类型的变量。变量名代表这块内存中的数据 。 int x=0,y; y=x+3; 执行这两条语句的过程中,内存分配及变化情况。X在被取值前必须被初始化。
java的变量类型 整数类型(byte, short, int, long) 数值型 浮点类型(float, double) 基本数据类型 字符型(char) 布尔型(boolean) 数据类型 类(class) 引用数据类型 接口(interface) 数组
变量字节大小及有效取值范围 byte占用一个字节,数字大小为-27—27-1 short占用两个字节,数字大小为-215—215-1 int占用四个字节,数字大小为-231—231-1 long占用八个字节,数字大小为-263—263-1 float占用四个字节,数字大小为1.4E-45~3.4E+38 , -1.4E-45~-3.4E+38 。用二进制的指数形式表示一个浮点数的格式,如:101*22 , 101*2-3 double占用八个字节,数字大小为4.9E-324~1.7E+308, -4.9E-324~-1.7E+308 。 char占两个字节,数字大小为0—216-1,是unicode编码。字符的本来面目,我们为什么可以直接将一个数字赋给字符变量。 Boolean占一个字节,其取值只有两个,true和false。
浮点数在内存中的表示方式 在JDK文档中查找Float. intBitsToFloat的说明 打印出最大数和最小数及它们的二进制格式 打印出无穷大与NaN及它们的二进制格式 分析0x50000000所对应的浮点数
类型转化 自动类型转换(也叫隐式类型转换) 强制类型转换(也叫显式类型转换) 类型转换的原理 及什么时候要用 强制类型转换 表达式的数据类型自动提升 所有的byte型、short型和char的值将被提升到int型。 如果一个操作数是long型,计算结果就是long型; 如果一个操作数是float型,计算结果就是float型; 如果一个操作数是double型,计算结果就是double型。 分析 System.out.println(‘a’+1)与 System.out.println(“”+’a’+1) 的区别。
变量的生命周期与作用域 变量要先定义,后使用,但也不是在变量定义后的语句一直都能使用前面定义的变量。我们可以用大括号将多个语句包起来形成一个复合语句,变量只能在定义它的复合语句中使用。 public class TestScope { public static void main(String[] args) int x = 12; int q = 96; // x和q都可用 int x = 3;//错误的定义,Java中不允许有这种嵌套定义 System.out.println("x is "+x); System.out.println("q is "+q); } q = x; /* 错误的行,只有x可用, q 超出了作用域范围 */ }
函数 函数(子程序)的概念与作用。 定义一个函数的格式 编写打印三个矩形的程序(用流水帐的方式与用函数的方式进行对比分析)。 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,….) { 程序代码 return 返回值; } 其中: 形式参数:在方法被调用时用于接收外部传入的数据的变量。 参数类型:就是该形式参数的数据类型。 返回值:方法在执行完毕后返还给调用它的程序的数据。 返回值类型:函数要返回的结果的数据类型。 实参:调用函数时实际传给函数形式参数的数据。 如何理解函数返回值类型为void的情况
函数的调用 函数调用的格式 在函数中使用return提前返回 函数调用的过程分析
函数的重载 函数的重载就是在同一个类中允许同时存在一个以上的同名函数,只要它们的参数个数或类型不同即可。 如: public class Test { public static void main(String [] args) int isum; double fsum; isum=add(3,5); isum=add(3,5,6); fsum=add(3.2,6.5); } public static int add(int x,int y) reutrn x+y; public static int add(int x,int y,int z) return x+y+z; public static double add(double x,double y) return x+y;
java中的运算符 运算符是一种特殊符号,用以表示数据的运算、赋值和比较,一般由一至三个字符组成 。运算符共分以下几种: 算术运算符 赋值运算符 比较运算符 逻辑运算符 移位运算符
算术运算符
算术运算符的注意问题 “+”除字符串相加功能外,还能把非字符串转换成字符串 ,如: “x”+123;的结果是“x123” 。 如果对负数取模,可以把模数负号忽略不记,如:5%-2=1。但被模数是负数就另当别论了。 对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。 int x=3510;x=x/1000*1000;实际运行结果是3000 ,想想为什么?
算术运算符的应用技巧 思考题1:某个培训中心要为新到的学员安排房间,假设共有x个学员,每个房间可以住6人,让你用一个公式来计算他们要住的房间数? 答案:(x+5)/6。这种算法还可用在查看留言板的分页显示上: 其中x是总共的留言数,6是每页显示的留言数,结果就是总共有多少页。 思考题2:假设你要让x的值在0至9之间循环变化,请写出相应的程序代码。 答案: int x=0; while(true) { x = (x+1)%10; }
赋值运算符 注1:在JAVA里可以把赋值语句连在一起,如: x = y = z = 5 ; 在这个语句中,所有三个变量都得到同样的值5。 注2 :x += 3等效于x = x + 3,等于*= ,-=,/=依此类推。
比较运算符 注1:比较运算符的结果都是boolean型,也就是要么是true,要么是false。 注2:比较运算符“==”不能误写成“=” ,切记!切记!
逻辑运算符 注1:逻辑运算符用于对boolean型结果的表达式进行运算,运算的结果都是boolean型 。 注2:“&”和“&&”的区别在于,如果使用前者连接,那么无论任何情况,“&”两边的表达式都会参与计算。如果使用后者连接,当“&&”的左边为false,则将不会计算其右边的表达式。“|”和“||”的区别与“&”和“&&”的区别一样。
“&”和“&&”的区别分析 public class TestAnd { public static void main(String[] args) int x=0; int y=3; if(x!=0 && y==y/x) System.out.println("y = "+y); } 上面例子中,由于while语句的判断条件中的第一个布尔表达式是不成立的,程序就不会判断第二个布尔表达式的值,这就是“短路”。如果两个表达式之间用“&”来连接,如果正好碰到上面所示的特殊情况,程序运行时就会出错
位运算符 任何信息在计算机中都是以二进制的形式保存的,&,|,^除了可以作为逻辑运算符,也可以做为位算符,它们对两个操作数中的每一个二进制位都进行运算。 只有参加运算的两位都为1,&运算的结果才为1,否则就为0。 只有参加运算的两位都为0,|运算的结果才为0,否则就为1。 只有参加运算的两位不同,^运算的结果才为1,否则就为0。 我们可以对数据按二进制位进行移位操作,java的移位运算符有三种: << 左移 >> 右移 >>> 无符号右移
“>>”和“>>>” 区别的实例分析 public class ShiftTest { public static void main(String [] args) int x=0x80000000; int y=0x80000000; x=x>>1; y=y>>>1; System.out.println(“0x80000000>>1 = ” + Integer.toHexString(x)); System.out.println(“0x80000000>>>1 = ” + Integer.toHexString(y)); } 运行结果如下: 0x80000000>>1 = c0000000 0x80000000>>>1 = 40000000 十六进制与二进的对比 0x8000000016 =1000,0000, 0000, 0000, 0000, 0000, 0000, 00002 0xc000000016=1100,0000, 0000, 0000, 0000, 0000, 0000, 00002 0x4000000016 =0100,0000, 0000, 0000, 0000, 0000, 0000, 00002
移位运算的注意事项及小技巧 移位运算符适用类型有byte、short、char、int、long 对低于int型的操作数将先自动转换为int型再移位。 对于int型整数移位a>>b,系统先将b对32取模,得到的结果才是真正移位的位数。例如:a>>33和a>>1结果是一样的,a>>32的结果还是a原来的数字。 对于long型整数移位时a>>b ,则是先将移位位数b对64取模。 移位不会改变变量本身的值。如a>>1;在一行语句中单独存在,毫无意义 。 x>>1的结果和x/2的结果是一样的,x<<2和x*4的结果也是一样的。总之,一个数左移n位,就是等于这个数乘以2的n次方,一个数右移n位,就是等于这个数除以2的n次方。请思考:如何用程序实现求2的x次方。答案:y = 1<< x;
运算符的优先级 我们可以使用括号改变运算赋的优先级,分析int a =2;int b = a + 3*a;语句的执行过程 与int a =2;int b =( a + 3)*a;语句的执行过程的区别 。
如何避免多个运算符带来的问题 对于int a =2; int b= a + 3 * a++;这样的语句,b最终等于多少呢? 作者试验得到的结果是8。 对于int a =2; int b= (a ++)+ 3 * a;这样的语句,b最终等于多少呢? 作者试验得到的结果是11。
如何避免多个运算符带来的问题 与其去思考其中的原因,我们还不如将上面的第二句改为几条语句来实现我们想要的结果。 不要在一行中编写太复杂的表达式,也就是不要在一行中进行太多的运算 在一行中进行太多的运算并不能为你带来什么好处,相反只能带来坏处,它并不比改成几条语句的运行速度快,它除可读行差外,还极容易出错。 对于优先级顺序,读者不用刻意去记,有个印象就行如果你实在弄不清这些运算先后关系的话,就用括号或是分成多条语句来完成你想要的功能,因为括号的优先级是最高的, 这也是软件编码规范的一个要求。
程序的流程控制 顺序结构 选择结构 循环结构 顾名思义,顺序结构就是程序从上到下一行一行执行的结构,中间没有判断和跳转,直到程序结束。
if语句的选择结构 if (表达式) 语句; if (表达式) 语句1; else 语句2; if (表达式1) 语句1; … else 语句n; 每个语句可以是使用{ }组成的复合语句 变量 = 布尔表达式?语句1:语句2; If语句还可以嵌套使用 if (表达式1) if (表达式2) 语句1; else语句2; esle if (表达式2) 语句3; else语句4; 嵌套时最好使用{}确定层次界限,举例说明
switch语句的选择结构 Switch (表达式) { case 常量表达式1:语句1; case 常量表达式2:语句2; … case 常量表达式n:语句n; default: 语句n; } default语句是可选的,它接受除上面接受值的其他值,通俗的讲,就是谁也不要的都归它。 case后面可以跟多个语句,这些语句可以不用大括号括起来 。 switch语句判断条件可接受int, byte, char, short型,不可以接受其他类型 一旦碰到第一次case匹配,就会开始顺序执行以后所有的程序代码,而不管后面的case条件是否匹配,后面case条件下的代码都会被执行,直到碰到break语句为止。我们可以利用这个特点来用同一段语句处理多个case条件
while循环语句 While (表达式) 语句; int x=1; while(x<3) { System.out.println("x="+x); x++; } 脚下留心:while表达式的括号后面一定不要加“;”
do-while循环语句 do 语句 while (表达式); public class TestDo { public static void main(String[] args) int x=3; while(x==0) System.out.println("ok1"); x++; } int y=3; do System.out.println("ok2"); y++; while(y==0);
do-while循环语句 编写一个程序,这个程序不断地读取从键盘上输入的字符,直到读到字符’q’时,程序结束。 提示:调用System.in.read();可以读取到一个从键盘上输入字符对应的整数。通过这个程序,你一定能体会到在什么样的情况下,用do-while循环语句比while循环语句方便。
for循环语句 for(表达式1;表达式2 ;表达式3) 语句 for(int x=1;x<10;x++) { System.out.println("x="+x); } 等效于 int x=1; for(;x<10;x++) for(;x<10;) x++; for(;;) if(x >= 10) break; }
break语句 break语句可以中止循环中的子语句和switch语句。一个无标号的break语句会把控制传给当前(最内)循环(while,do.for或Switch)的下一条语句。如果有标号,控制会被传递给当前方法中的带有这一标号的语句。如: st:while(true) { while(true) break st; }
continue语句 continue语句只能出现在循环语句(while,do,for)的子语句块中,无标号的continue语句的作用是跳过当前循环的剩余语句块,接着执行下一次循环。 用continue语句的打印出 0到10之间的所有奇数的程序例子。 for(int i=0;i<10;i++) { if(i%2==0) continue; System.out.println(i); }
数组 为什么有数组? 堆内存和栈内存 int [] x; x = new int[100]; x=null; 的内存状态变化情况
数组 静态数组 使用数组时要注意的问题 int ia[] ={1,2,3,4}; int [] ia=new int[]{3,4,5}; int a[5];//声明数组时,不能指定其长度,编译时将出错 使用数组时要注意的问题 空指针异常 如何得到数组长度 数组越界异常
多维数组 如何理解多维数组,类似我们的棋盘。 java 中并没有真正的多维数组,只有数组的数组, Java中多维数组不一定是规则矩阵形式。 定义一个多维数组 int[][] xx; xx=new int[3][]; xx[0]=new int[3]; xx[1]=new int[2];
多维数组 多维数组中元素的引用方式,如:x[1][2]。 规则矩阵数组可以在一条语句中产生,如:int xx[][]=new int[2][3]; 多维数组的静态初始化 ,如: int[][] xx={{3,2,7},{1,5},{6}};
与数组操作相关的函数 使用System.arraycopy()函数拷贝数组 用Arrays.sort 来排序数组