• 1. Java
  • 2. Java语言基础 面向对象 类的应用 图形组件 线程及线程应用 输入与输出 Java小应用程序 Java小游戏的实现 网络编程 数据结构
  • 3. 1 语言基础本章是讲述Java语言的基础语法,要求学生一定掌握。 课程内容: 1.1 Java语言入门 1.2 标识符、关键字和数据类型 1.3 运算符,表达式和语句 1.4 数组 1.5 方法的封装
  • 4. 2 面向对象本章是介绍Java面向对象的概念,讲解面向对象的封装性,多态性和继承性,以及抽象类、嵌套类。 课程内容: 2.1 面向对象的基本概念 2.2 类与封装 2.3 static关键字 2.4 内部类 2.5 类的继承 2.6 final关键字 2.7 抽象类与接口 2.8 类的多态 2.9 异常 2.10 包
  • 5. 3 类的应用本章是讲解各种常用类的使用 课程内容: 3.1 String类 3.2 StringBuffer类 3.3 Calendar类 3.4 基本类型对象包装类
  • 6. 4 图形组件本章是了解java的图形组件及事件响应 课程内容: 4.1 图形用户界面概述 4.2 事件处理 4.3 图形图像操作 4.4 常用组件
  • 7. 5 线程及线程应用本章是了解线程的概念,掌握线程的控制,可以灵活运用线程 课程内容: 5.1 线程的概念 5.2 线程的使用 5.3 线程同步
  • 8. 6 输入与输出本章是了解程序与文件系统的交互方式,可以直接对文件进行读写控制 课程内容: 6.1 File类 6.2 字节流 6.3 字符流 6.4 编码 6.5 随机文件
  • 9. 7 Java小应用程序本章是介绍java小应用程序的使用,以及动画的实现 课程内容: 7.1 小应用程序的简介 7.2 小应用程序的执行过程 7.3 在小应用程序中的图形和图像控制 7.4 声音控制
  • 10. 8 Java小游戏的实现本章是掌握对java小游戏的框架的了解,掌握游戏的编写 课程内容: 8.1 编写游戏
  • 11. 9 网络编程本章是介绍通过类连接到www,然后讨论如何通过TCP/IP或UDP协议在网络上的两个程序间建立连接并交换数据 课程内容: 9.1 网络概述 9.2 InetAddress 类 9.3 UDP网络程序 9.4 TCP网络程序
  • 12. 10 数据结构本章是了解Java的数据结构,能够灵活应用在游戏编程中 课程内容 10.1 链表 10.2 堆栈 10.3 队列 10.4 递归 10.5 排序
  • 13. 1 语言基础
  • 14. 1 语言基础本章是讲述java语言的基础语法,要求学生一定掌握。 课程内容: 1.1 Java语言入门 1.2 标识符、关键字和数据类型 1.3 运算符,表达式和语句 1.4 数组 1.5 方法的封装
  • 15. 1.1 Java语言入门1.1.1 Java特点 1.1.2 Java语言编程过程 1.1.3 Java的开发环境 1.1.4 Java程序开发基本过程 1.1.5 Java虚拟机的运行过程
  • 16. 1.1.1 Java特点简单 面向对象 与平台无关 健壮性(Java的强类型机制、异常处理、内存的自动收集等)
  • 17. 1.1.2 Java语言编程过程Java源程序(*.java)Java字码文件(*.class)Java编译程序Java虚拟机(JVM)执行Window下的 字节码解释程序Linux下的 字节码解释程序Window操作系统Linux操作系统
  • 18. 1.1.3 Java的开发环境 Java开发环境的搭建 (1)什么是JDK (2)设置环境变量
  • 19. 1.1.3 Java的开发环境什么是JDK sun公司将java的开发工具和运行环境所涉及到的应用程序和相关文件放在一起,称之为JDK(java development kit) JDK版本 (1)J2EE(Java 2 Platform Enterprise Edition) (2)J2SE(Java 2 Platform Standard Edition) (3)J2ME(Java 2 Platform Micro Edition) 下载地址:Http://java.sun.com
  • 20. 1.1.3 Java的开发环境JDK的安装目录 JDK的目录结构 (1)bin目录 javac java (2)demo目录
  • 21. 1.1.3 Java的开发环境何为环境变量: 在操作系统中定义,可以被操作系统上运行的的应用程序访问的变量 查看环境变量: 在命令行窗口中直接键入set查看所有的环境变量: 键入set + 变量名查看该变量的值 我的电脑――属性――高级――环境变量: 关于用户变量和系统变量中都进行设置的变量
  • 22. 1.1.3 Java的开发环境设置环境变量 在命令行窗口中键入set 变量名=变量值 设置环境变量(不能键入空格),键入set 变量名=,取消环境变量(注:在命令行窗口中设置的环境变量只对该命令行窗口起作用) 在我的电脑――属性――高级――环境变量(注:在这里设置的环境变量对以后启动的所有应用程序和命令行窗口都起作用,但不会影响已启动的应用程序和命令行窗口,在用户窗口中设置的环境变量需要注销重新登陆后才起作用)
  • 23. 1.1.3 Java的开发环境环境变量path 当我们执行某个命令时,操作系统首先会在当前目录下查找该命令,如果没有找到这个命令程序,操作系统则会沿着path中所指定的目录依次查找,以最先找到的为准 查看当前使用的JDK版本 :java –version
  • 24. 1.1.4 Java程序开发基本过程Java编程基础 编译Java程序 运行Java程序 Java注释 使用Java文档
  • 25. 1.1.4 Java程序开发基本过程Java编程基础 Java的基本语法格式: 所有的java程序都应该写在类中 <修饰符> class <类名> { [<属性声明>] [<构造器声明>] [<方法声明>] } 类的修饰符:public和默认修饰符
  • 26. 1.1.4 Java程序开发基本过程编译Java程序 Javac 运行Java程序 Java
  • 27. 1.1.4 Java程序开发基本过程Java注释 单行注释 // 多行注释 /* */ 文档注释 /** */
  • 28. 1.1.4 Java程序开发基本过程使用Java文档 生成Java文档
  • 29. 1.1.4 Java程序开发基本过程使用Java文档 HTML网页: 优点:更新速度快 缺点:不支持模糊查询 chm格式的文档 优点:支持模糊查询 缺点:更新速度稍慢 生成Java文档
  • 30. 1.1.5 Java虚拟机的运行过程:加载代码: 类装载器(classloader) 校验代码: 字节码验证器(Byte Code Verifier) 执行代码: 解释器(Interpreter)
  • 31. 1.2 标识符、关键字和数据类型1.2.1 标识符 1.2.2 关键字 1.2.3 数据类型 1.2.4 常量 1.2.5 变量 1.2.6 类型转换
  • 32. 1.2.1 标识符标识符命名规则 定义:Java对各种变量,方法和类等要素命名时使用的字符序列称为标识符 规则: 标识符应以字母,下划线,美元符号开头 标识符应以字母,下划线,美元符号或数字组成 标识符对大小写敏感,长度无限止 合法的标识符: Indentifier、username、user_name、_userName、$username 非法的标识符: class、98.3、Hello World
  • 33. 1.2.2 关键字abstractdoimplementprivatethisbooleandoubleimportprotectedthrowbreakelseinstanceof publicthrowsbyteextendintreturntransientcasefalseinterfaceshorttruecatchfinallongstatictrycharfianllynativestrictfpvoidclassfloatnewsupervolatilecontinuefornullswitchwhiledefaultif packagesynchronized注:java 无sizeof ,goto, const 关键字,但不能用goto const作为变量名
  • 34. 1.2.3 数据类型数据类型基本数据类型引用数据类型类接口数组数值型字符型(char)布尔型(boolean)整数型(byte short Int long)浮点型(float, double)
  • 35. 1.2.4 常量常量:就是持续不变的值 常量类型: 整型常量: 十进制(12) ,十六进制 (0x12),八进制(012) 长整型常量: 13L 浮点数常量: (1) 单精度浮点数 5.1f,.4f ,2e3f ,0f (2) 双精度浮点数 5.1,.4,2e-3,0d 布尔常量: true和false
  • 36. 1.2.4 常量字符常量 : ‘a’ , ‘8’, '\u0027' ‘\r‘表示接受键盘输入,相当于按下了回车键; ‘\n‘是换行; ‘\t‘是制表符,相当于table键; ‘\b‘是退格键,相当于Back Space; ‘\‘‘是单引号,而‘\“‘是双引号; ‘\\‘是一个斜杠“\”。 字符串常量 : “Hello World“,”123”, "Welcome \nXXX“ null常量 : null常量只有一个值,用null表示,表示对象的引用为空
  • 37. 1.2.5 变量变量概念 变量就是系统为程序分配的一块内存单元,用来存储各种类型的数据。先声明,再使用 变量的元素 变量名,变量值,变量的作用范围 变量定义 int x=0,y; y=x+3; x和y就是变量
  • 38. 1.2.5 变量变量字节大小及有效取值范围 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。
  • 39. 1.2.5 变量变量作用域 变量要先定义,后使用,但不是在变量定义后的语句中一直都能使用前面定义的变量。比如:可以用大括号将多个语句包起来形成一个复合语句,则复合语句中定义的变量只能在定义它的复合语句中使用。 局部变量 在方法或方法中的代码块中定义的变量称为局部变量 成员变量 在方法外,在类内部定义的变量
  • 40. 1.2.5 变量局部变量的定义 在方法或方法中的代码块中定义的变量称为局部变量,局部变量在方法或代码块被执行时创建,在方法或代码块结束时被销毁。 局部变量的初始化 局部变量在进行取值操作前必须被初始化,否则会出现编译错误
  • 41. 1.2.6 类型转换自动类型转换(也叫隐式类型转换) byte b = 3; int x = b; //b被自动转换为int型 强制类型转换(也叫显式类型转换) byte a; int b; a = (byte)b; //b被强制转换为byte型
  • 42. 1.3 运算符,表达式和语句1.3.1 运算符 1.3.2 表达式 1.3.3 控制语句
  • 43. 1.3.1 运算符何为运算符 运算符是一种特殊符号,用以表示数据的运算、赋值和比较,一般由一至三个字符组成 。 运算符类型 算术运算符 赋值运算符 比较运算符 逻辑运算符 位运算符 移位运算符
  • 44. 1.3.1 运算符
  • 45. 1.3.1 运算符算术运算符的注意问题 “+”除字符串相加功能外,还能把非字符串转换成字符串 ,如: “x”+123;的结果是“x123” 。 如果对负数取模,可以把模数负号忽略不记,如:5%-2=1。但被模数是负数就另当别论了。 对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。 int x=3510;x=x/1000*1000;实际运行结果是3000 ,想想为什么?
  • 46. 1.3.1 运算符赋值运算符
  • 47. 1.3.1 运算符赋值运算符注意: 注1:在JAVA里可以把赋值语句连在一起,如: x = y = z = 5 ; 在这个语句中,所有三个变量都得到同样的值5。 注2 :x += 3等效于x = x + 3,等于*= ,-=,/=依此类推。
  • 48. 1.3.1 运算符比较运算符
  • 49. 1.3.1 运算符比较运算符注意: 注1:比较运算符的结果都是boolean型,也就是要么是true,要么是false。 注2:比较运算符“==”不能误写成“=”
  • 50. 1.3.1 运算符逻辑运算符
  • 51. 1.3.1 运算符逻辑运算符注意点 注1:逻辑运算符用于对boolean型结果的表达式进行运算,运算的结果都是boolean型 。 注2:“&”和“&&”的区别在于,如果使用前者连接,那么无论任何情况,“&”两边的表达式都会参与计算。如果使用后者连接,当“&&”的左边为false,则将不会计算其右边的表达式。“|”和“||”的区别与“&”和“&&”的区别一样。
  • 52. 1.3.1 运算符位运算符 任何信息在计算机中都是以二进制的形式保存的,&,|,^除了可以作为逻辑运算符,也可以做为位算符,它们对两个操作数中的每一个二进制位都进行运算。 只有参加运算的两位都为1,&运算的结果才为1,否则就为0。 只有参加运算的两位都为0,|运算的结果才为0,否则就为1。 只有参加运算的两位不同,^运算的结果才为1,否则就为0。
  • 53. 1.3.1 运算符移位运算符 << 左移 >> 右移 >>> 无符号右移
  • 54. 1.3.1 运算符移位运算的注意事项及小技巧 移位运算符适用类型有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;
  • 55. 1.3.1 运算符 高 低 运算符的优先级
  • 56. 1.3.1 运算符编程技巧 运算符的优先级顺序不用刻意去记,使用括号控制优先级不但能降低编程的难度,而且能增加程序的可读性
  • 57. 1.3.2 表达式表达式语句: 符合一定语法规则的操作数和运算符的序列 例:b; b+5; a>10&&b<10 表达式的运算顺序 先按照运算符的优先级 优先级相同的,按照约定的结合方向 表达值的值和类型
  • 58. 1.3.3控制语句条件控制语句 循环控制语句 特殊的循环流程控制
  • 59. 1.3.3控制语句条件控制语句 If else 语句的语法: If(布尔表达式){ 语句或语句块} If(布尔表达式){ 语句或语句块} else if(布尔表达式){ 语句或语句块} else{ 语句或语句块}
  • 60. 1.3.3控制语句switch语句的语法 switch(表达式1) { case 常量1: 语句 break; case 常量2: 语句 break; default: 语句 break; }
  • 61. 1.3.3控制语句switch选择语句: switch(x){//x只能为int、byte、char、short case 1:System.out.println(“Monday”); break; case 2:System.out.println(“Tuesday”); break; case 3:System.out.println(“Wednesday”);break; default:System.out.println(“I don’t know”); } 思考:无break的情况
  • 62. 1.3.3控制语句for循环语句 for(初始化表达式;布尔值测试表达式;更改表达式) { 语句或语句块; } 例:for(int i=0;i<=10;i++) { System.out.println(“i=”+i); }
  • 63. 1.3.3控制语句while循环 while(布尔值) { 语句或语句块; } 注意:while表达式的括号后不能加“;”,否则会 造成不易察觉的无限循环
  • 64. 1.3.3控制语句do while循环 do { 语句或语句块; }while(布尔测试) 注意:while表达式的括号后要加“;”
  • 65. 1.3.3控制语句思考:while循环和do while循环的不同之处 while循环先判断循环条件,再执行循环体 do while循环先执行循环体,再判断循环条件
  • 66. 1.3.3控制语句break与continue语句 break:终止循环体中的执行语句和switch语句,跳转到当前循环的下一条语句 continue:只能用于while、do while、for语句中,终止当前这次循环,执行下一次循环
  • 67. 1.3.3控制语句特殊的循环流程控制 break语句 do { 语句; If(条件为真) { break; } 语句 }while(布尔表达式);
  • 68. 1.3.3控制语句特殊的循环流程控制 continue语句 do { 语句; If(条件为真) { continue; } 语句 }while(布尔表达式);
  • 69. 1.4 数组1.4.1 声明数组 1.4.2 创建数组 1.4.3 数组初始化 1.4.4 数组中注意的问题 1.4.5 多维数组
  • 70. 1.4.1声明数组声明数组:数组类型 数组名 Int aa[] Int [] aa
  • 71. 1.4.2创建数组创建数组: 数组名=new 类型名[数组大小] aa = new int[10]; 数组元素: aa[0]、aa[1]、aa[2]……aa[9]
  • 72. 1.4.3数组初始化int ia[] ={1,2,3,4}; int [] ia=new int[]{3,4,5}; int a[5];//声明数组时,不能指定其长度,编译时将出错
  • 73. 1.4.4数组中注意的问题空指针异常(数组未初始化就使用数组中的元素) 数组越界异常 如何得到数组长度 所有的数组的索引均从0开始
  • 74. 1.4.4数组中注意的问题不能改变数组大小 可以使用相同的引用变量去引用另一个全新的数组
  • 75. 1.4.5多维数组多维数组,类似棋盘。 Java 中的多维数组,也就是数组的数组,
  • 76. 1.4.5多维数组定义多维数组 int[][] xx; xx=new int[3][]; xx[0]=new int[3]; xx[1]=new int[2];
  • 77. 1.4.5多维数组多维数组中元素的引用方式,如:x[1][2]。 规则矩阵数组可以在一条语句中产生,如:int xx[][]=new int[2][3]; 多维数组的静态初始化 ,如: int[][] xx={{3,2,7},{1,5},{6}};
  • 78. 1.5方法的封装(功能的封装)1.5.1 方法的封装格式 1.5.2 方法调用的过程分析 1.5.3 方法的调用 1.5.4 方法的参数传递
  • 79. 1.5.1方法的封装格式返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,….) { 程序代码 return 返回值; } 形式参数:在方法被调用时用于接收外部传入的数据的变量。 参数类型:就是该形式参数的数据类型。 返回值:方法在执行完毕后返还给调用它的程序的数据。 返回值类型:函数要返回的结果的数据类型。 实参:调用函数时实际传给函数形式参数的数据。 如何理解函数返回值类型为void的情况
  • 80. 1.5.2方法调用的过程分析
  • 81. 1.5.3方法的调用方法调用的几种不通情况 使用return提前返回
  • 82. 1.5.4方法的参数传递基本数据类型的参数传递 class PassValue{ public static void main(String [] args){ int x =5; change(x); System.out.println(x); } public static void change(int x){ x = 3; } }
  • 83. 1.5.4方法的参数传递方法的形式参数相当于方法中定义的局部变量 方法的形式参数在方法调用结束时被释放,不会影响到主程序中同名的局部变量
  • 84. 1.5.4方法的参数传递class PassRef{ int x; public static void main(String [] args){ PassRef obj = new PassRef(); obj.x = 5; change(obj); System.out.println(obj.x); } public static void change(PassRef obj){ obj.x = 3;}}
  • 85. 课后练习编写程序: 输入分数,判断分数的级别,大于等于85,输出结果”优秀”,大于等于75,输出结果”良好”,大于等于60,输出结果”及格”,否则不及格 输入一个数,判断是否被6整除,被6整除, 显示”被6整除”,否则显示”不能被6整除 循环输入五个数,显示最大数
  • 86. 小结1.1 Java语言入门 1.2 标识符、关键字和数据类型 1.3 运算符,表达式和语句 1.4 数组 1.5 方法的封装
  • 87. 2 面向对象
  • 88. 2 面向对象本章是介绍Java面向对象的概念,讲解面向对象的封装性,多态性和继承性,以及抽象类、嵌套类。 课程内容: 2.1 面向对象的基本概念 2.2 类与封装 2.3 static关键字 2.4 内部类 2.5 类的继承 2.6 final关键字 2.7 抽象类与接口 2.8 异常 2.9 包
  • 89. 2.1 面向对象的基本概念2.1.1 面向对象 2.1.2 对象 2.1.3 类 2.1.4 面向对象的定义 2.1.4 OOP词汇表
  • 90. 2.1.1面向对象  面向对象(Object Oriented,OO)是当前计算机界关心的重点,它是90年代软件开发方法的主流 面向对象的概念和应用已超越了程序设计和软件开发,扩展到很宽的范围。如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。
  • 91. 2.1.2对象    (1)对象。       对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。       (2)对象的状态和行为。       对象具有状态,一个对象用数据值来描述它的状态。       对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为。       对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中      
  • 92. 2.1.3类      类:具有相同或相似性质的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象。       类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。       类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。
  • 93. 2.1.3类    类的结构。       在客观世界中有若干类,这些类之间有一定的结构关系。通常有两种主要的结构关系,即一般--具体结构关系,整体--部分结构关系。       ①一般——具体结构称为分类结构,也可以说是“或”关系,或者是“is a”关系。       ②整体——部分结构称为组装结构,它们之间的关系是一种“与”关系,或者是“has a”关系。      
  • 94. 2.1.3类 消息和方法       对象之间进行通信的结构叫做消息。在对象的操作中,当一个消息发送给某个对象时,消息包含接收对象去执行某种操作的信息。发送一条消息至少要包括说明接受消息的对象名、发送给该对象的消息名(即对象名、方法名)。一般还要对参数加以说明,参数可以是认识该消息的对象所知道的变量名,或者是所有对象都知道的全局变量名。       类中操作的实现过程叫做方法,一个方法有方法名、参数、方法体。
  • 95. 2.1.4面向对象的定义 简单的说,面向对象设计是一种把重点放在数据(对象)和对象接口上的编程技术 从根本上说,只要对象能够满足你的需求,就不必关心它的功能到底如何实现。在面向对象程序设计(OOP)中,唯一关心的就是对象的外在表现
  • 96. 2.1.5OOP词汇表类:class 实例:instance 封装:encapsulation 实例字段:instance field 方法:method 状态:state 扩展:extend 根超类:cosmic superclass 继承:inheritance(通过扩展一个类来获得新类)
  • 97. 课后练习面向对象的定义? 面向对象和面向过程的区别,请举例说明? 面向对象的两个注意点?
  • 98. 2.2类与封装2.2.1 类与对象 2.2.2 对象的创建、使用,比较 2.2.3 匿名对象 2.2.4 类设计 2.2.5 实现类的封装性 2.2.6 构造方法 2.2.7 This引用 2.2.8 方法的重载
  • 99. 2.2.1类与对象类: 类就是对某一事务的描述,是抽象的、概念上的定义,如:汽车设计图 对象: 对象是实际存在的该类事务的个体,也称为实例(instance),如:按汽车设计图设计出来的每一辆汽车
  • 100. 2.2.1类与对象类可以将数据和方法封装在一起,数据表示类的属性,方法表示类的行为 Class 类名{ 成员属性(成员变量) 成员方法 } }
  • 101. 2.2.1类与对象关于成员变量和局部变量同名的问题 class Person{ int age; void shout(){ int age = 60; System.out.println(“my age is ” + age); } }
  • 102. 2.2.2对象的创建、使用,比较对象的创建: 类名 对象名=new 类名(); 例: Person p = new Person(); 变量p是person对象的一个应用,在栈内存中 通过new关键字创建的person对象在堆内存中
  • 103. 2.2.2对象的创、使用,比较对象的使用: 对象.属性 对象.方法() 例: class TestPerson{ public static void main(String [] args){ Person p1 = new Person(); Person p2 = new Person(); p1.age = 18; p1.shout(); p2.shout(); } }
  • 104. 2.2.2对象的创建与使用对象只能在其有效的生命周期内被使用: 当离开对象所在的代码块后,对象就会变成垃圾 设置对象的引用为null,对象也会变成垃圾
  • 105. 2.2.2对象的创建、使用,比较对象的比较 有两种方式比较对象,即==和equals()方法 ==用于比较引用是否指向同一个对象 equals()用于比较两个对象的内容是否一致
  • 106. 2.2.3匿名对象未指定应用的对象即匿名对象 Person p = new Person(); p.shout(); new Person().shout(); 用匿名对象改写刚才的程序
  • 107. 2.2.3匿名对象使用匿名对象的两种情况 如果一个对象只需要进行一次方法调用,那么 可以使用匿名对象 将匿名对象作为一个参数传递给一个方法,如: public void getPerson(Person p); getPerson(new Person());
  • 108. 2.2.4类设计识别类的一个简单经验就是寻找问题分析中的名词 比如:在订单处理系统中有这样一些名词: 订单(order)、送货地址(address)、货款(payment)、帐户(account)……根据这些名词,我们就可以创建order、address、 payment、 account等类
  • 109. 2.2.4类设计确定类中的方法(函数) 通过寻找和名词相关的动词来确定方法 比如:物品被添加进订单,订单被运送或取消 货款被支付……
  • 110. 课后练习设计一教学管理系统,要求实现学生信息的管理和课程的管理,请列出所需的类,类的属性及方法
  • 111. 2.2.5实现类的封装性封装的定义 封装的目的
  • 112. 2.2.5实现类的封装性封装的定义 将类的成员变量声明为private,再提供一个或多个public方法实现对该成员变量的修改或访问,这种方式称为封装
  • 113. 2.2.5实现类的封装性封装的目的 隐藏类的实现细节 通过定制好的方法访问数据,可以方便地加入 控制逻辑,限制对属性的不合理操作(如对数 据进行检查) 便于修改,增强代码的可维护性
  • 114. 2.2.6构造方法构造方法(构造函数、构造器)的定义 构造方法特征 构造方法为什么类同名 构造方法的细节
  • 115. 2.2.6构造方法构造方法的定义: 是类的一种特殊方法,java中每个类都有构造方法,它的功能是类的实例初始化状态
  • 116. 2.2.6构造方法构造方法的特征 它具有和类相同的名称 它不包含返回值 它不能在方法中用return语句返回一个值
  • 117. 2.2.6构造方法构造方法为什么和类同名? 因为构造方法有java编译器负责调用,编 译器必须知道哪个是构造方法,采用与类同名的方式是最简单合理的
  • 118. Person p3 = new Person(“Tom”,18); 都干了什么1. 定义一个Person类型的引用变量p3和一个Person类的实例对象 2. 调用构造方法,在构造方法内的代码执行前,先对成员变量进行显式初始化,即执行 private String name = "unknown"; private int age = -1; 3. 执行构造方法中的代码 4. 把新创建的Person对象赋给p3引用变量
  • 119. 2.2.6构造方法构造方法的几个细节 每个java类中至少有一个构造方法 关于默认构造方法 private修饰的构造方法
  • 120. 2.2.7This引用this在类内部表示被构造的类对象本身 使用this引用的几种情况
  • 121. 2.2.8方法的重载(overload)何为方法重载 构造器重载 成员方法重载
  • 122. 2.2.8方法的重载(overload)方法的重载 就是在同一个类中允许同时存在一个以上的同名函数,只要它们的参数个数或类型不同即可。 1)方法名相同 2)参数必须不同 3)返回类型可以相同,可以不相同
  • 123. 2.2.8方法的重载(overload)构造方法的重载 成员方法的重载
  • 124. 课后练习定义一个Person类,在类中定义三个构造器,默认构造器、带name参数的构造器和带name、age参数的构造器(需使用this来调用构造器) 编程输出 **** *** ** *
  • 125. 2.3 static关键字2.3.1 静态属性 2.3.2 静态方法 2.3.3 static方法的注意点 2.3.4 静态代码块 2.3.5 单态设计模式 2.3.6 理解main方法的语法
  • 126. 2.3.1静态属性静态成员变量 static String country=“China”; 静态成员变量也称作类成员 静态成员变量的两种访问方式 类名.成员 对象名.成员
  • 127. 2.3.1静态属性不能把方法体内的变量声明为static fun() { static int I = 0; } 上诉声明是错误的
  • 128. 2.3.1静态属性static变量在类被载入时就存在,被所有的对象实例共享 统计产生了多少类的实例对象: class A{ private static int count = 0; public A(){ count = count +1; } }
  • 129. 2.3.2静态方法静态成员方法也称作类方法 使用类名就可以直接调用static方法,不必创建类的实例对象
  • 130. 2.3.3static方法的注意点static方法中只能调用同类中的其他static成员(变量或方法),不能访问类中的非静态成员 static成员不能以任何方式引用this和super关键字 main方法是static的
  • 131. 2.3.4静态代码块类中可以使用不包含在任何方法体中的静态代码块,当类被载入时,静态代码块自动被执行,且只执行一次,静态代码块常用来进行类属性的初始化
  • 132. 2.3.4静态代码块class StaticCode{ static String coutry; { coutry = "China"; System.out.println("staiccode is loading"); } }
  • 133. 2.3.5单态设计模式单态设计模式:采取一定的方式保证在整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法
  • 134. 2.3.5单态设计模式public class TestSingle{ private static final TestSingle onlyOne = new TestSingle(); public static TestSingle getTestSingle(){ return onlyOne; } private TestSingle(); }
  • 135. 2.3.6理解main方法的语法由于Java虚拟机需要调用类的main方法,所以是public的 Java虚拟机在执行main方法是不必创建对象,所以该方法是static的 Main方法有一个String类型的数组参数,用来保存执行Java命令时传递给所运行的类的参数
  • 136. 2.3.6理解main方法的语法public class TestMain{ public static void main(String [] args){ for(int i=0;i
  • 137. 课后练习写一个程序,统计产生了多少类的实例对象
  • 138. 2.4内部类2.4.1 内部类的定义 2.4.2 内部类 2.4.3 内部类的注意点 2.4.4 关于static内部类 2.4.5 内部类中的变量名 2.4.6 内部类如何被外部类引用 2.4.7 方法中的内部类
  • 139. 2.4.1 内部类的定义在一个类内部定义的类就是嵌套类,也叫内部类或内置类 内部类可以访问嵌套他的类的成员,包括private的成员,但内部类的成员却不能被嵌套它的类直接访问
  • 140. 2.4.1 内部类的定义内部类的定义和普通类没什么区别 内部类可以被声明为private或protected的
  • 141. 2.4.2 内部类class Outer{ int outer_i =100; void test(){ Inner in = new Inner(); in.display(); } class Inner{ //int outer_i =90; void display(){ System.out.println("display: outer_i "+outer_i); }}}
  • 142. 2.4.2 内部类class InnerClassDemo{ public static void main(String [] args){ Outer outer = new Outer(); outer.test(); } }
  • 143. 2.4.2 内部类class Outer{ int outer_i =100; void test(){ Inner in = new Inner(); in.display();} class Inner{ int y=10; void display(){ System.out.println("display: outer_i "+outer_i); }}
  • 144. 2.4.2 内部类void showy(){ System.out.println(y); } }
  • 145. 2.4.3内部类的注意点内部类可以访问它的外部类的成员,但内部类的成员只有在内部类的范围之内可知,不能被外部类使用
  • 146. 2.4.4 关于static内部类如果用static修饰一个内部类,这个类就相当于一个外部定义的类 static内部类中可声明static成员,非static内部类中不能声明static成员 static内部类不能使用外部类的非static成员变量
  • 147. 2.4.4 关于static内部类class Outer{ int outer_i =100; void test(){ Inner in = new Inner(); in.display(); } static class Inner{ void display(){ System.out.println("display: outer_i "+outer_i); }}}
  • 148. 2.4.5 内部类中的变量名方法的局部变量、内部类的成员变量和外部类的成员变量同名的情况 public class Outer{ private int size; public class Inner{ private int size;
  • 149. 2.4.5 内部类中的变量名void display(int size){ size++;//display的形式参数 this.size++;//Inner类的成员变量 Outer.this.size++;//Outer类的成员变量}}}
  • 150. 2.4.6 内部类如何被外部类引用class Outer{ private int size = 10; public class Inner{ public void display(){ System.out.println(++size); } } }
  • 151. 2.4.6 内部类如何被外部类引用public class TestInner{ public static void main(String [] args){ Outer outer = new Outer(); Outer.Inner inner = outer.new Inner(); inner.display(); } }
  • 152. 2.4.7方法中的内部类内部类并非只能在类里定义,也可以在几个程序块的范围之内定义内部类。如:在方法中,或在for循环体内
  • 153. 2.4.7方法中的内部类class Outer{ private int outer_i = 100; void test(){ for(int i=0;i<5;i++){ class Inner{ void display(){ System.out.println("display: outer_i "+outer_i); } } Inner inner = new Inner(); inner.display(); }}}
  • 154. 2.4.7方法中的内部类class InnerClassDemo{ public static void main(String [] args){ Outer outer = new Outer(); outer.test(); } }
  • 155. 2.5类的继承2.5.1 类继承的实现 2.5.2 类继承的内容 2.5.3 方法的覆盖 2.5.4 super关键字 2.5.5 Object类
  • 156. 2.5.1类继承的实现通过继承可以简化类的定义 Java只支持单继承,一个子类只能有一个父类 class Subclass extends Superclass { }
  • 157. 2.5.2类继承的内容 子类继承父类非私有的成员变量和成员方法,但不继承父类的构造方法,在子类的 构造方法中可以用super(参数列表)调用父 类的构造方法
  • 158. 2.5.2类继承的内容 如果子类的构造方法中没有显式地调用父类的构造方法,也没有使用this关键字调用重载的其他构造方法,则在产生子类的实例对象时,系统默认调用父类无参数的构造方法 class Student extends Person{ public Student(){ super();//默认调用 } }
  • 159. 2.5.3方法的覆盖在子类中可以根据需要对从父类中继承的方法进行改造--重写 重写方法必须和被重写的方法具有相同的方法名称、参数类表和返回类型 重写方法时不能使用比父类方法更严格的访问权限,如:父类的方法是public的,子类的就不能是private的
  • 160. 2.5.4Super关键字super调用父类的构造器 super调用父类的成员
  • 161. 2.5.5Object类Object类是所有类的父类,所有的Java类都默认继承Object类
  • 162. 2.6 final关键字2.6.1 final关键字修饰类、属性和方法 2.6.2 final注意点
  • 163. 2.6.2 final注意点final标记的类不能被继承 final标记的方法不能被子类重写 final标记的变量(成员变量或局部变量)即成为常量,只能赋值一次 final标记的成员变量必须在声明的同时或在类的构造方法中显示赋值
  • 164. 2.6.2 final注意点final标记的局部变量相当于常量,它的声明周期超出方法的声明周期,可以被内部类访问 用public static final标记的常量为全局常量
  • 165. 练习编程练习内部类的使用 编程练习类继承的使用 输入5个数到数组中,并对其重小到大排序,打印输出
  • 166. 2.7抽象类与接口2.7.1 抽象类定义 2.7.2 抽象方法的定义规则 2.7.3 接口 2.7.4 instanceof操作符
  • 167. 2.7.1抽象类定义abstract class 类名 { abstract 方法名(参数列表); abstract 方法名(参数列表); }
  • 168. 2.7.1抽象类定义Java中可以定义不含方法体的方法,方法体的实现由子类去做,这样的方法就是抽象方法,包含抽象方法的类就是抽象类 抽象类中可以由一个或多个抽象方法 抽象方法必须用abstract来修饰,带有抽象方法的类必须都声明为抽象类
  • 169. 2.7.2抽象方法的定义规则抽象类和抽象方法都必须用abstract修饰 抽象类不能实例化,即不能用new产生对象 抽象方法只需声明不需实现 带有抽象方法的类必须都声明为抽象类,抽象类的子类必须实现所有的抽象方法后才能被实例化,否则子类还是抽象类
  • 170. 2.7.3接口如果一个抽象类中的所有方法都是抽象的,那么可以将其定义为接口 接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,没有变量和方法的实现
  • 171. 2.7.3接口接口继承接口用extends关键字 interface Animal extends Runner{ void breathe(); }
  • 172. 2.7.3接口一个类可以在继承一个父类的同时,实现一个或多个接口,extends必须在implements前 class Student extends Person implements Runner{ ... }
  • 173. 2.7.3接口访问接口的成员变量 类名.变量名 对象名.变量名
  • 174. 2.7.3接口接口小结 实现一个接口就是要实现该接口的所有方法(抽 象类除外) 接口中的方法都是抽象的 一个类可以实现多个接口,但只能继承一个类
  • 175. 2.7.4 instanceof操作符instanceof判断一个类是否实现了某个接口,也可以判断一个实例对象是否属于一个类 语法: 对象 instanceof 类(接口)
  • 176. 2.8异常2.8.1 何为异常 2.8.2 try,catch 2.8.3 throws、throw关键字 2.8.4 常见异常类 2.8.5 finally关键字 2.8.6 异常的细节
  • 177. 2.8.1何为异常异常定义了程序中遇到的非致命错误,而不是编译时的语法错误,如:打开一个不存在的文件、数组越界等
  • 178. 2.8.2try,catchtry中的代码抛出异常后,程序跳入catch代码块中执行 try中发生异常的语句不会执行 执行完catch中的代码后程序继续往下执行
  • 179. 2.8.3throws、throw关键字强制调用语句使用try,catch包裹: 在定义会抛出异常的代码时,加上throws关键字 throw关键字
  • 180. 2.8.4常见异常类ArithmeticException:在算术运算中发生的异常,如除以零 NullPointerException:变量还没有指向一个对象,就引用这个对象的成员 ArrayIndexOutOfBoundsException:数组越界
  • 181. 2.8.5finally关键字Try…catch语句后还可以有一个finally语句,finally语句中的代码块不管是否被捕获都要被执行
  • 182. 2.8.5finally关键字捕获子类异常在前,捕获父类异常在后 finally代码块始终会被执行(只有一种例外,在try代码块中使用了System.exit(0))
  • 183. 2.8.6异常的细节一个方法被重写时,子类方法只能抛出该方法抛出的异常或是该异常的子类 如果父类方法抛出多个异常,子类方法只能抛出那些异常的子集,不能抛出新的异常
  • 184. 2.9包2.9.1 包机制 2.9.2 父包和子包 2.9.3 访问控制
  • 185. 2.9.1包机制Java引入包(package)机制,提供了类的多层命名空间,便于项目的管理
  • 186. 2.9.1包机制包名必须在程序中通过package语句生成,不是把类放到某个文件夹下,这个文件夹就成了该类的包 package语句必须为Java源文件的第一条语句,每个源文件只能有一个package语句 若无package语句,则为默认无包名
  • 187. 2.9.1包机制如:Java.sql.Date,Java.util.Date 若要在一个类中同时使用上述两个类,只能通过全限定名引用
  • 188. 2.9.2父包和子包父包和子包在使用上没有任何关系,父包要调用子包中的类必须引用子包的全名,不能省略掉父包部分的包名 当我们import一个包时,并不会import该包中 的子包
  • 189. 2.9.3访问控制类成员的访问控制: (1)private:只能在类的内部使用 (2)默认访问:即成员方法或变量前没有访问控制符,可以被包中的其他类访问 (3)protected:可以被包中的其他类访问,也可以被不同包中的子类访问 (4)public:可以被所有的包访问 默认访问:只能被同一包中的其他类访问
  • 190. 2.9.3访问控制
  • 191. 课后练习编写程序 编写一个学生类,类中的成员属性有学号,姓名,语文成绩,数学成绩,类中的成员方法实现的功能是根据输入的学生学号,查询学生的姓名以及该生的语文成绩的数学成绩,并输出该生的总成绩.
  • 192. 小结2.1 面向对象的基本概念 2.2 类与封装 2.3 static关键字 2.4 内部类 2.5 类的继承 2.6 final关键字 2.7 抽象类与接口 2.8 异常 2.9 包
  • 193. 3 类的应用
  • 194. 3 类的应用本章是讲解各种常用类的使用 课程内容: 3.1 String类 3.2 StringBuffer类 3.3 Calendar类 3.4 基本类型的对象包装类
  • 195. 3.1 String类3.1.1 “+” 3.1.2 equals和== 3.1.3 构造方法 3.1.4 常用方法
  • 196. 3.1.1 “+”String s1 = "x"+4+6 String s2 = 4+6+"tt";
  • 197. 3.1.2 equals和==String s1=“hello”; String s2=“hello”; String s1 = new String(“hello”); String s2 = new String(“hello”);
  • 198. 3.1.3 构造方法String() String(byte[] bytes) String(byte[] bytes, int offset, int length) String(char[] value) String(char[] value, int offset, int count)
  • 199. 3.1.4 常用方法charAt(int index) compareTo(String anotherString) compareToIgnoreCase(String str) copyValueOf(char[] data, int offset, int count) endsWith() equals(Object anObject)
  • 200. 3.1.4 常用方法equalsIgnoreCase(String anotherString) getBytes() indexOf() startsWith() substring(int beginIndex) toCharArray() toLowerCase() toUpperCase() trim() valueOf()
  • 201. 3.2 StringBuffer类3.2.1 String与StringBuffer区别 3.2.2 StringBuffer构造方法 3.2.3 StringBuffer的常用方法
  • 202. 3.2.1 String与StringBuffer区别String类对象的内容一旦被初始化就不能再改变 StringBuffer类:内容可以改变的字符串,一旦通过StringBuffer类生成了最终想要的字符串,就该用StringBuffer.toString方法将其转换成String类
  • 203. 3.2.2 StringBuffer构造方法StringBuffer() StringBuffer(CharSequence seq) StringBuffer(int capacity) StringBuffer(String str)
  • 204. 3.2.3 StringBuffer的常用方法append(boolean b) capacity() delete(int start, int end) deleteCharAt(int index) indexOf(String str) insert(int offset, boolean b) lastIndexOf(String str) length() replace(int start, int end, String str) substring(int start, int end) trimToSize()
  • 205. 3.3 Calendar类3.3.1 Calendar 构造方法 3.3.2 Calendar 成员方法
  • 206. 3.3.1 Calendar构造方法Calendar() Calendar(TimeZone zone, Locale aLocale)
  • 207. 3.3.2 Calendar 成员方法add(int field, int amount) get(int field) getFirstDayOfWeek() getInstance() setFirstDayOfWeek(int value)
  • 208. 3.4 基本类型的对象包装类8中基本数据类型都有其对应的包装类 boolean Boolean byte Byte char Character short Short int Integer long Long float Float double Double
  • 209. 课后练习编写程序 输入字符串1,再输入字符串2,在字符串1中寻找字符串2的个数 输入用户名和密码,若输入正确,显示”合法的用户”,若输入不正确,显示”用户或密码有错,重新输入”,但只有三次输入机会,三次以后若不正确,显示”非法用户”
  • 210. 小结3.1 String类 3.2 StringBuffer类 3.3 Calendar类 3.4 基本类型的对象包装类
  • 211. 4 图形组件
  • 212. 4 图形组件本章是了解Java的图形组件及事件响应 课程内容: 4.1 图形用户界面概述 4.2 事件处理 4.3 图形图像操作 4.4 常用组件
  • 213. 4.1 图形用户界面概述4.1.1 代码示例 4.1.2 用户界面概述
  • 214. 4.1.1 代码示例import java.awt.*; public class TestFrame{ public static void main(String [] args){ JFrame f = new JFrame("初识GUI"); f.add(new Button("push me")); f.setSize(300,300);//设置窗口大小 f.setVisible(true);//显示或隐藏窗口 }
  • 215. 4.1.2用户界面概述GUI组件分为两类:基本组件和容器 基本组件:不能容纳其他组件 容器:是一种特殊的组件,用来容纳其他组件
  • 216. 4.2 事件处理4.2.1 AWT事件处理 4.2.2 用事件监听器处理事件 4.2.3 事件适配器
  • 217. 4.2.1 AWT事件处理事件:用户对组件的一个操作称为事件 事件源:发生事件的组件 事件处理器:负责处理事件的方法
  • 218. 4.2.2 事件监听器处理事件ActionListener MouseListener KeyListener WindowListener MouseMotionListener
  • 219. 4.2.2 事件监听器处理事件一个事件源上可注册多种不同的监听器(响应多个事件) 一个监听器可以注册到多个事件源上(多个组件相应同一个事件) 事件监听器的匿名内部类实现
  • 220. 4.2.3 事件适配器 适配器即实现了事件监听器接口的类(为了简化编程) 适配器没有做任何事情
  • 221. 4.2.3事件适配器 WindowAdapter MouseAdapter
  • 222. 4.3 图形图像操作4.3.1 图形操作 4.3.2 图像操作 4.3.3 双缓冲
  • 223. 4.3.1图形操作组件提供一个getGraphics方法,返回一个Graphics类,该类提供了在组件上绘画。打印文字和显示图像等操作
  • 224. 4.3.1图形操作drawLine drawOval drawRect drawRoundRect fill3DRect fillArc fillOval fillRect fillRoundRect
  • 225. 4.3.2 图像操作drawImage
  • 226. 4.3.3 双缓冲双缓冲技术:当窗口重画时需要重绘所有的图形,若图形较多,则速度较慢。所以,在组件上绘图的同时也在内存中通过Component.createImage方法创建一个Image对象,当重绘时只需绘制这一个image对象即可,这种技术即为双缓冲技术 双缓冲的实现
  • 227. 4.4 常用组件4.4.1 常用组件概述 4.4.2 常用组件的层次 4.4.3 容器类 4.4.4 布局管理 4.4.5 swing包中的组件介绍
  • 228. 4.4.1常用组件概述awt组件 Swing组件 两者的关系
  • 229. 4.4.2 常用组件的层次组件不能单独存在,必须添加到容器中 ContainerWindowPanelFrameDialogAppletBorderLayoutFlowLayoutComponent
  • 230. 4.4.3 容器类Window 一般很少直接使用Window,而是使用它两个子类Frame 和Dialog。 Frame 是带有标题和边界的容器
  • 231. 4.4.3 容器类Panel Panel可作为容器容纳其他组件,但不能独立存在,必须被添加到其他的容器中
  • 232. 4.4.3 容器类ScrollPane ScrollPane是一种容器,不能单独使用,显示较大部件时会出现滚动条 ScrollPane中只能放置一个组件,无布局管理器,需放置多个组件时,可将这些组件嵌套在一个Panel中,再将Panel放置到ScrollPane中
  • 233. 4.4.4 布局管理边框布局 流布局 网格布局 卡片布局 取消布局
  • 234. 4.4.4 布局管理BorderLayout Frame和Dialog的默认布局管理器就是BorderLayout 位置参数严格区分大小写
  • 235. 4.4.4 布局管理FlowLayout 组件从左到右,从上到下依次排列,如果一个组件在本行放不下,则自动换到下一行 FlowLayout是Panel和applet的默认布局管理器
  • 236. 4.4.4 布局管理GridLayout GridLayout将容器分成若干行列的网格,在容器上添加组件时,会按从左到右、从上到下的顺序在网格中排列
  • 237. 4.4.4 布局管理CardLayout CardLayout能够实现将多个组件放在同一容器区域内的交替显示,在任何时候只有最上面的一个可见。 CardLayout提供了几个方法,可以显示特定的卡片,也可以按先后顺序依次显示,还可以直接定位到第一张或最后一张
  • 238. 4.4.4 布局管理取消布局管理 可以用绝对坐标的方式来指定组件的位置和大小,在这种情况下,我们先要调用Container.setLayout(null)方法来取消布局管理器,然后调用Component.setBounds方法来设置每个组件的大小和位置
  • 239. 4.4.5 swing包中的组件介绍Awt的组件都是Component类的子类 Swing的组件都是Jcomponent类的子类 Swing在应用原理和方式上与Awt类似,学会了Awt,也就学会了Swing,关键是会查JDk文档
  • 240. 4.4.5 swing包中的组件介绍JFrame Java1.5中重写了add方法和setLayout方法 1.5前的版本中,JFrame上不能直接添加子组件和设置布局管理器,必须调用它的getContentPane方法获得此窗体的 contentPane 对象,再在contentPane进行相应操作
  • 241. 4.4.5 swing包中的组件介绍JScrollPane JTextField Jlabel JButton JMenubar Jmenu JmenuItem JRadioButton Jcombobox JList
  • 242. 课后练习编写程序 实现计算器的功能 编写万年历
  • 243. 小结4.1 图形用户界面概述 4.2 事件处理 4.3 图形图像操作 4.4 常用组件
  • 244. 5 线程及线程应用
  • 245. 5 线程及线程应用本章是了解线程的概念,掌握线程的控制,可以灵活运用线程 课程内容: 5.1 线程的概念 5.2 线程的使用 5.3 线程同步和通信
  • 246. 5.1 线程5.1.1 线程的概念 5.1.2 线程的生命周期
  • 247. 5.1.1 线程的概念进程:在多任务系统中,每个独立执行的程序称为进程 线程:一个进程中可以包含一个或多个线程,一个线程就是一个程序内部的一条执行线索 当程序启动时,就自动产生一个线程,主函数main就是在这个线程上运行的。前面所讲的例子都是单线程的 创建多线程有两种方法:继承Thread类和实现Runnable接口
  • 248. 5.1.2 线程的生命周期新建 就绪 运行 阻塞 死亡
  • 249. 5.2 线程的使用5.2.1 创建线程的方法 5.2.2 使用runnable接口的好处 5.2.3 启动线程 5.2.4 前台线程和后台线程 5.2.5 联合进程与join方法
  • 250. 5.2.1 创建线程的方法用Thread类创建线程 要实现多线程,必须编写一个继承了Thread类的子类,子类要重写Thread的run方法,在run方法中调用想在线程上运行的程序代码
  • 251. 5.2.1 创建线程的方法使用Runnable接口创建多线程 定义一个实现Runnable接口的类并生成实例 生成一个Thread的实例 将生成的Runnable接口的实例作为参数传递 给Thread的构造方法
  • 252. 5.2.2使用runnable接口的好处可以实现多个线程处理同一资源的情况 避免Java单继承性带来的局限 代码可以被多个线程共享(即run中的代码)
  • 253. 5.2.3 启动线程线程启动:start()方法
  • 254. 5.2.4 前台线程和后台线程对于Java程序,只要有一个前台线程在运行,进程就不会结束;如果一个进程中只有后台线程运行,这个进程就会结束 前台线程和后台线程是相对而言的,按前面的方式产生的都是前台进程,如果在调用start方法前调用了setDaemon(true)方法,这个线程就变成了后台线程
  • 255. 5.2.5 联合进程与join方法void join(long millis) void join(long millis,int nanos) 这两个方法的作用是指定合并的时间(前者精确到毫秒,后者精确到纳秒),即两个线程合并指定的时间后,又开始分离,回到以前的状态
  • 256. 5.3 线程同步和通信5.3.1 线程同步 5.3.2 线程通信 5.3.3 线程死锁 5.3.4 线程的生命控制
  • 257. 5.3.1 线程同步破坏线程安全的案例 同步代码块的格式: synchronized(object){代码块} object可以是任意一个对象
  • 258. 5.3.1 线程同步同步通过改变object的锁旗标实现 同步会降低程序的性能 同步代码块不仅指同一个代码块在多个线程间实现同步,也可以是不同的代码块之间相互同步,只要各synchronized(object)语句中的object是同一个对象
  • 259. 5.3.1 线程同步同步方法(函数) 除了可以对代码块进行同步外,也可以对方法实现同步,只需在要同步的方法定义前加上synchronized关键字即可
  • 260. 5.3.1 线程同步代码块与函数间的同步 同步方法所用的监视器对象是this
  • 261. 5.3.2 线程通信线程不同步的情况: 同步不同的线程: 更清晰的代码:
  • 262. 5.3.2 线程通信线程间的交替调用: wait:使当前线程放弃监视器进入睡眠状态,直到其他线程进入同一监视器并调用notify notify:唤醒同一监视器对象中调用wait的第一个线程 notifyAll:唤醒同一监视器对象中调用wait的所有线程,具有最高级的线程首先被唤醒并执行
  • 263. 5.3.3 线程死锁案例
  • 264. 5.3.4 线程的生命控制不推荐使用的终止线程生命的方法: (1)suspend和resume:会导致死锁 (2)stop:导致数据不完整 正确终止线程生命:
  • 265. 课后练习编写程序 实现人物动画效果 编写一个圆绕四周运动
  • 266. 小结5.1 线程的概念 5.2 线程的使用 5.3 线程同步和通信
  • 267. 6 输入与输出
  • 268. 6 输入与输出本章是了解程序与文件系统的交互方式,可以直接对文件进行读写控制 课程内容: 6.1 File类 6.2 字节流 6.3 字符流 6.4 编码 6.5 随机文件
  • 269. 6.1 File类6.1.1 File类的概述 6.1.2 File类常用方法
  • 270. 6.1.1 File类的概述File类: 代表磁盘文件本身的对象,通过File类的各种方法,可以创建、删除、重命名文件,及判断文件的读写权限是否存在,设置和查询文件的最近修改时间
  • 271. 6.1.2 File类常用方法创建文件 createNewFile() createTempFile(String prefix, String suffix) 删除文件 delete() deleteOnExit() 列出文件 listFiles() 获取文件信息 getName() getParent()
  • 272. 6.2 字节流6.2.1 概述 6.2.2 字节流的父类及常用方法 6.2.3 文件流 6.2.4 数据流 6.2.5 缓冲流 6.2.6 内存读取流 6.2.7 对象流
  • 273. 6.2.1 概述IO流分为两类:字节流和字符流 字节流:读写二进制数据 字符流:读写字符数据 输入流:读取数据 输出流:写入数据
  • 274. 6.2.2 字节流的父类及常用方法InputStream int read():返回下一个输入字节的整型表示,如果返 回-1表示遇到流的末尾,结束 int read(byte[] b):读入b.length个字节放到b中并返回 实际读入的字节数 int read(byte[] b,int off,int len):把流中数据读到数组b 中从脚标为off开始的len个数组元素中 long skip(long n):跳过输入流上的n个字节并返回实际跳过的字节数
  • 275. 6.2.2 字节流的父类及常用方法InputStream int available():返回当前输入流中可读的字节数 void mark(int readlimit):在输入流的当前位置放上一个 标志,允许 最多再读入readlimit个字节 void reset():把输入指针返回到以前所做的标志处 boolean markSupported():如果当前流支持mark/reset 操作就返回true void close():关闭流,释放与流相关的资源 注意:并不是其所有的子类都支持InputStream中定义的 方法
  • 276. 6.2.2 字节流的父类及常用方法OutputStream 定义了输出流的抽象类,这个类中所以的方法都返回void void write(int b):将一个字节写到输出流 void wirte(byte[] b):将整个字节数组写到输出流 void wirte(byte[] b,int off,int len):将字节数组b中 的从off开始的len个字节写到输出流 void flush():完成输出并清空缓冲区 void close():关闭输出流
  • 277. 6.2.3 文件流FileInputStream和FileOutputStream用来操作磁盘文件,在创建一个FileInputStream对象时通过构造器指定文件的路径和名字,这个文件应该是存在和可读的。在创建FileOutPutStream是指定文件若存在则将被覆盖
  • 278. 6.2.3 文件流FileInputStream的构造器 (1) FileInputStream in = new FileInputStream(“hello.txt”); (2) File f= new File(“hello.txt”); FileInputStream in = new FileInputStream(f); FileOutputStream的构造器 (1) FileOutputStream in = new FileOutputStream(“hello.txt”); (2) File f= new File(“hello.txt”); FileOutputStream in = new FileOutputStream(f);
  • 279. 6.2.4 数据流DataInputStream类 DataInputStream有与DataOutPutStream对应的read方法 DataOutputStream类的三种写入字符串的方法 (1)Public final void writeBytes(String s) throws IOException (2)Public final void writeChars(String s) throws IOException (3)Public final void writeUTF(String s) throws IOException
  • 280. 6.2.4 数据流DataInputStream DataInputStream只提供了readUTF方法,而没有与DataOutputStream中的writeBytes和writeChars方法对应的read方法,这是因为在一个连续的字节流中读取一个字符串,如果没有特殊的标志作为一个字符串的结尾,而且事先不知道字符串的长度,那么就无法读取这个字符串。 在DataOuputStream类中只有wirteUTF方法写入了字符串的长度
  • 281. 6.2.4 数据流DataOutputStream类 Public final void writeBoolean(boolean b) throws IOException Public final void writeShort(int s) throws IOException Public final void writeChar(int c) throws IOException Public final void writeInt(int i) throws IOException
  • 282. 6.2.4 数据流DataOutputStream类 Public final void writeLong(long l) throws IOException Public final void writeFloat(float f) throws IOException Public final void writeDouble(double d) throws IOException Public final void writeBytes(Sring b) throws IOException DataOutputStream可以往IO设备中写入各种类型的数据
  • 283. 6.2.5 缓冲流当一个简单的写请求产生后,数据不马上写到所连接的输出流和文件中,而是高速写入缓存中,当缓存写满或关闭流时,所有的数据再一次性从缓存中写入输出流或文件中,提高写入文件中的效率
  • 284. 6.2.5 缓冲流BufferedInputStream BufferedInputStream类可以对任何InputStream进行 带缓冲区的封装以达到性能的改善 构造器: (1)BufferedInputStream(InputStream in) 创建一个带32字节缓冲区的缓冲流 (2) BufferedInputStream(InputStream in,int size) 创建一个带size字节缓冲区的缓冲流
  • 285. 6.2.5 缓冲流BufferedOutputStream BufferedOutputStream有一个flush方法用来将缓冲区的数据全部强制输出构造器 (1)BufferedOutputStream(OutputStream out) 创建一个带32字节缓冲区的缓冲流 (2)BufferedOutputStream(OutputStream out,int size) 创建一个带size字节缓冲区的缓冲流
  • 286. 6.2.6 内存读取流ByteArrayInputStream和ByteArrayOutputStream 内存虚拟成硬盘上的文件,从而作用这两个流用IO的方式对字节数组内容提供提高程序的效率,如在通过网络发送截屏图像的应用中
  • 287. 6.2.6 内存读取流ByteArrayInputStream的构造方法 ByteArrayInputStream(byte[] buf) 将数组buf中的数据读入到ByteArrayInputStream中 ByteArrayInputStream(byte[] buf,int offset,int length) 将数组buf中的数据(从offset开始的length个元素)读入到ByteArrayInputStream中
  • 288. 6.2.6 内存读取流ByteArrayOutputStream的构造方法 ByteArrayOutputStream() 创建一个32字节的缓冲区 ByteArrayOutputStream(int size) 创建一个指定字节(size)的缓冲区 注:缓冲区的大小在数据过多时能够自动增长
  • 289. 6.2.7对象流ObjectInputStream和ObjectOutputStream 这两个类用于存储和读取对象的流 保存了对象的所有成员变量就等于保存了这个对象,读 取了一个对象中的所有成员变量就等于读取到了一个对 象ObjectInputStream和ObjectOutputStream用来完成保 存和读取对象成员变量,但读写的对象必须实现serializable接口
  • 290. 6.2.7对象流序列化 使用ObjectInputStream和ObjectOutputStream保存和读取对象的机制称作序列化 ObjectInputStream和ObjectOutputStream不会保存和读取对象中的transient和static的成员变量
  • 291. 6.2.7对象流序列化的优点 序列化可以将任何实现了Serializable接口的对象转换成连续的字节数据,这些数据仍可以被还原成原来的对象状态,即使这些数据通过网络传输也没问题 序列化可以处理不同操作系统上的差异,windows上创建的对象,序列化后传输到linux上,该对象仍可以被正确重建出来
  • 292. 6.3 字符流6.3.1 字符流概述 6.3.2 文件流 6.3.3 缓冲流 6.3.4 字节流到字符流的转换 6.3.5 缓冲流的应用 6.3.6 打印流 6.3.7 如何判断文件结束
  • 293. 6.3.1 字符流概述字符:每个字符由一个或多个字节组成,每个字节都是用-128到127之间的部分数值来表示,也就是说,-128到127之间还有一些数据没有对应任何字符的任何字节 文本文件:专门用于存储文本字符的数据,没有包含字符外的其他数据,这种文件就是文本文件 二进制文件:除文本文件之外的文件就是二进制文件
  • 294. 6.3.1 字符流概述字符流:Reader和Writer InputStream和OutputStream是用来处理字节的,在处理字符文本时不太方便 Reader和Writer专门用来处理字符(功能和InputStream和OutputStream 相似,在处理字符文本时简化了我们的编程)
  • 295. 6.3.2 文件流FileReader FileWriter
  • 296. 6.3.3 缓冲流BufferedReader BufferedWriter
  • 297. 6.3.4 字节流到字符流的转换InputStreamReader和OutputStreamWriter是字节流和字符流之间的转换 InputStreamReader可将一个字节流中的字节解码成字符 OutputStreamWriter可将写入的字符编码成字节后写入一个字节流
  • 298. 6.3.4 字节流到字符流的转换InputStreamReader的构造器 InputStreamReader(InputStream in) 用默认字符集创建一个InputStreamReader对象 InputStreamReader(InputStream in,String charsetName) 接受以指定字符集名的字符串,并用该字符集创建InputStreamReader对象
  • 299. 6.3.4 字节流到字符流的转换OutputStreamWriter的构造器 OutputStreamWriter(OutputStream out) 用默认字符集创建一个OutputStreamWriter对象 OutputStreamWriter(OutputStream out,String charsetName) 接受以指定字符集名的字符串,并用该字符集创建OutputStreamWriter对象
  • 300. 6.3.5 缓冲流的应用 为了提高效率,应避免频繁的进行字符与字节的相互转换,最好不要直接使用这两个类来进行读写,应尽量使用BufferedWriter包装OutputStreamWriter,用BufferedReader包装InputStreamReader,如: BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)) BufferedReader in = new BufferedReader(new InputStreamReader(System.in))
  • 301. 6.3.5 缓冲流的应用读取键盘上输入的一整行字符 BufferedReader in = new BufferedReader(new inputStreamReader(System.in)); String line = null; try { line = in.readLine(); } catch (IOException e) { e.printStackTrace();} System.out.println(line);
  • 302. 6.3.6 打印流PrintStream System.out是PrintStream类的一个实例对象 PrintStream的构造器 (1) PrintStream(OutputStream out) (2) PrintStream(OutputStream out, boolean,autoflush ) (3) PrintStream(OutputStream out ,boolean,autoflush ,String encoding) autoflush控制在java中遇到换行符(\n)时是否自动清空缓冲区
  • 303. 6.3.7 如何判断文件结束 文本文件: 由于没有编码为-1的字符,所以操作系统使用-1作为 文件的结束标志 二进制文件: 二进制文件的结束标志也是-1,单由于二进制文件中的每个字节可以是-128到127之间的任意取值,所以不能根据-1判断文件的结束。二进制文件的开始有一个文件头指定文件的大小,程序可以通过文件头中的这个大小来判断文件是否结束
  • 304. 6.4 编码6.4.1 编码概念 6.4.2 不同字符集之间的转换
  • 305. 6.4.1 编码概念字节用于表示计算机内存中最原始的数据,不会涉及到编码问题,只有把字节中的内容当作字符来处理时,才会涉及编码问题
  • 306. 字符集的编码ASCII(American Standard Code for Information Interchange,美国信息互换标准代码),是基于常用的英文字符的一套电脑编码系统。我们知道英文中经常使用的字符、数字符号被计算机处理时都是以二进制码的形式出现的。这种二进制码的集合就是所谓的ASCII码。每一个ASCII码与一个8位(bit)二进制数对应。其最高位是0,相应的十进制数是0-127。如,数字“0”的编码用十进制数表示就是48。另有128个扩展的ASCII码,最高位都是1,由一些制表符和其它符号组成。ASCII是现今最通用的单字节编码系统。 GB2312:GB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集-基本集》。主要用于给每一个中文字符指定相应的数字,也就是进行编码。一个中文字符用两个字节的数字来表示,为了和ASCII码有所区别,将中文字符每一个字节的最高位置都用1来表示。 GBK:为了对更多的字符进行编码,国家又发布了新的编码系统GBK(GBK的K是“扩展”的汉语拼音第一个字母)。在新的编码系统里,除了完全兼容GB2312 外,还对繁体中文、一些不常用的汉字和许多符号进行了编码。 ISO-8859-1:是西方国家所使用的字符编码集,是一种单字节的字符集 ,而英文实际上只用了其中数字小于128的部分。http://www.sunxin.org
  • 307. 字符集的编码Unicode:这是一种通用的字符集,对所有语言的文字进行了统一编码,对每一个字符都用2个字节来表示,对于英文字符采取前面加“0”字节的策略实现等长兼容。如 “a” 的ASCII码为0x61,UNICODE就为0x00,0x61。 UTF-8:Eight-bit UCS Transformation Format,(UCS,Universal Character Set,通用字符集,UCS 是所有其他字符集标准的一个超集)。一个7位的ASCII码值,对应的UTF码是一个字节。如果字符是0x0000,或在0x0080与0x007f之间,对应的UTF码是两个字节,如果字符在0x0800与0xffff之间,对应的UTF码是三个字节。http://www.sunxin.org
  • 308. 6.4.2不同字符集之间的转换import java.io.BufferedReader; import java.io.InputStreamReader; public class InputReader { public static void main(String[] args) { try{ InputStreamReader isr = new InputStreamReader(System.in,"ISO8859-1"); BufferedReader br = new BufferedReader(isr); }
  • 309. 6.4.2不同字符集之间的转换 String strLine = br.readLine(); isr.close(); System.out.println(strLine); }catch(Exception e){ e.printStackTrace(); } }
  • 310. 6.5 随机类RandomAccessFile RandomAccessFile类支持“随机访问”方式,可以跳转到文件的任意位置读写数据 RandomAccessFile可以以只读或读写方式打开文件 new RandomAccessFile(f,”rw”) new RandomAccessFile(f,”r”) 当以读写方式打开不存在的文件时,程序会自动创建该文件
  • 311. 课后练习编写程序 编写记事本程序,完成功能如下 新建文件 打开文件 保存文件 剪切、复制、粘贴 基本格式的设定:字体,字号,字的颜色
  • 312. 小结6.1 File类 6.2 字节流 6.3 字符流 6.4 编码 6.5 随机文件
  • 313. 7 Java小应用程序
  • 314. 7 Java小应用程序本章是介绍Java小应用程序的使用,以及动画的实现 课程内容: 7.1 小应用程序的简介 7.2 小应用程序的执行过程 7.3 在小应用程序中的图形和图像控制 7.4 声音控制 7.5 小应用程序的限制
  • 315. 7.1 小应用程序的简介7.1.1 小应用程序的简介 7.1.2 关于Applet不能运行的问题
  • 316. 7.1.1 小应用程序的简介Applet就是在浏览器中执行的Java程序,必须是java.applet.Applet的子类 Applet程序的执行不是从main方法开始 Applet是一个GUI程序,在Applet中只能使用drawString()等awt方法打印字符
  • 317. 7.1.2 关于Applet不能运行的问题 工具--Internet选项--高级--选中“将jre1.5用于applet(需重启)”
  • 318. 7.2 小应用程序的执行过程7.2.1 小应用程序的执行过程简介 7.2.2 执行过程中运行的方法
  • 319. 7.2.1 小应用程序的执行过程简介1.浏览器装载网页并解释其中的内容 2.遇到applet标签后就下载标签中指定的class文件并创建改类的实例对象
  • 320. 7.2.2 执行过程中运行的方法init()方法: 1.applet对象被创建后会立即调用init方法进行初始化 2.init方法在applet对象的生命周期中只会被调用一次 3.格式:public void init(){}
  • 321. 7.2.2 执行过程中运行的方法start()方法: 1.调用init方法后接着会调用这个方法,浏览器离开创建此applet对象的页面后,applet对象不会消失,当浏览器再次回到此页面时,又会调用start方法。如:当网页显示时启动一个音乐进程,离开是停止音乐进程,则启动进程的代码可放入start方法 2.格式:public void start(){}
  • 322. 7.2.2 执行过程中运行的方法stop方法: 1.stop方法中适合放置停止只有网页当前被显示时才要保持运行的功能的代码 2.格式:public void stop(){}
  • 323. 7.2.2 执行过程中运行的方法destroy方法 1.当applet所在的浏览器被关闭时,applet对象会被销毁,在applet对象被销毁前,destroy方法会被调用 2.格式:public void destroy(){}
  • 324. 7.3 Applet中的图形和图像控制paint方法 java.applet.Applet继承于java.awt.panel 当applet被重画后,paint方法会被调用
  • 325. 7.4声音控制getAudioClip(URL url) newAudioClip(URL url)
  • 326. 7.5 Applet的限制不能调用其他的应用程序执行 不能进行文件IO操作 不能调用本机代码 不能与applet所在的主机之外的其他机器进行网络连接
  • 327. 课后练习编写程序 利用Applet制作一个游戏界面
  • 328. 小结7.1 小应用程序的简介 7.2 小应用程序的执行过程 7.3 在小应用程序中的图形和图像控制 7.4 声音控制 7.5 小应用程序的限制
  • 329. 8 Java小游戏的实现
  • 330. 8 Java小游戏的实现本章是掌握对Java小游戏的框架的了解,掌握游戏的编写 课程内容: 8.1 编写游戏 8.2 调试游戏
  • 331. 8 Java小游戏的实现 8.1 编写游戏 8.2 调试游戏
  • 332. 课后练习编写一个小游戏
  • 333. 小结8.1 编写游戏 8.2 调试游戏
  • 334. 9 网络编程
  • 335. 9 网络编程本章是介绍通过类连接到www,然后讨论如何通过TCP/IP或UDP协议在网络上的两个程序间建立连接并交换数据 课程内容: 9.1 网络概述 9.2 InetAddress 类 9.3 UDP网络程序 9.4 TCP网络程序
  • 336. 9.1 网络概述9.1.1 Ip地址 9.1.2 端口号 9.1.3 TCP和UDP 9.1.4 TCP、UDP数据包基本格式 9.1.5 Socket 9.1.6 Java.net包
  • 337. 9.1.1 Ip地址IP地址用4个字节,32位二进制数来表示,称为Ipv4 正在试验和定制Ipv6,即16个字节表示
  • 338. 9.1.2 端口号一台计算机上可同时运行多个网络程序,IP地址只能保证把数据送到计算机,无法得知把数据交给哪个网络程序,所以每个被发送的数据包的头部都包含一个称为“端口”的部分,表示数据应交给哪个应用程序 端口是0-65535间的一个整数,每个网络程序都有一个端口,0-1023端口是一些知名网络程序使用的,用户的普通网络程序应使用1024以上的端口数 端口不能被两个或以上的网络程序重用
  • 339. 9.1.3 TCP和UDPTCP:Transmission Control Protocol,传输控制协议 UDP:User Datagram Protocol,用户数据报协议
  • 340. 9.1.3 TCP和UDP TCPTCP TCP是面向连接的通信协议,提供两台计算机之间的可靠无差错的数据传输 应用程序使用TCP通信时,源和目标之间会建立一个虚拟连接
  • 341. 9.1.3 TCP和UDPUDP UDP是无连接通信协议,不保证数据的可靠传输,但能够向若干目标发送数据,接受发自若干个源的数据
  • 342. 9.1.4 TCP、UDP数据包基本格式协议类型源IP目标IP源端口目标端口帧序号帧数据
  • 343. 9.1.5 SocketSocket是网络驱动层提供给应用程序的接口和一种机制,通过一种绑定机制与驱动程序建立关系,包含IP和Port信息 发送数据时,应用程序将数据交给Socket,由Socket交给驱动程序向网络上发送 接收数据时,计算机从网络上收到与该Socket绑定的IP+Prot相关的数据后,由驱动程序交给Socket,应用程序可从Socket中提取数据
  • 344. 9.1.6 Java.net包Java分别为UDP和TCP提供了相应的编程类,这些类放在java.net包中,与UDP对应的是DatagramSocket,与TCP对应的是ServerSocket(用于服务器端)和Socket(用于客户端)
  • 345. InetAddressInetAddress是用于表示计算机地址的一个类 InetAddress的getByName(String host)方法可根据条件返回一个InetAddress的实例 InetAddress的getHostAddress()可返回 IP 地址字符串
  • 346. 9.3 UDP网络程序9.3.1 数据报通信的概述 9.3.2 DatagramSocket的构造方法 9.3.3 关闭Socket 9.3.4 DatagramPacket的构造方法 9.3.5 数据的发送和接收 9.3.6 数据报通信的注意点
  • 347. 9.3.1 数据报通信的概述DatagramSocket 和DatagramPacket DatagramSocket 好比一个港口,应用程序只要把装着数据的“集装箱”放到港口上就算完成了数据的发送,剩下的工作由驱动程序完成 DatagramPacket 就是存放数据的集装箱
  • 348. 9.3.2 DatagramSocket的构造方法DatagramSocket的构造方法: public DatagramSocket() throws SocketException 使用该构造方法创建DatagramSocket对象时未指定端口号,系统会自动分配一个还没有被使用的端口号,用于编写发送程序
  • 349. 9.3.2 DatagramSocket的构造方法Public DatagramSocket(int port) throws SocketException 使用该构造方法创建DatagramSocket对象时指定一个端口号,用于编写接受程序 Public DatagramSocket(int port,InetAddress laddr) throws SocketException 使用该构造方法创建DatagramSocket对象时除了指定一个端口号外,还指定了IP地址,适用于由多块网卡的情况,用于编写接受程序
  • 350. 9.3.3 关闭Socket但不再使用某个Socket时,应该调用DatagramSocket.close()方法关闭这个Socket,释放端口号和其他资源
  • 351. 9.3.4 DatagramPacket的构造方法public DatagramPacket(byte[] buf,int length) 使用该构造方法创建DatagramPacket对象时指定了数据包的内存空间和大小,接收数据时用 public DatagramPacket(byte[] buf,int length,InetAddress address,int port) 使用该构造方法创建DatagramPacket对象时指定了数据包的内存空间和大小,以及数据包的目标地址和端口,发送数据时用
  • 352. 9.3.5 数据的发送和接收发送数据: public void send(DatagramPacket p) throws IOException 接收数据 public void receive(DatagramPacket p) throws IOException
  • 353. 9.3.5 数据的发送和接收DatagramPacket的getInetAddress()方法返回一个InetAddress实例对象 DatagramPacket的getPort()返回端口号
  • 354. 9.3.6 注意UDP数据发送时不可靠的,数据可能在传输过程中丢失 必须先运行UDP接收程序,再运行发送程序 UDP接收程序运行到receive方法时将阻塞,直到网络上有数据到来,如果网络上没有数据发送过来,receive方法也没有阻塞,那么通常情况是使用了一个被其他程序占用的端口号
  • 355. 9.4 TCP网络程序9.4.1 TCP概述 9.4.2 ServerSocket的构造方法 9.4.3 Socket的构造方法 9.4.5 TCP服务器和客户端的连接 9.4.6 完善TCP程序
  • 356. 9.4.1 TCP概述使用UDP通信的两个程序没有主次之分 使用TCP进行通信的两个程序有主次之分,一个是服务器程序,一个是客户端程序
  • 357. 9.4.1 TCP概述服务器端与客户端的交互过程 服务器程序创建一个ServerSocket,然后调用accept方法等待客户来连接 客户端程序创建一个Socket,并请求与服务器建立连接 服务器接受客户的连接请求,并创建一个薪的Socket与该客户建立专线连接 刚才建立了连接的两个Socket在一个单独的线程(由服务器程序创建)上对话 服务器开始等待新的连接请求
  • 358. 9.4.2 ServerSocket的构造方法public ServerSocket() throws IOException 未与任何端口号绑定,不能被直接使用,需要继续调用bind方法才能完成和其他构造方法一样的功能 public ServerSocket(int port) throws IOException 创建对象时就将ServerSocket和端口号绑定,如果port为0,则系统会自动分配一个未被使用的端口号,但由于作为服务器程序,端口号必须事先指定,其他的客户端程序才能与之连接,所以prot指定为0的情况一般不被使用
  • 359. 9.4.2 ServerSocket的构造方法public ServerSocket(int port,int backlog) throws IOException 在第二个构造方法的基础上,根据backlog参数指定,在服务器忙时,可以与之保持连接请求的等待客户数据量 public ServerSocket(int port,int backlog,InetAddress bindAddr) throws IOException 在第三个构造方法的基础上,根据bindAddr指定IP地址,适用于多个网卡的情况
  • 360. 9.4.2 ServerSocket的构造方法public Socket() 创建的Socket对象不与任何服务器建立连接,不能被直接使用,需调用connect方法才能完成和其他构造方法一样的功能
  • 361. 9.4.3 Socket的构造方法public Socket(String host,int port) throws UnknownHostException,IOException public Socket(InetAddress address,int port) throws IOException 这两个构造方法创建Socket对象后,会根据参数连接在特定地址和端口上运行的服务器程序,其中host为主机名,address为IP地址
  • 362. 9.4.3 Socket的构造方法public Socket(String host,int port,InetAddress localAddr,int localPort) throws IOException public Socket(InetAddress address,int port,InetAddress localAddr,int localPort) throws IOException 这两个构造方法在前两个构造方法的基础上还指定了本地Socket所绑定的IP地址和端口号,由于客户端的IP地址和端口号选择并不重要,所以一般情况下不使用这两个构造方法
  • 363. 9.4.4 TCP服务器和客户端的连接服务器端调用ServerSocket.accept方法等待客户的连接请求,一旦accept接收了客户的连接请求,该方法将返回一个与该客户建立了专线连接的Socket对象 当客户端和服务器端的两个Socket建立了专线连接后,连接的一段能向另一端连续写入字节,也能从另一端连续读入字节,即建立了专线连接的两个Socket是以IO流的方式进行数据交换的,java提供了Socket.getInputStream方法返回Socket的输入流对象,Socket.OutputStream方法返回Socket的输出流对象。 只要连接的一端向该输出流对象写入了数据,连接的另一段就能从其输入流对象中读取这些数据
  • 364. 9.4.5 完善的TCP服务器程序能接收多个客户的连接请求,为每个客户连接创建一个单独的线程与客户进行对话 思路: 1.一次accept方法只接收一个连接,所以accept方法需放置一个循环中,这样才能接收多个连接 2.每个连接的数据交换代码也放在一个循环中,保证两者能够不停地交换数据 3.每个连接的数据交换代码,必须放在独立的线程中运行,否则在这段代码运行期间无法执行其他的程序代码,accept方法也就得不到调用,新的连接无法进入
  • 365. 课后练习编写一个简易的聊天程序
  • 366. 小结9.1 网络概述 9.2 InetAddress 类 9.3 UDP网络程序 9.4 TCP网络程序
  • 367. 10 数据结构
  • 368. 10 数据结构本章是了解Java的数据结构,能够灵活应用在游戏编程中 课程内容 10.1 链表 10.2 堆栈 10.3 队列 10.4 递归 10.5 排序
  • 369. 10.1 链表10.1.1 链表概述 10.1.2 单向链表 10.1.3 双向链表 10.1.4 循环链表 10.1.5 编历链表
  • 370. 10.1.1 链表概述链表 是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。它可以根据需要开辟内存单元。链表有一个“头指针”变量,以head表示,它存放一个地址。该地址指向一个元素。链表中每一个元素称为“结点”,每个结点都应包括两个部分:一为用户需要用的实际数据,二为下一个结点的地址。因此,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。
  • 371. 10.1.2 单向链表单向链表 的每个结点中除信息域以外还有一个指针域,用来指出其后续结点,单向链表的最后一个结点的指针域为空(NULL)。单向链表由头指针唯一确定,因此单向链表可以用头指针的名字来命名,例如头指针名为head的单向链表称为表head,头指针指向单向链表的第一个结点。
  • 372. 10.1.2 单向链表单向链表中插入结点valuekeyvaluekeyvaluekey……parentcurrent首先,找到待插入位置的前继节点parent.然后,将待插入节点current.next指向parent.next.最后,将parent.next指向插入节点current
  • 373. 10.1.2 单向链表单向链表中删除结点节点删除过程非常简单,只需要将其前继节点的next指向待删除节点的next就可以.除非有必要,需要对删除节点作相应处理,否则等待垃圾回收处理即可valuekeyvaluekeyvaluekey……parentcurrent
  • 374. 10.1.3 双向链表每个结点中只包括一个指向下个结点的指针域,这种链表称为单向链表。如果要在单向链表一个指针所指的当前位置插入一个新结点,就必须从链表头指针开始逐个遍历直到当前指针所指结点的前一结点,修改这个结点的指针。双向链表的每个结点中包括两个指针域,分别指向该结点的前一个结点和后一个结点。在双向链表中由任何一个结点都很容易找到其前面的结点和后面的结点,而不需要在上述的插入(及删除)操作中由头结点开始寻找。
  • 375. 10.1.4循环链表单向链表的最后一个结点的指针域为空(NULL)。如果将这个指针里利用起来,以指向单向链表的第一个结点,就组成一个单向循环链表
  • 376. 10.1.5 编历链表由于链表是一个动态的数据结构,链表的各个结点由指针链接在起,访问链表元素时通过每个链表结点的指针逐个找到该结点的下一个结点,—直找到链表尾,链表的最后一个结点的指针为空。
  • 377. 10.2 堆栈10.2 .1 堆栈的概念 10.2.2 堆栈的存储方式 10.2.3 空栈的判断 10.2.4 满栈的判断
  • 378. 10.2 .1 堆栈的概念堆栈(Stack)是一种比较重要的线性数据结构,如果对数据结构知识不是很了解的话,我们可以把它简单的看作一维数组。但是对一维数组进行元素的插入、删除操作时,可以在任何位置进行,而对于栈来说,插入、删除操作是固定在一端进行的,这一端称为栈顶(top),另一端称为栈底(bottom),向栈中插入数据的操作称为压入(Push),从栈中删除数据称为弹出(Pop)。
  • 379. 10.2.2 堆栈的存储方式1. 对栈中元素的操作是按后进先出(Last In First Out,简称LIFO)的原则进行的,即最后压入的元素最先弹出。 2. 在栈的操作过程中,有一个永远指向栈顶的栈顶指针,在压入和弹出数据时,栈顶指针向上或向下移动。当栈顶指针为零时(即指向栈底的后面),栈为空栈。如果压入的数据过多超出了栈的最大空间,则发生栈上溢。
  • 380. 10.2.3 空栈的判断空栈BOTTOMtop0SIZE12BOTTOMtopSIZE0
  • 381. 10.2.3 满栈的判断满栈1234567BOTTOMSIZE12BOTTOMtopSIZE非满栈top
  • 382. 10.3 队列10.3.1 队列的概念 10.3.2 队列空的判断
  • 383. 10.3.1 队列的概念和栈相反,队列(Queue)是一种先进先出的线性表,它只允许在队列的一端删除元素,在另一端插入元素。这和日常生活中的排队是一致的,最早进入队列的元素最早离开。允许插入的一端叫做队尾,允许删除的一端称为队首。
  • 384. 10.3.2 队列空的判断无论head与end在什么位置,当head == end时,此时队列为空,否则队列非空.endhead0SIZE空队列非空队列endhead0SIZE
  • 385. 10.4 递归10.4.1 何为递归 10.4.2 递归的要点 10.4.3 递归的实例
  • 386. 10.4.1 何为递归 在程序设计中,函数直接或者间接调用其自身的方法叫做递归调用,简称递归.其设计方法被应用到很多特殊问题的解决上函数A函数B函数C
  • 387. 10.4.2 递归的要点每次递归调用都要使问题简单化 当递归达到某种程度后能够的到一个已知解以结束递归调用
  • 388. 10.4.3 递归的实例据说毕达哥拉斯理论家,又称一群在毕达哥拉斯(以毕达哥拉斯理论闻名)领导下工作的古希腊的数学家,发现了在数字序列1,3,6,10,15,21, ..(省略号说明这个序列无限地继续下去) 中有一种奇特的联系。你能知道这个序列的下一个数字是什么吗?
  • 389. 10.4.3 递归的实例 这个数列中的第n项是由第n-1项加M得到的。由此,第二项是由第一顶(1)加上2,得3。第三项是由第二项(3)加上3得到6, 依此类推。 这个序列户的数字被称为三角数字,因为它们可以被形像化地表示成对象的一个三角形排列.
  • 390. 10.4.3 递归的实例
  • 391. 以Sn代表第n项的值,有如下表示:Sn = Sn-1+n当n=1时当n>1时Sn=110.4.3 递归的实例
  • 392. 10.5 排序10.5.1 排序的概念 10.5.2 排序的实例
  • 393. 10.5 .1排序概念冒泡排序 冒泡排序组要的思想是进行相邻的两个元素之间比较并且交换.有利于利用原有元素在集合中的位置优势. 冒泡排序的原则是大的下沉小的上浮
  • 394. 46537182第一轮的排序首先比较前两个元素,如果顺序与升序相反则交换,否则什么也不作然后,依次比较第二位与第三位,第三位与第四位,…..46537182456371824653718210.5.2冒泡实例
  • 395. 10.5.2冒泡实例4536718245367182453617824536178245361728此时,第一轮排序完毕,它能够使最大数沉到最底端.然后进行第二轮的排序.每一轮排序能够确保其最大数沉到相应位置.经过元素个数减一次的排序会生成有序数组.第一轮排序结果
  • 396. 课后练习思考题 在程序中如何灵活运用链表 冒泡排序如何实现
  • 397. 小结10.1 链表 10.2 堆栈 10.3 队列 10.4 递归 10.5 排序