当前位置:首页 >> 政史地 >>

自考04747《Java语言程序设计(一)》课件


Java语言程序设计 主讲:段智敏

考试大纲
考试内容
本课程考试内容覆盖到章。其中,重点章节为第三、五、六、八章, 考核分数比例约为60%;次重点章节为第二、四、七章,考核分数比 例约为30%;一般章节为第一、九、十章,考核分数比例约为10%。

考试形式与考试题型
考试形式 考试采用闭卷笔试形式,考试时

间150分钟,满分为100分。 考试题型 考试采用的题型为:单项选择题、填空题、简答题、程序填空题、 程序分析题和程序设计题等。

2

目录
? 第一章 Java语言基础 ? 第二章 运算和语句 ? 第三章 面向对象编程基础 ? 第四章 数组和字符串 ? 第五章 图形界面设计 ? 第六章 图形界面设计 ? 第七章 图形、图像与多媒体 ? 第八章 多线程

? 第九章 输入和输出流
? 第十章 网络与数据库编程基础
3

第一章 Java语言基础
主要内容(一般掌握3%~5%)
Java语言的特点 Java应用程序和小应用程序 Java程序的开发过程 标识符和关键字 基本数据类型

考核知识点与考核要求
识记 Java应用程序与小应用程序的特点和区别 领会 Java语言的特点、关键字 简单应用 Java程序的标识符命名规则、注释、基本数据类型
4

第一章 Java语言基础
Java语言的特点
强类型 每一个变量和表达式都有确定的类型,都要进行兼容性检验。 无用内存自动回收 系统通过垃圾收集器自动收集程序不再使用的内存。 编译和解释 Java源程序运行需经过编译和解释执行两个严格区分的阶段。 与平台无关 安全性 设计的安全防范和运行安全检查。 面向对象 面向对象语言主要有封装性、继承性和多态性三个特点。 多线程 分布式计算
5

第一章 Java语言基础
Java应用程序和小应用程序
独立的桌面应用程序 银行软件、商场结算软件 面向Internet的应用程序(Applet) 网上数码商城、阿里巴巴、易趣网 相同点
由一个或多个扩展名为“.class”的文件组成 需要java虚拟机(JVM)载入并解释。

区别
Applet程序只能在与Java兼容的容器中运行,可以嵌入在HTML网页内, 在浏览器中运行。Java应用程序不支持网页嵌入和下载运行。 Applet程序运行要受到严格的安全限制,例如不能访问和使用本地计 算机上的文件。Java应用程序不受限制。 Applet程序必须定义成一个Applet类的子类,程序入口为Start()方 法。Java应用程序在类中必须定义一个main()方法作为入口。
6

第一章 Java语言基础
程序示例
Java应用程序
public class HelloWorld { public static void main(String[ ] args) { System.out.println(―欢迎进入Java世界!"); } }

Applet程序
import java.applet.*; import java.awt.*; public class HelloWorld extends Applet{ public void paint(Graphics g){ g.setColor(Color.blue);//设置显示的颜色为blue g.drawString(―欢迎进入Java世界!”,30,20); } }

7

第一章 Java语言基础
Java源文件的扩展名必须是“.java” 源文件中可以有多个类,但只能有一个public类 如果源文件中有public类,那么源文件的名字必须与这个类的名 字完全相同

关键字
public class HelloWorld{

类名与文件名 完全一样

main方法四要素 必不可少

public static void main(String[ ] args){ System.out.println("Hello World!!!"); } }

{和}一一对应,缺 一不可

main方法是 Java程序执行的 入口点

从控制台输出信息
8

第一章 Java语言基础
注释
注释是程序中的说明文字,用于帮助阅读程序,它不是语句,不会影 响程序的执行效率。Java语言的注释有三种形式: 行注释 // 在一行的注释 行注释用于简短地说明前面代码的意义或功能。注释内容至行末 结束,不能跨行。 块注释 /* 一行或多行的注释 */ 块注释是多行注释,用于说明下面程序段的算法、功能等,块注 释不可嵌套使用。 文档注释 /** 文档注释 */ 文档注释能被javadoc接受,能自动生成程序的HTML文档。

9

第一章 Java语言基础
注释示例
/* 多行注释以“/*‖开头,以 * HelloWorld.java “*/‖结尾 * @author 段智敏 * 2013年11月编写 为了美观,多行注释的每一 */ 行开头可写一个或多个* public class HelloWorld{ public static void main(String[ ] args){ 单行注释以 // 开始, //往控制台输出指定内容 以行末结束 System.out.println(“欢迎进入Java世界!”); } }

10

第一章 Java语言基础
Java程序的开发过程

11

第一章 Java语言基础
Java程序的执行过程

12

第一章 Java语言基础
开发Java程序的步骤
使用记事本编辑源程序,以.java为后缀名保存 使用javac命令编译.java文件,生成.class文件 使用java命令运行.class文件,输出程序结果

public class HelloWorld{ public static void main(String[ ] args){ System.out.println("Hello World!!!"); } }

演示示例: 使用记事本开发Java程序步骤
13

第一章 Java语言基础
标识符和关键字
Unicode字符集(65535个) 包括数字字符(0-9)、大小写英文字母(a-z和A-Z)、下划线字 符(_)、美元符号($)、文字字符(汉字、日文、朝鲜文等) 关键字 描述程序结构、声明类、定义类的成员、简单数据类型、值和变 量、异常情况处理、实例(对象)的创建和检验、流程控制等。
所有关键字均由小写字母组成 每个关键字在程序中出现有特定位置和使用方法 关键字不可以用做变量、方法、类或标号的标识符

14

第一章 Java语言基础
标识符
标识符用于命名程序对象。例如,类名、变量名、方法名等。 由英文字母、下划线字符、美元字符、文字字符和数字字符组成 标识符的第一个字符不能是数字符 标识符的长度不能超过255个字符 不能和关键字重名 大小写规范
变量名第一个单词的首字母小写,其后单词的首字母大写,其他字母 均小写。例如:myScore 方法名采用动宾结构,书写同变量名。例如:getStudentByName 类名用名词,每个单词的首字母大写。例如:Student 包名所有字母小写。例如:chapter01

15

第一章 Java语言基础
检查下面这些是否是合法的变量名

principal

$lastname

zip code

×

123rate

×

discount%

×
City

cost_price

marks_3

city

×
16

int

第一章 Java语言基础
数据类型
Java语言是强类型语言,每个变量和表达式都有确定的类型,在变量 赋值时要进行类型兼容性检验。数据类型可分为两大类: 基本数据类型(原始数据类型)
整数类型 浮点数(实数)类型 字符(文字)类型 逻辑类型(布尔型)

引用数据类型(复合数据类型)
数组 字符串 类 接口

17

第一章 Java语言基础
基本数据类型 数据类型 数据 非数值 char String

数值
2.175

非洲

整型 123

非整型 9/12/2003
陈扬

int 整型 ……

非整型

数值

The double quick brown fox …… 非数值 999

9002.12 数据属于不同类别 TRUE

18

第一章 Java语言基础
布尔型 有?true”和?false”两种取值,分别表示?真?和?假?两 种状态。 字符型 用单引号‘’括起来的一个字符,例如‘p’,‘女’。此外通 过转义字符来表示一些不能直接显示的控制字符是,如下表所示。
转义字符 功 能 转义字符 功 能

\r
\b

表示接受键盘输入,作用等同于回车键
退格,作用等同于Back Space键

\n
\f

换行
换页

\t
\ddd

水平制表,作用等同于Tab键
1~3位八进制数所代表的字符

\’
\”

单引号
双引号

\xhh

1~2位十六进制数所代表的字符

\\

一个斜杠”\”

19

第一章 Java语言基础
整型
整数表示形式:十进制、八进制、十六进制三种。 ? 十进制整数:只包含数码0~9,如32,40,-1等。 ? 八进制整数:必须以数字0开头,只包含数码0~7,如016,0255

等。 ? 十六进制整数:必须以0X或0x开头,包含0~9,A~F或a~f,如 0XD,0x19a等。
基本型:用int标识。4个字节,32位,取值范围是-231~231 -1,即2147483648~2147483647。 字节型:用byte标识。1个字节,8位,取值范围是-27~27 -1,即128~127。 短整型:用short标识。2个字节,16位,取值范围是-216~216 -1,即23768~32767 长整型:用long标识。8个字节,64位,取值范围是-264~264 -1,即923372036854775808L~923372036854775807L
20

第一章 Java语言基础
浮点数类型 浮点数类型也称实型,浮点数是带小数点或指数的数值数据。 Java语言的浮点数有单精度和双精度两种。
单精度型 用float标识,占4个字节,32位,取值-1038~1038。float型必须在实 数之后加上字母F或f。例如:23.54f,12389.987F。 双精度型 用double标识,占8个字节,64位,取值-10308~10308。double型常 是的书写的方法有两种: ? 直接写一个实数,或在实数后面加上字母D或d。例如: 123.5439、123.5439D, 123.5439d。 ? 使用科学计数法,用10的方幂表示(用字符e或E表示幂底10)

21

第一章 Java语言基础
变量的声明与使用
第一步:声明变量,即“根据数据类型在内存申请空间” 第二步:赋值,即“将数据存储至对应的内存空间” 第三步:使用变量,即“取出数据使用 ”

public class MyVariable { public static void main(String[ ] args) { int money; //1.声明一个变量 money =1000; //2.赋值
int money = 1000; //合二为一 System.out.println(money); //3.使用变量 内存空间存的数值
22

} } 数据类型

变量名

第二章 运算和语句
主要内容(次重点10%)
数据运算 语句 Java程序实例

考核知识点与考核要求
识记 常用运算符的定义、包声明语句(package)和导入语句(import) 领会 条件运算和其他运算 简单应用 阅读简单程序的功能和输出结果,编写简单的程序 综合应用 Java语言语句的书写形式和语句的语义,算术运算符、自增自减 运算符、关系运算符和逻辑运算符
23

第二章 运算和语句
算术运算
算术运算类型是数值类型的整数类型和浮点数类型。运算时,只需一 个运算分量的是单目运算,需两个运算分量的是双目运算。算术运算 的运算符是: 单目运算符:+(取正)、-(取负) ++(自增)、--(自减) 双目运算符:+(加)、-(减)、*(乘)、/(除)、%(求 余数) 说明: “/”为除法运算符,当除数和被除数均为整数类型数据时,则结 果也是整数类型数据。例如1/2的结果为0,1.0/2的结果为0.5。 “%”为求余数运算符,求余数运算所得结果的符号与被除的符 号相同。例如:5%3的结果为2,- 5%3结果为-2,5%-3的结果为2, 5.2%3.1的结果为2.1。 “++”或“--” 运算只能是变量,不能是常量或表达式。对变量 本身来说,效果是相同的,但表达式的值不相同。前缀形式是变 量运算之后的新值,后缀形式是变量运算之前的值。

24

第二章 运算和语句
赋值表达式
变量名 a = = (b 表达式; + 3) + (b – 1)

表达式

表达式

复合赋值运算
x+=5; x *=u+v; a+=a-=b+2;

表达式

常用的复合赋值运算符有:+=、-=、*=、/=、%=
//等价于x=x+5 //等价于x=x*(u+v),这里括号不能省略 //等价于a=a+(a=a-(b+2))
25

第二章 运算和语句
数据类型转换
不同类型的数据可以混合运算,但必须要转换数据类型。 自动类型转换 自动转换只能由简单类型向复杂类型转换,不能从复杂的转换成 简单的。即:byte->short->int->long->float->double 自动类型转换需要满足两个条件:转换之前和转换之后的两种类 型要兼容;转换后的要比转换前的数据类型的范围大。
double firstAvg = 81.29; //第一次平均分 double secondAvg; //第二次平均分 int rise = 2; secondAvg = firstAvg + rise;

System.out.println("第二次平均分是:" + secondAvg);
26

第二章 运算和语句
数据类型转换
不同类型的数据可以混合运算,但必须要转换数据类型。 强制类型转换
(类型名)表达式

int b = (int)10.2; double a = 10; int c = (int)a;

int before = 20; //apple笔记本市场份额 double rise = 9.8; //增长的份额 int now = before + rise; 更改为 //现在的份额

编译出错:不能完成 自动类型转换

强制类型转换

int now = before + (int)rise;
27

第二章 运算和语句
关系运算
关系运算用来表达两个表达式值的比较,运算结果是布尔型。 有六种关系运算符: <(小于)、<=(小于等于)、>(大于)、>=(大于等于)、==(等 于)、!=(不等于) 说明: <、<=、>、>=的优先级高于==、!=。 例如,表达式x>y==c<d等价于(x>y)==(c<d)。该表达式的意义是 x>y与c<d,或同时成立或同时不成立。 关系运算符的优先级低于算术运算符的优先级。 例如:x>u+v等价于x>(u+v)。 关系运算符的结合方向是自左至右。

28

第二章 运算和语句
逻辑运算
由逻辑运算符和操作数组成的表达式,要求操作数是布尔型,表达式 的结果也是布尔型逻辑运算。有3个逻辑运算符,优先级由高到低: !(逻辑否定)、&&(逻辑与)、||(逻辑或)
运算符 && || ! 名 称 运算过程 x&&y,只有x和y都为真,结果才为真 x||y,只有x和y都为假,结果才为假 !x,x为真结果是假,x为假结果是真 与、并且 或、或者 非

说明: 对表达式a&&b,当a为false时,结果为false,不必再计算b;仅当 a为true时,才需计算b。 对表达式a||b,当a为true是,结果为true,不必再计算b;仅当a 为false时,才需计算 b。
29

第二章 运算和语句
条件运算
条件运算是一个三目运算,一般形式如下:
逻辑表达式?表达式1:表达式2

条件运算的执行过程是: 计算逻辑表达式 如果逻辑表达式的值为true,则计算表达式1,并以表达式1的值 为条件运算的结果(不再计算表达式2) 如果逻辑表达式的为false,则计算表达式2,并以表达式2的值为 条件运算的结果(不计算表达式1)。

30

第二章 运算和语句
语句
语句是Java的最小执行单位,语句间以分号(;)作为分隔符。在 Java语言中,语句分为基本语句、控制结构语句以及package语句和 import语句。 其中控制结构语句包括复合语句、if语句、switch语句、循环语句和 try?catch语句。其中循环语句有while语句、do?while语句、for 语句三种。

31

第二章 运算和语句
语句
基本语句 基本语句都以分号为结束符,包括:
表达式语句 在赋值表达式、自增自减表达式和方法调用表达式之后加上分号即变成 语句,称它们是表达式语句。 空语句 空语句是只有一个分号的语句。空语句表示什么也不做的语句。引入空 语句使语句序列中连续出现多个分号不再是一种错误。 return语句 return语句只能出现在方法体中,用来结束方法的执行,将控制返回到 方法调用处。 break语句 break语句出现在switch选择结构或循环结构中,用来强制结束它所在的 控制结构,让程序从这个控制结构的后继语句继续执行。 continue语句 continue语句只能出现在循环结构中,用来提前结束循环体的执行,转 入循环条件判断。

32

第二章 运算和语句
break语句
while(…) { …… break; …… } 跳 出 整 个 循 环 break通常在循 环中与条件语 句一起使用

continue语句
while(…) { …… continue; …… } 继 续 下 一 次 循 环 for(int i = 0; i<10;i++){ 跑400米; if(!口渴){ continue; //不喝水,继续跑 } 接过水壶,喝水; }
33

示例

通常与条件语句一起 使用,加速循环

第二章 运算和语句
语句
复合语句 用花括号括住一个顺序执行的计算步骤序列描述顺序结构,这样的顺 序结构称作复合语句。复合语句中的每个计算步骤可以是单个语句, 也可以是一个控制结构,特别情况也可以为空。

34

第二章 运算和语句
语句
if语句


public class SimpleIf2 {


条件

public static void main(String[] args) { int score = 91; // Java成绩 if (score > 90) {
代码块 1 代码块 2

System.out.println("不错,奖励一个MP4!"); } else { if ( 条件 ) { if (张浩Java成绩>=90 ) { System.out.println(―惩罚干吃白饭!"); //代码块1 奖励一个MP4; 结合问题4 }else } { }else { } //代码块2 惩罚; } } }
35

第二章 运算和语句
多重if选择结构

if ( 条件 1) {


//代码块1
条件 1

}


else if ( 条件2 ) { //代码块2 代码块 1 } else { //代码块3 } }
真 代码块 2 条件 2



可以有多个

代码块 3

可以省略

36

第二章 运算和语句

int score = 70; //考试成绩 大于等于90分 if ( score >= 90 ) { System.out.println("优秀"); 大于等于80分,小于90分 } else if (score >= 80 ) { System.out.println("良好"); } else if (score >= 60 ) { 大于等于60分,小于80分 System.out.println("中等"); } else { 小于60分 System.out.println("差"); }

37

第二章 运算和语句
嵌套if结构

if(条件1) { if(条件2) {
真 代码块1 假 条件 1



} else {
条件代码块2 2

内层选择结构
代码块 3

} } else {
代码块 1

真 代码块 2

代码块3 }

38

第二章 运算和语句
外层选择结构 内层选择结构 if(score<=10){ if(gender.equals("男")){ System.out.println("进入男子组决赛!"); }else if(gender.equals("女")){ System.out.println("进入女子组决赛!"); } }else{ System.out.println("淘汰!"); }

会员积分x
x < 2000 2000 ≤ x < 4000 4000 ≤ x < 8000 x ≥ 8000


9折 8折 7折 6折



39

第二章 运算和语句
Switch选择结构
计算表达式的值

switch (表达式) { case 常量 1: 语句1; break; case 常量 2: 语句2; break; … default: 语句; }

如果等于常量1

如果等于常量2

如果没有找到匹配的值

40

第二章 运算和语句
int mingCi = 1; switch (mingCi) { 第一名的情况下 case 1: System.out.println("参加麻省理工大学组织的1个月夏令营"); break; 第二名的情况下 case 2: System.out.println("奖励惠普笔记本电脑一部"); break; 第三名的情况下 case 3: System.out.println("奖励移动硬盘一个"); break; default: 其他情况下 System.out.println("没有任何奖励 "); }

41

第二章 运算和语句
说明: int mingCi = 1;

表达式的值类型只能是char、byte、short、int类型 switch (mingCi){ case后面的常量必须各不相同 case 1: 语句序列可以没有语句,也可以是空语句或多条语句 System.out.println("参加麻省理工大学组织的1个月夏令营"); case 2: default顺序可以变动,但要注意其执行顺序。通常,default块 System.out.println("奖励惠普笔记本电脑一部"); 放在所有case后,也可以省略 case 3: 输出结果是什么? System.out.println("奖励移动硬盘一个"); default: System.out.println("没有任何奖励 "); }

42

第二章 运算和语句
public class Test1 { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.print("请输入被除数:"); int num1 = in.nextInt(); 正常情况: System.out.print("请输入除数:"); int num2 = in.nextInt(); 输入:200 40 System.out.println(String.format("%d / %d = %d", num1, num2, num1/ num2)); System.out.println("感谢使用本程序!"); } } 异常情况:

输入:B
输入:200 0
43

第二章 运算和语句

尝试通过if-else来解决异常问题,可行吗? public class Test2 { public static void main(String[] args) { Scanner in = new Scanner(System.in); … System.out.print("请输入除数:"); int num2 = 0; 如果由Java系统来堵漏洞,那程序员 if (in.hasNextInt()) { // 如果输入的除数是整数 num2 = in.nextInt(); 就轻松多了! if (0 == num2) { // 如果输入的除数是0 Java就是这么做的!异常机制 System.err.println("输入的除数是0,程序退出。"); System.exit(1); } } else { // 如果输入的除数不是整数 System.err.println("输入的除数不是整数,程序退出。"); System.exit(1); 不可行!! } 1、代码臃肿 … 2、程序员要花很大精力"堵漏洞“ } 3、程序员很难堵住所有“漏洞” }
44

第二章 运算和语句
Try?catch语句 Java的异常处理是通过5个关键字来实现的:try、catch、finally、 throw、throws。

捕获异常 执行可能产生 异常的代码 捕获异常

声明异常 throws 声明方法可能要 抛出的各种异常

抛出异常 throw

try

catch

手动抛出异常

finally

无论是否发生异常, 代码总能执行
45

第二章 运算和语句
Try?catch语句 Java的异常处理是通过5个关键字来实现的:try、catch、finally、 throw、throws。 使用try-catch块捕获异常:

发生异常 public void method(){ 产生异常对象 try try { // 代码段 catch // 产生异常(异常类型2) 与异常类型1不匹配 } catch (异常类型1 ex) { // 对异常进行处理的代码段 catch } catch (异常类型2 ex) { 与异常类型2匹配 // 对异常进行处理的代码段 catch } catch (异常类型3 ex) { // 对异常进行处理的代码段程序继续执行 }finally{ // 代码段 try-catch 块后的代码段 } }

46

第二章 运算和语句
常见的异常类型
方 法 名 说 明

Exception ArithmeticException ArrayIndexOutOfBoundsExc eption NullPointerException ClassNotFoundException InputMismatchException IllegalArgumentException ClassCastException NumberFormatException

异常层次结构的根类 算术错误情形,如以零作除数 数组下标越界 尝试访问 null 对象成员 不能加载所需的类 欲得到数据类型与实际输入类型不匹配 方法接收到非法参数 对象强制类型转换出错 数字格式转换异常,如把"abc"转换成数字
47

第二章 运算和语句
public class Test3{ 第一种情况: public static void main(String[] args) { 无异常 try { Scanner in = new Scanner(System.in); 输入:200 40 System.out.print("请输入被除数:"); int num1 = in.nextInt(); 第二种情况: System.out.print("请输入除数:"); 有异常 int num2 = in.nextInt(); System.out.println(String.format("%d / %d = %d", num1, num2, num1/ num2)); 输入:200 0 } catch (ArithmeticException e) { System.err.println("除数不能为零。"); } catch (Exception e) { System.err.println("其他未知异常。"); } finally { System.out.println("感谢使用本程序!"); } } }

48

第二章 运算和语句
while语句
System.out.println("第1遍写:好好学习,天天向上!"); System.out.println(―第2遍写:好好学习,天天向上!"); System.out.println("第3遍写:好好学习,天天向上!"); System.out.println(―第4遍写:好好学习,天天向上!"); …… System.out.println(―第9999遍写:好好学习,天天向上! int i = 1; "); while ( i i<=10000 ){ <= 100 System.out.println(―第10000遍写:好好学习,天天向上! "); System.out.println(―第‖ +i+ ―遍写: 好好学习,天天向上!"); i ++; }

演示示例:使用循环结构解决问题
49

第二章 运算和语句
while语句执行过程:
循环条件




循环操作
符合条件,循环继续执 行;否则,循环退出 while ( 循环条件 ) { 循环操作 } 循环中被重复 执行的操作 int i = 1; while ( i <= 100 ) { System.out.println("好好学习!"); i ++; }

演示示例:计算100以内的偶数之和
50

第二章 运算和语句
do-while语句
先执行一遍循环操作 do {

循环操作
循环操作 } while ( 循环条件 );

分号不可少

真 循环条件
符合条件,循环继续执行; 否则,循环退出



String name ; Scanner input = new Scanner(System.in); do{ System.out.print("请输入学生姓名:"); name = input.next(); }while ( !name.equals("q") ); System.out.println("程序结束");
51

第二章 运算和语句
while循环和do-while循环的区别
语法不同 while ( 循环条件 ) { 循环操作 } 先判断,再执行 do { 先执行,再判断 循环操作 } while( 循环条件 ) ;

执行次序不同 初始情况不满足循环条件时 ? while循环一次都不会执行 ? do-while循环不管任何情况都至少执行一次

52

第二章 运算和语句
for语句

1 for( 参数初始化 表达式1

3 }

2 条件为true 条件判断 ; 表达式2 ; 循环操作 ; 循环体被执行

4 更新循环变量 表达式3

){

for ( int i = 0 ;

i < 100 ;

i++ ) {

int i=0;
while(i<100){ System.out.println("好好学习!");

System.out.println("好好学习!"); } 使用for循环结构 使用while循环结构

i++; }

演示示例: 求1~100之间不能被3整除的数之和 for比while更简洁
53

第二章 运算和语句
循环比较
无论哪种循环结构,都有4个必不可少的部分:初始部分、循环条件、循环体、迭代部分

区别1:语法
while 循环: while(<条件>){ //循环体 } do-while 循环: do{ //循环体 } while(<条件>); for 循环: for(初始化;条件;迭代){ //循环体 }

区别2:执行顺序
while 循环:先判断,再执行 do-while循环:先执行,再判断 for循环:先判断,再执行

区别3:适用情况
循环次数确定的情况,通常选用for循环 循环次数不确定的情况,通常选用while和do-while循环

54

第二章 运算和语句
循环嵌套
外层循环 while(循环条件1){ //循环操作1 while(循环条件2){ //循环操作2 } } 内层循环 do{ //循环操作1 do{ //循环操作2 }while(循环条件1); }while(循环条件2); 各种循环可以 相互嵌套

for(循环条件1){ //循环操作1 for(循环条件2){ //循环操作2 } }

while(循环条件1){ //循环操作1 for(循环条件2){ //循环操作2 } }

外层循环变量变化一次,内层循环变量要变化一遍

55

第二章 运算和语句

public class RTriAngle { public static void main(String[] args) { int rows = 3; //三角形行数 System.out.println("打印直角三角形"); for(int i = 0; i < rows; i++){ //打印第i行 for(int j = 1; j <= rows-i; j++){ System.out.print(" "); } for(int k = 1; k <= 2*i-1; k++){ System.out.print("*"); } 内层循环控制打印*数目 System.out.print("\n"); //换行 } } 外层循环控制行数 } 演示示例:使用二重循环打印等腰三角形
56

第二章 运算和语句
public class MulTable { public static void main(String[] args) { int rows = 9; //乘法表的行数 for(int i = 1; i<=rows; i++){ for(int j = 1; j <= i; j++){ } System.out.print("\n"); //打印完一行后换行 } } //一共9行 //第i行有i个式子

System.out.print(j+"*"+i+"="+j*i+" ");

}

外层循环控制行数

演示示例:打印九九乘法表

57

第二章 运算和语句
package语句
package 包名;

package语句必须出现在源程序文件的起始行,表示出现在该文件中 的所有类都属于这个程序包。包名是一个目录名,其中也可以有路径。 如果源程序文件的首行没有package语句,则被默认为是无名包,存 于当前目录中。 import语句
import 包名.类名; import 语句用于引入所需要的类。 如果要从一个包中引入多个类,则可以用通配符“* ”。 可以有多个import语句,必须出现在package之后,类的定义之前。

58

第二章 运算和语句
Java应用程序的基本结构
java程序由类和对象构成 类由方法和变量等成员构成 方法由语句构成 语句由标识符和运算符构成
[package 包名;] import 包名.类名; … [public] class类名{ [public] int val= …; public static void main(String args[]) { int val=…; … } }
59

第三章 面向对象编程基础
主要内容(重点15%)
面向对象的基本概念 Java的类和对象 接口 基本类 Java小应用程序基础

考核知识点与考核要求
识记:类的内存模型,final、abstract、super、this的用法, Applet程序结构和执行过程。 领会:抽象、对象、消息、类、继承、封装、接口、多态等面向 对象的基本概念。 简单应用:访问权限的设置,Applet类的init()、strart()、 stop()、destroy()、paint()、repaint()等方法。 综合应用:类的声明、成员变量(实例变量、类变量)和方法 (实例方法、类方法)、构造方法、方法重载,对象的声明、创 建和使用,接口的声明和使用。

60

第三章 面向对象编程基础
面向对象的基本概念
程序设计语言发展经历了面向机器、面向过程和面向对象3个阶段。 面向机器阶段用机器指令,即机器语言,或用助记符代替机器指 令的汇编语言编写程序。 编程模式: 程序=数据+指令 面向过程阶段使用高级程序设计语言编程,有代表性的语言有 FORTRAN、PASCAL、C、COBOL等。 编程模式: 程序=数据结构+算法 面向对象阶段面向对象编程语言有Smalltalk、C++、Java等。 编程模式: 程序=对象+消息

61

第三章 面向对象编程基础
面向对象程序设计语言引入许多概念和机制,包括抽象、对象、消息、 类、继承、多态性等。
抽象(abstraction) 在面向对象阶段,利用抽象按类设计。类是支持抽象的最好工具。 对象 现实世界中的对象都有状态、行为和名称。对象的名称用于程序引用对象, 对象的成员变量用于存储对象的状态信息,对象的方法用于描述对象的行 为。 消息(Message) 对象之间的的交互通过相互发送消息实现。当对象A希望对象B执行B的 一个方法时,用对象A发送消息给对象B来实现。 类 同一类对象的所有共同的属性和行为放在一起描述,这种声明对象共有属 性和行为的机制称为类,类是对一组相同对象的描述。 类概括了同类对象的共有性质:属性(状态)和方法(行为)。类的每个 对象都有自己的标识,但它们具有相同的一组属性和提供相同的一组方法。
62

第三章 面向对象编程基础
继承(Inheritance) 继承是在已有类基础上,扩充属性,或扩充与改写其某些方法,生 成新的类,这个方式称为继承。继承体现了面向对象方法与现实世 界中人们的抽象思维方式保持一致。 继承定义的类称为子类,被继承的类称为超类(父类),继承具有 传递性。子类具有父类的属性和方法,还可增加某些特殊性,并可 扩充和修正部分行为。 多态性(Polymorphism) 多态性是指类型适应性多态性,同一继承层次的对象对父类的方法 类型适应性的多态性需要采用动态联编(Dynamic Binding)技术 实现。动态联编是面向对象语言必须具有的一种能力,是实现上述 多态性的技术基础。 联编 联编是将发送给对象的消息与含执行该消息方法的对象连接起来。 当联编在编译和连接阶段实现时,这样的联编过程称为静态联编; 当联编推迟至运行时间实现时,该联编过程称为动态联编。
63

第三章 面向对象编程基础
Java的类和对象
具有相同属性和方法的一组对象的集合。 类是对象的抽象;对象是客观世界存在的事或物。 所有Java程序都以类为组织单元,使用关键字class定义

public class HelloWorld { public static void main(String[] args){ System.out.println("Hello World!!!"); } }

64

第三章 面向对象编程基础
类的声明
public class public class Student {类名 { 成员变量 //定义成员变量部分 String name; //姓名 成员变量1的类型 属性1; int age; //年龄 成员变量2的类型 属性2; String classNo; //班级 String hobby; … //爱好 创建对象 public class InitialStudent { 成员变量n的类型 属性n; 成员方法 //输出信息方法 public static void main(String args[]){ public void show(){ Student //定义方法部分 Student(); student = new System.out.println(name + "\n年龄:" + 给每个属性赋值 age + "\n就读于:" + student.name"\n爱好:" + hobby); = "张浩"; 方法1; classNo + student.age = 10; 方法2; } student.classNo = "S1班"; … 调用方法 } student.hobby = "篮球"; 方法m; }student.show(); } }
演示示例:创建类和使用对象
65

第三章 面向对象编程基础
成员变量 成员变量定义的一般形式如下:
[修饰字] 类型 变量名; 修饰字可以空缺,修饰字用于对成员变量限制其访问权限,成员的访 问权限有4种:private、protected、public和friendly(缺省)。 变量的类型可以是任何数据类型,变量的名字是一个标识符。 类的方法中也可定义变量,这种变量称为局部变量,局部变量只在定 义它的方法中有效。 public class A { 问题:如果要给成员变量x int x=0; 赋值为2,怎么办? void f1(){ int a=1; x=a; } void f2(){ int x; x=2; this.x=2; } }

66

第三章 面向对象编程基础
谁能使用这些变量?
public class A { 成员变量 A类的方法, 其他类的方法

变量1类型 变量1; 变量2类型 变量2; 变量3类型 变量3;

public 返回类型 方法1(){ 变量4类型 变量4; } public 返回类型 方法2(){ 变量5类型 变量5; }

局部变量 方法1 局部变量 方法2

}
67

第三章 面向对象编程基础
方法
类的方法定义 public 返回值类型 方法名(数据类型 参数名) { //这里编写方法的主体 步骤二:编写方法体 } ? 方法不能嵌套定义。 ? 如果方法具有返回值,方法中必须使用关键字return返回该数据 步骤一:定义方 法名以及返回值

类型。 ? 如果方法无返回值,“返回值类型”用void关键字表示。 ? 一个方法只能执行一次return语句,且只能返回一个值。 ? 方法可以没有参数,多个参数用逗号分隔,参数类型可以是任何 数据类型。

68

第三章 面向对象编程基础
方法
类的方法定义 方法的调用 对象名.方法名(); public class AutoLion { public class TestLion { String color = "黄色"; //颜色 public static void main(String[ ] args) { public void run(){ AutoLion lion = new AutoLion(); System.out.println("以0.1米/秒的速度向前奔跑。"); System.out.println(lion.showLion()); } lion.run(); public String bark(){ System.out.println(lion.bark()); String sound = "大声吼叫" ; } return sound; } } 在main()方法中 public String getColor(){ 调用类的方法 return color; 在类的方法中调用 } 该类另一个方法 public String showLion(){ return "这是一个" + getColor() + "的玩具狮子!"; } } 演示示例:方法调用

69

第三章 面向对象编程基础
方法
类的方法定义 方法的调用 调用说明 1、类A的方法a()调用类A的方 法b(),直接调用 public void a(){ this.b(); } 举 例 //调用b()

2、类A的方法a()调用类B的方 法b(),先创建类对象,然后 使用“.”调用

public void a(){ B t = new B(); t.b(); //调用B类的b() } public static void b(){} public void a(){ B.b(); } //定义b方法

3、类A的方法a()直接调用类B 的方法b()

70

第三章 面向对象编程基础
方法
类的方法定义 方法的调用 方法的参数 形式参数列表: (数据类型 参数1,数据类型 参数2?)

public class 榨汁机{ public String 榨汁 ( String 水果 ) { String 果汁 = 水果 + “汁”; //榨汁过程 return 果汁; } } 调用带参方法,传递的参 /*调用榨汁方法*/ 数要与参数列表一一对应 榨汁机 myZhazhi = new 榨汁机(); String 水果= "苹果"; String 果汁 = myZhazhi.榨汁(水果); System.out.println(“我有”+果汁+“喝了”);
71

第三章 面向对象编程基础
方法
类的方法定义 方法的调用 方法的参数 方法的重载 方法重载是指在一个类中定义多个相同名字的方法,调用重载方法时, 编译器将根据方法调用时的参数个数和参数类型及顺序确定调用的是 哪一个方法。 重载方法必须满足以下条件: ? 方法名相同 ? 方法的参数类型、个数、顺序至少有一项不相同 ? 方法的返回类型可以不相同 ? 方法的修饰符可以不相同。

72

第三章 面向对象编程基础
方法
类的方法定义 方法的调用 方法的参数 方法的重载

Math

方 法 重 载

max(int a,int b) max(float a,float b) max(long a,long b) max(double a,double b)

public class Test { public static void main(String[ ] args) { Math.max(1,2); Math.max(1.0F,2.F); Math.max(1.0,2); } }
73

演示示例:方法重载的使用

第三章 面向对象编程基础
构造方法 构造方法的作用是创建类的对象,并给对象初始化。构造方法必 须满足以下语法规则:
方法名必须与类名相同 没有返回类型 使用new关键字调用构造方法 构造方法是公共方法,但程序不能显式调用构造方法。程序运行时, 当有对象要创建时,由系统自动调用构造方法。

×

74

第三章 面向对象编程基础
public class Teacher { public String name; // 姓名 public int age; // 年龄 public String education; // 学历

}

public String introduction() { return "大家好!我是" + name + ",我今年” + age + "岁,学历" +education; public class Test { } public static void main(String[ ] args) { Teacher teacher = new Teacher(); teacher.name(―杜子藤"); teacher.age(23); System.out.println(teacher.introduction()); } } 大家好!我是杜子藤,我今年23岁,学历null 要简化对象初始化的代码,可以通过构造方法来解决

Teacher中的属性在初始 化时,忘记赋值,能简化 对象初始化的代码?

75

第三章 面向对象编程基础
public class Teacher { public String name; // 教员姓名 可以增加对age等属性的 public int age; // 年龄 存取限制条件: public String education; // 学历 if(age>18){ // 默认构造方法 this.age=age; public Teacher() { } this.name = ― 无名氏"; else{ this.age = 18; this.age=18; this.education = ―本科 "; } } //构造方法重载 public Teacher (String name,int age,String education) { this.name = name; this.age = age; this.education = education; } public String introduction() { return "大家好!我是" + name + ",今年" + age + ",学历" + education; } }
76

第三章 面向对象编程基础
public class Test { public static void main(String[] args) { Teacher teacher = new Teacher(); System.out.println(teacher.introduction()); teacher = new Teacher("杜子藤",23, "本科"); System.out.println(teacher.introduction()); } 创建对象时,一并完成对 } 象成员的初始化工作 大家好!我是无名氏,今年18岁,学历本科 大家好!我是杜子藤,今年23岁,学历本科

77

public class Sample { private int x; public Sample() { x = 1; } public Sample(int i) { x = i; } public int Sample(int i) { x = i; return x++; } private Sample(int i, String s){} public Sample(String s,int i){}

第三章 面向对象编程基础
无参构造方法 带参构造方法 不是构造方法

带参构造方法 带参构造方法 名称与类名不相同 不是构造方法

private Sampla(int i){ x=i++; } private void Sampla(int i){ x=i++; }
}

78

第三章 面向对象编程基础
对象 类被声明后,就可用类创建对象,被创建的对象称为类的实例。 程序使用对象需依次经历4个步骤:声明对象、创建对象、使用对 象和撤销对象。
声明对象 类名 对象名; 类属于引用类型,声明对象实质只是命名一个变量来?引用?类的对 象。暂未为对象分配内存。 创建对象

对象名 = new 构造方法([参数表]) ; 创建对象就是为对象分配内存,为对象分配内存也称为类的实例化。 Teacher teacher = new Teacher();
79

第三章 面向对象编程基础
使用对象 程序通过操作符?.”对某对象的成员变量进行访问和方法调用。 引用类的属性:对象名.成员变量; 引用类的方法:对象名.方法名([参数列表]);

创建对象 public class Test { public static void main(String args[]){ Student student = new Student(); 给每个属性赋值 student.name = "张浩"; student.age = 10; student.classNo = "S1班"; 调用方法 student.hobby = "篮球"; student.show(); } }

80

第三章 面向对象编程基础
实例变量和类变量 类的成员变量分为实例变量和类变量。 在定义成员变量时,用关键字static 修饰的是类变量;定义时未 用static修饰的是实例变量。 引用类变量途径有两条,或通过类,或通过对象。
类名.类变量名 或 对象名.类变量名

实例方法和类方法 类的方法分为实例方法和类方法。在方法定义时,以修饰字 static的方法称为类方法;未用static修饰字的方法是实例方法。
类方法可以相互调用,但不能直接调用实例方法 类方法能直接引用类变量,不能引用实例变量 实例方法可以互相调用,并可调用类方法 实例方法可引用实例变量,也可引用类变量 类之间的类方法通过类名可直接调用,实例方法必须通过对象调用
81

第三章 面向对象编程基础
访问权限 访问修饰符
private 默认(default) protected public

本类
√ √ √ √

同包
√ √ √

子类

其他

√ √ √

82

第三章 面向对象编程基础
public class JavaTeacher { public class DotNetTeacher { private String name; // 教员姓名 private String name; // 教员姓名 private String school; // 所在中心 private String school; // 所在中心 public JavaTeacher(String myName, public DotNetTeacher(String myName, String mySchool) { String mySchool) { name = myName; name = myName; school = mySchool; school = mySchool; } } public void giveLession(){ public void giveLession(){ System.out.println("启动 Eclipse"); System.out.println("启动 Visual System.out.println("知识点讲解"); Studio 2005"); System.out.println("知识点讲解"); System.out.println("总结提问"); } System.out.println("总结提问"); public void introduction() { } System.out.println("大家好!我是" public void introduction() { System.out.println("大家好!我是" + school + "的" + name + "."); + school + "的" + name + "."); } } } } 代码存在重复,违背了“write once, only once‖的原则

83

第三章 面向对象编程基础
如何改进?有没有可能建立继承关系,让子类自动继承父 类的属性和方法?
Java教员是教员吗? .NET教员是教员吗? 教员 姓名 所在中心 授课 自我介绍 public class Teacher { private String name; // 教员姓名 private String school; // 所在中心 public Teacher(String myName, 属 String mySchool) { 性 name = myName; 行 school = mySchool; 为 } public void giveLesson(){ System.out.println("知识点讲解"); System.out.println("总结提问"); } public void introduction() { System.out.println("大家好!我是 “ + school + "的" + name + "。"); }所有子类中相同的代码都抽取到父类中 } 84

Java教员

.NET教员

第三章 面向对象编程基础
public class JavaTeacher2 extends Teacher { public JavaTeacher2(String myName, String mySchool) { super(myName, mySchool); 子类自动继承父类的属 } 性和方法,子类中不再 public void giveLesson(){ 存在重复代码 System.out.println("启动 Eclipse"); super.giveLesson(); } } public class DotNetTeacher2 extends Teacher { public DotNetTeacher2(String myName, String mySchool) { super(myName, mySchool); } public void giveLesson(){ System.out.println("启动 Visual Studio .NET"); super.giveLesson(); } } 使用继承,可以有效实现代码复用
85

第三章 面向对象编程基础
继承
单根性 Java语言不支持多重继承,限定一个类只能有一个超类。在子类声明 中加入extends子句来指定超类。 可继承性 所有的Java类都直接或间接地继承java.lang.Object类。类声明时, 如果缺省extends子句,则该类的超类是系统声明的Object类。 子类可以继承其父类的不是private的成员变量和方法。 子类可重写父类方法 方法重写:子类和父类的方法具有相同的名称、参数列表、返回类 型 ,同时不能不能缩小方法的访问权限。 父类方法被子类方法重写后,只能通过super.方法名()调用。 传递性 父类属性 构造方法的调用顺序与类的继承顺序一致。 父类构造方法
子类属性 子类构造方法 86

第三章 面向对象编程基础
大家好!我是北京的李明. public class HQ { 启动 Eclipse public void judge(JavaTeacher t){ 知识点讲解 t.introduction(); 总结提问 t.giveLesson(); } 大家好!我是天津的张明. public void judge(DotNetTeacher t){ 启动 VS2005 t.introduction(); 知识点讲解 t.giveLesson(); 总结提问 } public static void main(String[] args) { HQ hq = new HQ(); hq.judge(new JavaTeacher("李明","北京“)); hq.judge(new DotNetTeacher("张明","天津“)); 控制台输出 } } 每增加一种新的教员类型,都要修改教务处类,增加相应 的judge(评估)方法,代码的可扩展性及可维护性极差

87

第三章 面向对象编程基础
多态
public class HQ3 { public void judge(Teacher t){ t.introduction(); t.giveLesson(); 根据实际创建的对象 } 类型调用相应方法 可以接收子类类型 大家好!我是北京的李明. 启动 Eclipse 知识点讲解 总结提问

}

大家好!我是天津的张明. 启动 Visual Studio 2005 public static void main(String[] args) { 知识点讲解 HQ3 hq = new HQ3(); 总结提问 hq.judge(new JavaTeacher2("李明","北京“)); hq.judge(new DotNetTeacher2("张明","天津")); 大家好!我是北京的李岚. hq.judge(new DBTeacher(―李岚","北京“)); 启动 Sql Server } 知识点讲解 控制台输出 总结提问 使用多态之后,当需要增加新的子类类型时,无 需更改总部类,程序的可扩展性及可维护性增强
88

第三章 面向对象编程基础

载客量是4人 class Car { 载客量是20人 private int site = 4; //座位数 Car(){ System.out.println ("载客量是"+site+"人); } class Bus extends Car { public void setSite(int site){ Bus(int site){ this.site = site; setSite(site); } } void print(){ } System.out.print("载客量是"+site+"人"); } public static void main(String[] args) { } Bus bus = new Bus(20); bus.print(); }
89

第三章 面向对象编程基础

class Base { public String name; public Base(){ name = "Base"; } public Base(String pName){ name = pName; } public void method(){ System.out.println(name); } }

class Child extends Base{ public Child(){ super("Child1"); name="Child2"; } }

2

1

public class Sample { public static void main(String[ ] args) { Child c = new Child(); c.method(); } 3 }

控制台输出

Child2
90

第三章 面向对象编程基础

public class Teacher { 1 public void giveLesson(){ System.out.println("知识点讲解"); } } public class DBTeacher extends Teacher { public void giveLesson(){ System.out.println("启动 SqlServer"); } } public class Test {

2

public static void main(String[] args) { Teacher t = new DBTeacher (); t.giveLesson(); } }
控制台输出

启动 SqlServer
91

第三章 面向对象编程基础
public class Teacher { 1 public Teacher(String x){ System.out.println(―父类"); } public void giveLesson(){ System.out.println("知识点讲解"); } } public class DBTeacher extends Teacher { public void giveLesson(){ System.out.println("启动 SqlServer"); } } public class Test {

2

}
控制台输出

public static void main(String[] args) { Teacher t = new DBTeacher (); t.giveLesson(); }

No constructor matching Teacher() found in class Teacher
92

第三章 面向对象编程基础
Java面向对象的其他机制
final类、final方法和final变量 ? final类不能被继承,即它不能再有子类 ? final修饰的变量,声明该变量的值不能被改变。相当于一个常

量,习惯全部用大写字母命名。
abstract类和abstract方法 ? abstract类称为抽象类。抽象类只声明一种模板,没有具体实现

代码的类。只有它的子类才能是有实际意义的类。所以抽象类不 可有实例。即不能用抽象类声明或创建对象。 ? abstract方法称为抽象方法。抽象方法只能出现在抽象类中,抽 象方法没有实现代码,即方法体。如果一个类是抽象类的子类, 则必须具体实现超类的抽象方法。 ? 抽象类可以没有抽象方法,但有抽象方法的类一定是抽象类。
public abstract class Food{ //这是一个抽象类,加了abstract关键字 public abstract void cook();//抽象方法没有方法体,让子类来运行 }
93

第三章 面向对象编程基础
Java面向对象的其他机制
super 子类隐藏了超类的成员变量或者覆盖了超类方法后,利用关键字 super,子类方法可以引用超类的成员变量和被覆盖的方法。 ? 访问父类属性 super代表 super.属性; 父类对象 ? 访问父类方法 super.方法名(); ? 访问父类构造方法 super(); this 关键字this用来指对象自己。 ? 将对象自己作为参数,调用别的方法 ? 当方法的局部变量隐藏成员变量时,利用this引用成员变量 ? 在构造函数内调用另一构造函数等
94

括号对应不同构 造方法参数

第三章 面向对象编程基础
接口
接口给出某种特定功能的一组方法的规范,方法定义是一种方法声明, 不提供方法的实现(没有方法体),方法的实现要在实现这个接口的类 中完成,故称使用接口的类为接口的实现。 接口可以定义常量和方法,但不能提供方法的实现代码。可以将接口 想象为一个?纯?抽象类。 Java语言虽不允许一个类继承多个类,但允许一个类实现多个接口。
[public] interface 接口名{ 接口体 }

接口可以用public修饰,即能被所有的类和接口使用;而缺省的接口 只能被同一个包中的其他类和接口使用。

95

第三章 面向对象编程基础
interface PCI { int MAX=100; void start(); void stop(); }

接口的所有变量都默认为final static属性;所有的方法都默认为是 public abstract属性。 一个类通过使用关键字implements声明使用一个或多个接口。实现多 个接口时,接口名之间用逗号隔开。 如果一个类要实现某个接口,那么这个类必须实现该接口的所有方法, 为这些方法实现的方法体。在实现接口的方法时,方法的名字、返回 值类型、参数个数及类型必须与接口中的定义的方法完全一致,并一 定要用public修饰。如果接口的方法的返回值类型不是void,那么在 实现该方法的体中至少要有一个return语句;如果方法不返回值,则 为void类型,类体除了两个大括号外,可以没有任何语句。
96

第三章 面向对象编程基础
Java小应用程序基础
Java小应用程序即Java Applet,是嵌入在Web面上供浏览器运行的 程序,可放在服务器上供客户端下载使用。小应用程序的主要功能 是显示图形、动画、播放声音、响应用户事件等。 小应用程序都继承Applet类,必须使用import java.applet.Applet 导入系统的Applet类。
import java.applet.Applet public class 主类名 extends Applet

不能调用本地的应用程序和运行时的动态连接库 不能访问本地文件,如读、写文件 除原小应用程序所在的位置(站点)外,不能再做网络连接与WWW建立 联系 不能获得任何有关系统设置的信息

97

第三章 面向对象编程基础
Applet类的基本方法
装入 init() 初始态 start() 运行态 从图标恢复,重新装入此页 start() 图标化,IE装入另一页 stop() 停止态 浏览器关闭 destroy()

init()方法 消亡态 进行必要的初始化工作,该方法只运行一次。 创建所需要的对象、设置初始状态、装载图像、设置参数等。 start()方法 用以启动Applet,页面每加载一次,start()方法将被调用一次。 stop()方法 关闭浏览器,自动调用stop()方法,以关闭Applet。 destroy()方法 stop()执行完毕,系统调用destroy()方法,释放Applet所使用资源。

98

第三章 面向对象编程基础
//Example.java public class Example extends JApplet { public void init() { getContentPane().add(new JLabel("Hello Java Applet!")); System.out.print("执行init()方法\n"); } public void start(){ System.out.print("执行start()方法\n"); } public void stop(){ System.out.print("执行stop()方法\n"); } *编写嵌入Applet的HTML文件 public void destroy(){ <html> System.out.print("执行destroy()方法\n"); <body> } <applet code= Example.class public void paint(Graphics g){ width="200" height="200" > </applet> g.drawString(―Welcome to Java!", 100, 200); </body> } </html> } 演示示例:Applet程序方法调用
99

第四章 数组和字符串
本章内容(10%)
数组 字符串

考核知识点与考核要求
简单应用:非平衡的多维数组的创建,StringTokenizer类的用法, 字符串与字节数组之间的转换,对象的字符串表示 综合应用:一维数组、二维数组、字符串的声明和创建,字符串 与基本数据类型之间的转换

100

第四章 数组和字符串
数组
数组是将一组相同类型的数据顺序存储,组成一种复合数据类型。 数组的特点
一个数组中的所有元素的数据类型相同 数组中的元素连续顺序存储 数组中每个元素按存储顺序对应一个下标,引用数组元素通过数组名 和它的下标确定。下标从0开始顺序编号到数组名.length-1。

数组有一维数组和多维数组之分,数组元素的下标个数确定数组 的维数。 购物类别 标识符 数组的结构和基本要素
标识符:数组的名称 数组元素:向数组中存放的数据 元素下标:对数组元素进行编号 元素类型:数组元素的数据类型
代购物品 数组元素

物品编号

元素下标

物品类型

元素类型

101

第四章 数组和字符串
下列哪组数据能存储在数组中?数组的类型是什么?
“刘星”,“夏雨”,“夏雪”
String型

8,98,“c”,23 98.1,341.2,34.3

double型

数组中的所有元素必须属于相同的数据类型
102

第四章 数组和字符串
使用数组四步走:
声明数组 分配空间 赋值 处理数据
int[ ] a; a = new int[5]; a [0] = 8; a [0] = a[0] * 10; a[0] 80 a

103

第四章 数组和字符串
1 声明数组: 告诉计算机数据类型是什么
数据类型 数据类型[ ] int[ ] score1; int score2[ ]; String[ ] name; 数组名[ ] ; 数组名 ; //Java成绩 //C#成绩 //学生姓名 声明数组时不规 定数组长度

2 分配空间: 告诉计算机分配几个连续的空间
score = new int[30]; avgAge = new int[6]; name = new String[30];

声明数组并分配空间
数据类型[ ] 数组名 = new 数据类型[大小] ;
104

第四章 数组和字符串
3 赋值:向分配的格子里放数据
方法1:直接赋值 score[0] score[1] score[2] 89 79 76 30 不能指定数组长 度

score[0] = 89; score[1] = 79; score[2] = 76; ……
方法2: 边声明边赋值 int[ ] score = {89, 79, 76};

int[ ] score = new int[ ]{89, 79, 76}; 方法3:动态地从键盘录入信息并赋值 Scanner input = new Scanner(System.in); for(int i = 0; i < 30; i ++){ score[i] = input.nextInt(); }
105

第四章 数组和字符串
4 对数据进行处理:计算5位学生的平均分
int [ ] score = {60, 80, 90, 70, 85}; double avg; avg = (score[0] + score[1] + score[2] + score[3] + score[4])/5; int [ ] score = {60, 80, 90, 70, 85}; int sum = 0; double avg; for(int i = 0; i < score.length; i++){ 访问数组成员:使 用“标识符[下标]‖

数组的length属性
成 绩 单

60 80 90

sum = sum + score[i];
} avg = sum / score.length; 访问成员

70
85
106

第四章 数组和字符串

public class ErrorDemo1 { public static void main(String[ ] args){ int[ ] score = new int[ ]; score[0] = 89;

score[1] = 63;
System.out.println(score[0]); } }

编译出错,没有写明数 组的大小

107

第四章 数组和字符串

public class ErrorDemo2 { public static void main(String[ ] args) { int[ ] scores = new int[2]; 编译出错,数组 scores[0] = 90; 越界 scores[1] = 85;

scores[2] = 65;
System.out.println(scores[2]); } }

108

第四章 数组和字符串

public static void main(String[ ] args){ int[ ] score = new int[5]; score = {60, 80, 90, 70, 85}; 编译出错,创建数组并 赋值的方式必须在一条 语句中完成

int[ ] score2; score2 = {60, 80, 90, 70, 85}; }

109

第四章 数组和字符串
基本数据类型
int heightZhang = 170; int heightLi = heightZhang; System.out.println("去年--张浩的身高是:" + heightZhang + ", 李明的身高是:" + heightLi); heightLi = 180; System.out.println("今年--张浩的身高是:" + heightZhang + ", 李明的身高是:" + heightLi); 不同的变量会分配不 同的存储空间

heightZhang
heightLi

170 180 170

改变一个变量值不会 影响另一个变量值
110

第四章 数组和字符串
引用数据类型
int[ ] infoZhang = new int[ ]{170,60};

int[ ] infoLi = infoZhang;


infoLi[0] = 180; infoLi[1] = 70;


//今年李明的身高变为180 //今年李明的体重变为70 对引用数据类型,赋值是把原对象 的引用传递给另一个引用,两个引 用指向同一块内存空间

infoZhang

0x2a486c 0x2a486c

180 170 70 60
111

infoLi

第四章 数组和字符串
int[ ] infoZhang = new int[ ]{170,60};

int[ ] infoLi = new int[2];
for(int i = 0; i < infoZhang.length; i++){ infoLi[i] = infoZhang[i]; }


数组元素有默认值

infoLi[0] = 180; infoLi[1] = 70;


//今年李明的身高变为180 //今年李明的体重变为70

infoZhang infoLi

0x2a486c 0x2a679d

170 60 170 0 180 60 0 70
112

第四章 数组和字符串
多维数组
数组元素有多个下标的数组就是多维数组。多维数组是一种数组的数 组,例如,当数组的元素又是一维数组时,就是一个二维数组。在 Java程序中,可以有三维数组,或四维数组等。 声明二维数组 声明二维数组的一般形式有以下3种:
数据类型 数组名 [ ][ ] 数据类型 [ ][ ] 数组名 数据类型 [ ] 数组名 [ ]

113

第四章 数组和字符串
创建二维数组
直接分配(平衡二维数组――矩阵) 数据类型 数组名[][]=new 数据类型[长度1][长度2]

例如,创建一个3行3列的矩阵: int myTowArray[][]= new int[3][3];
从最高维开始,分别对每一维分配不等长的空间(非平衡数组)。 依次对每个子数组确定元素个数,并创建子数组。 int a[][] = new int[3]; a[0]= new int [4]; a[1]=new int[5]; a[2]=new int[2];

直接赋值创建 声明二维数组,同时直接给出各子数组的元素。如果子数组的元素个 数不同,则创建的是一个非平衡的二维数组。 int [][]x = {{5,6,7},{8,9,10,11},{18,19,20,15},{2,9}};
114

第四章 数组和字符串
引用二维数组 二维数组元素的引用方式是:
数组名[下标1][下标2]

使用二维数组要注意的问题 对于二维数组,要注意以下两点:
二维数组名,length和二维数组名[下标1].length的区别。二维数组 名.length是二维数组的子数组个数;二维数组名[下标1].length是指 定子数组的元素个数。 二维数组名[下标]是一维数组。

115

第四章 数组和字符串
字符串
Java语言提供两个用于处理字符串的类: String类用于处理不可变的字符串 StringBuffer类用于处理可改变的字符串 字符串声明和创建
String s = "Hello World"; String s = new String(); s = "Hello World"; String s = new String("Hello World");

字符串基本操作方法 不能改变字符串自己,而是产生一个新的字符串。
116

第四章 数组和字符串
字符串连接操作
方法1:使用“+”

数值型变量自动转 public static void main(String[ ] args) { int sqlScore = 80; //sql成绩 换成String类型 int javaScore = 90; //java成绩 //创建成绩单 String score = "SQL:" + sqlScore + " Java:" + javaScore; //打印成绩单 System.out.println("*****成绩单*****"); “+‖连接字符串 System.out.println(score); }
方法2:使用String类的concat()方法 String s = new String("你好,"); String name = new String("张三!"); System.out.println(s.concat(name));

输出结果

你好,张三!
117

第四章 数组和字符串
获取字符串的长度 length()
public class Register { public static void main(String[ ] args) { Scanner input = new Scanner(System.in); 判断密码长度 System.out.print("请输入密码: "); pwd=input.next(); if( pwd.length()>=6 ){ System.out.print("注册成功! "); }else{ System.out.print("密码长度不能小于6位!"); } } }

字符串常量也可以使用length()方法获得长度。例如:”我是好 学生”.length()的值是5。
演示示例:字符串长度
118

第四章 数组和字符串
字符串前缀或后缀的比较
用boolean startsWith(String s)方法判断一个字符串的前缀是否为 字符串s。 用boolean endsWith(String s)方法判断一个字符串的后缀是否为字 符串s。 String str1 = ―220302620629021‖; String str2 = ―210219670922022‖; str.startsWith(― 220‖)的值是true; str2.startsWith(― 220‖)的值是false。 str1.endsWith(― 021‖)的值是true; str2.endsWith(― 021‖)的值是false。

119

第四章 数组和字符串
比较两个字符串是否相同
equals(String s)方法比较某字符串是否与字符串s相同 public class Login { public static void main(String[] args) { Scanner input = new Scanner(System.in); String uname,pwd; System.out.print("请输入用户名: "); 比较用户名和密码 uname=input.next(); 是否正确 System.out.print("请输入密码: "); pwd=input.next(); if( uname.equals("TOM") && pwd.equals("123456") ){ System.out.print("登录成功! "); }else{ System.out.print("用户名或密码不匹配,登录失败!"); } } } 演示示例:登录
120

第四章 数组和字符串
比较两个字符串是否相同
equals(String s)方法比较某字符串是否与字符串s相同 equals()方法比较原理 字符串 1

字符串 2 equals():检查组成字符串内容的字符是否完全一致 “==‖和equals()的区别 str1 0x2a486c B D str1==str2 ?false str1==str2 ?true Q N

str2

0x2a486c 0x2aac83

B

D

Q

N

==:判断两个字符串在内存中的首地址,即判断是否是同一个字符串对象
121

第四章 数组和字符串
比较两个字符串是否相同
equals(String s)方法比较某字符串是否与字符串s相同 boolean equalsIgnoreCase(String s)方法,忽略大小写比较某字符 串是否与字符串s相同。 int compareTo(String another)方法按字典顺序与参数another字符 串比较大小。代码s1.compareTo(s2),如果s1和s2相同,方法返回值 0;如果s1大于s2,方法返回正值;如果s1小于s2,方法返回负值。 int compareToIgnoreCase(String another)方法,忽略大小写,按 字典顺序与参数another字符串比较大小。 public class Login { public static void main(String[] args) { if ( uname.equals(―Tom") && pwd.equals(―123456") uname.toLowerCase().equals((―Tom ").toLowerCase()) ) { uname. equalsIgnoreCase (―Tom ") &&pwd.toUpperCase().equals((―123456").toUpperCase()) && pwd. equalsIgnoreCase (?123456 ") System.out.print("登录成功! "); }else{ System.out.print("用户名或密码不匹配,登录失败!"); } } 演示示例3:字符串比较 }

122

第四章 数组和字符串
字符串检索
int indexOf(String s)或者int indexOf(int ch) 从指定字符串开始检索参数字符串s,返回字符串s首次出现的位置。 int indexOf(String s,int startpoint)方法 在指定字符串中从某个位置开始检索参数字符串s,返回字符串s首次 出现的位置。如果没有检索到,则返回-1。 public int lastIndexOf(String value) 搜索最后一个出现的字符串value的索引值。

取字符串的子串
String substring(int startpoint) String substring(int startpoint, int end)

其中startpoint是字符串的开始下标,end是截止下标。方法从开 始下标开始,至截止下标的前一个下标为止范围内的子串。

123

第四章 数组和字符串
替换字符串的指定字符
String replace(char oldChar,char newChar) String replace(charsequence target, charsequence replacement) 用参数newChar指定的字符替换s中由oldChar指定的所有字符,产生 一个新的字符串。

去掉字符串前后空格
trim()方法可以去掉字符串的前后空格。

字符串分割
split(string regex)方法可以将字符串以regex分割为多个子字符串, 结果作为字符串数组返回。 拆分字符串,返回值为 public class Lyric { 字符串数组 public static void main(String[] args) { String words="长亭外 古道边 芳草碧连天 晚风扶 柳笛声残 夕阳山外山"; String[ ] printword = words.split(" "); for(int i=0;i<printword.length;i++){ System.out.println( printword[i] ); } } 演示示例:字符串拆分 遍历输出字符串 124 }

第四章 数组和字符串
基本数据类型的字符串表示
String.valueOf(数据变量) 数据变量.toString()

字符串转换基本数据类型对象
数据类型对象.valueOf(String s) Double.valueOf(―1234.567‖); //将字符串转换成Double类的对象

字符串转换基本数据类型值
数据类型对象. parseXXX(String s) int x= Integer.parseInt(―1234‖); float f = Float.parseFloat(―12.35‖); //字符串转化为int类型值 //字符串转化为float类型值

125

第四章 数组和字符串
StringTokenizer类
java.util包中的类StringTokenizer用于语言符号(单词)的分析。 用StringTokenizer类的构造方法,为给定的字符串构造一个对象。
StringTokenizer(String s),为字符串s构造一个分析器。使用默认 的分隔符集合,即空格符(若干个空格被看作一个空格)、换行符、 回车符、Tab符、进纸符。 StringTokenizer(String s,String delim),为字符串s构造一个分析 器,以字符串参数delim中的字符作为分隔符。

结合循环,利用nextToken()逐一取出单词 用hasMoreTokens()方法控制循环 调用countTokens()方法获取单词个数
public static void main(String[] args) { StringTokenizer s=new StringTokenizer("We are learning java ."); System.out.println(String.format("共包含%d个单词",s.countTokens())); while(s.hasMoreTokens()){ System.out.println(s.nextToken()); } }

126

第四章 数组和字符串
StringBuffer类
StringBuffer声明
创建空StringBuffer 对象 StringBuffer sb = new StringBuffer(); StringBuffer sb = new StringBuffer("aaa");

StringBuffer的使用
sb.toString(); //转化为String类型

创建一个变量存储 字符串aaa

sb.append("**"); //追加字符串 sb. deleteCharAt(n); //删除指定位置的字符

127

第五章 图形界面设计
主要内容(重点15%)
图形界面设计基础 框架窗口 标签、按钮和按钮事件 面板 布局设计 文本框和文本区

主要知识点和考核要求
创建框架窗口的方法,设计标签、按钮和按钮事件的处理方法 面板,布局设计,文本框和文本区数据输入和输出的方法

128

第五章 图形界面设计
图形界面设计基础
早先程序使用最简单的输入输出方式,用户在键盘输入数据,程序 将信息输出在屏幕上。现代程序要求使用图形用户界面(Graphical User Interface,GUI),界面中有菜单、按钮等,用户通过鼠标选 择菜单中的选项和点击按钮,命令程序功能模块。

AWT和Swing
抽象窗口工具包AWT(Abstract Window Toolkit),称为“重量级 (heavyweight)”组件 Swing被称为“轻量级(lightweight)”组件, Swing中的类是从 AWT继承,属于JavaTM Foundation Classes(简称JFC)的一部分。 有些Swing类直接扩展AWT中对应的类。例如,JApplet、JDialog、 JFrame和JWindow。 AWT依赖于主平台绘制用户界面组件,在不同平台上运行相同的程序, 界面的外观和风格可能会有一些差异;而Swing利用自己的机制,在 主平台提供的窗口中绘制和管理界面组件,在任何平台上外观和风 格都相同。
129

第五章 图形界面设计
组件和容器
Component、Container和Graphics类是AWT库中的关键类。 组件(Component)
图形界面的基本元素,Java的图形用户界面由组件构成,例如按钮 (button)、文本输入框(textfield)、标签(label)等都是组件, 用户可以直接操作。 Component类为所有组件类的超类。

容器(container)
容器是Component的子类,是一类特殊的组件,例如框架(frame)、 面板(panel)等。 容器是组件的容器,用来容纳其它Component对象。各种组件(包括容 器)可以通过add()方法添加到容器中 。

130

第五章 图形界面设计
JTextField

JComboBox

JLabel
JCheckBox

JTexArea

JRadioButton

JButton
131

第五章 图形界面设计

Component Button Checkbox

其他组件

MenuComponent Container TextComponent MenuBar MenuItem

TextArea

TextField 不独立 Panel 独立

Window

Menu

Applet

Frame

Dialog

132

第五章 图形界面设计
事件驱动程序设计基础
图形界面上的事件是指在组件上发生用户操作,程序中要对这种操作 能够进行捕捉并进行相应的处理。 事件 图形界面上的事件是指在某个组件上发生用户操作。 监视器 对事件作监视的对象称为监视器,监视器提供响应事件的处理方 法。 监视器注册 为了让监视器与事件对象关联起来,需要对事件对象作监视器注 册,告诉系统事件对象的监视器。

133

第五章 图形界面设计
实现事件处理的途征 java语言编写事件处理程序主要有两种方案。 程序重设handleEvent(Eventevt) 实现系统设定的事件类型接口 作为监视器对象的类需要实现相应的接口,即实现响应事件的方 法。当事件发生时,系统内设的handleEvent(Event evt)方法就 自动调用监视器的类实现的响应事件的方法。 Java.awt.event包中用来检测并对事件做出反应的模型包括以下 三个组成元素:
源对象:事件“发生地”。 监视器对象:监视源对象,并对其发生的事件进行处理。 事件对象:在“发生地”发生了什么事,封装了特定事件的信息。

134

第五章 图形界面设计

135

第五章 图形界面设计
事件类型和监视器接口 为了便于系统管理事件,系统将事件分类,为每个事件类型提供一 个接口,作为监视器对象的类必须实现相应接口的响应事件方法。
事件类型
ActionEvent ChangeEvent AdjustmentEvent ItemEvent

组件
JButton/JCheckBox/JComboBox/J MenuItem/JRadioButton JSlider JScrollBar JComboBox/JCheckBox/JRadioBut ton/JRadioButtonMenuItem/JCheck BoxMenuItem

描述
点击、选项或选择 调整一个可移动元素的位置 调整滑块位置 从一组可选方案中选择一个 项

ListSelectionEvent
KeyEvent MouseEvent CareEvent WindowEvent

JList
JComponent及其派生类 JTextArea,JTextField Window及其派生类JFrame

选项事件
操纵鼠标或键盘 选择和编辑文本 对窗口打开、关闭和图标化 136

第五章 图形界面设计
事件类型和监视器接口 每个事件类型都有一个相应的监视器接口,实现监视器接口的类必 须实现所有定义在接口中的方法。

137

第五章 图形界面设计
ActionEvent事件 当特定于组件的动作(比如被按下)发生时,由组件(比如 Button)生 成此高级别事件。事件被传递给每一个 ActionListener 对象,这些对象 是使用组件的 addActionListener 方法注册的,用以接收这类事件。 注:要使用键盘在 Button 上使用空格键触发 ActionEvent。
监听器实现ActionListener接口,并实现actionPerformed()方法。 组件通过addActionLinstener(监听器对象)方法注册监听器对象。 组件发生Action事件后会自动去调用监听器对象中的actionPerformed()方法, 并将与事件有关的参数封装在ActionEvent e对象中,以便用户使用。 为了区别是哪个组件发生的Action事件,可以用元素的setActionCommand() 方法,为组件设置命令字符串,之后通过ActionEvent对象的 getActionCommand()方法就可以获得这个字符串。 通过ActionEvent对象的getSource()方法可以事件源对象,返回类型是一个 Objict类。

138

第五章 图形界面设计
public class dzmFrm extends JFrame implements ActionListener { public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("ok")){ System.out.println("响应ActionListener事件!"); } } private JButton getJButton() { if (jButton == null) { jButton = new JButton(); public class dzmFrm extends JFrame { jButton.setActionCommand("ok"); private JButton getJButton() { jButton.addActionListener(this); if (jButton == null) { } jButton = new return jButton; JButton(); jButton.addActionListener(new java.awt.event.ActionListener() { } } public void actionPerformed(java.awt.event.ActionEvent e) { System.out.println("响应ActionListener事件!");} }); } return jButton; } 演示示例:Action事件响应 }

139

第五章 图形界面设计
MouseEvent鼠标事件 用户监听器要实现MouseListener 接口,必须实现以下方法:
void mouseClicked(MouseEvent e) void mouseEntered(MouseEvent e) void mouseExited(MouseEvent e) void mousePressed(MouseEvent e) void mouseReleased(MouseEvent e)

Java为用户提供了MouseAdapter类,它实现了MouseListener接口, 因此用户的监听器类只要从它继承并重写自己需要方法即可。 使用组件的addMouseListener方法将从该类所创建的侦听器对象 向该组件注册。当按下、释放或单击(按下并释放)鼠标、鼠标 进入或离开组件时会生成鼠标事件。发生鼠标事件时,将调用该 侦听器对象中的相应方法,并将MouseEvent传递给该方法。

140

第五章 图形界面设计
KeyEvent (键盘事件) 用户监听器要实现KeyListener 接口,必须实现以下方法:
void keyPressed(KeyEvent e) // 按下某个键时调用此方法 void keyReleased(KeyEvent e) // 释放某个键时调用此方法 void keyTyped(KeyEvent e) // 键入某个键时调用此方法

Java提供了KeyAdapter类,它实现了KeyListener接口,因此用户 的监听器类只要从它继承并重写自己需要方法即可。 使用组件的addKeyListener方法将从该类所创建的侦听器对象向 该组件注册。当按下、释放或单击(按下并释放)鼠标时会生成 鼠标事件。鼠标光标进入或离开组件时也会生成鼠标事件。发生 鼠标事件时,将调用该侦听器对象中的相应方法,并将KeyEvent 传递给该方法。 能过KeyEvent对象的getKeyChar()方法,可以得到健入的字 符,getKeyCode()方法,可以得到相应的键值。
141

第五章 图形界面设计
WindowEvent事件 使用窗口的addWindowListener方法将从该类所创建的侦听器对象 向 Window注册。当通过打开、关闭、激活或停用、图标化或取消 图标化而改变了窗口状态时,将调用该侦听器对象中的相关方法, 并将 WindowEvent 传递给该方法。 用户监听器要实现WindowListener接口,必须实现以下方法:
voidwindowActivated(WindowEvent e) voidwindowClosed(WindowEvent e) voidwindowClosing(WindowEvent e) voidwindowDeactivated(WindowEvent e) voidwindowDeiconified(WindowEvent e) voidwindowIconified(WindowEvent e) voidwindowOpened(WindowEvent e)

Java为提供了WindowAdapter类,它实现了WindowListener接口, 因此用户的监听器类只要从它继承并重写自己需要方法即可。
142

第五章 图形界面设计
框架窗口
窗口是GUI编程的基础,小应用程序或图形界面的应用程序的可视组 件都放在窗口中,在GUI中,窗口是用户屏幕的一部分,起着在屏幕 中一个小屏幕的作用。有以下三种窗口: Applet窗口 Applet类管理这个窗口,当应用程序程序启动时,由系统创建和处理。 框架窗口(JFrame) 通常意义上的窗口,它支持窗口周边的框架、标题栏,以及最小 化、最大化和关闭按钮。 无边框窗口(JWindow) 没有标题栏,没有框架,只是一个空的矩形。

143

第五章 图形界面设计
JFrame窗口
JFrame类的主要构造方法
JFrame():创建无标题的窗口对象。 JFrame(String title):创建一个标题名是title的窗口对象。

JFrame类的常用方法
setSize(int width,int height) :设置窗口大小 setLocation(int x ,int y):设置窗口位置 setBounds(int x,int y,int width,int height):设置窗口大小和位置 setBackground(Color c):设置背景颜色 setForeground(Color c) :设置前景色 setResizeable(boolean m):设置窗口大小是否可以改变 setTitle(String name):设置窗口标题栏 pack():紧凑显示窗口 setVisible(boolean b):设置窗口可见

144

第五章 图形界面设计
JFrame窗口
添加组件 Swing里的容器都可以添加组件,
JPanel及其子类(JApplet)可以直接加入组件,其他的Swing容器不 允许直接加入。 用getContentPane()方法获得内容面板,再将组件加入。 this.getContentPane().add(button); //添加按钮button到内容面板中 建立一个JPanel对象的中间容器,把组件添加到这个容器中,再用 setContentPane()把这个容器置为内容面板。 JPanel jPanel=new JPanel(); //初始化一个Jpanel对象 jPanel.add(new JButton(―ok‖)); //往Jpanel容器添加一个Jbutton this.setContentPane(jPanel); //将窗体容器内容面板设为Jpanel

145

第五章 图形界面设计
标签
标签(JLabel)是最简单的Swing组件。标签对象的作用是对位于其后的 界面组件作说明。可以设臵标签的属性,即前景色,背景色、字体等, 但不能动态地编辑标签中的文本。 JLabel类的主要构造方法
JLabel ():构造一个无显示文字的标签 JLabel (String text):构造一个显示文字为text的标签 JLabel(String text, int align):构造一个显示文字为text的标签。 align为显示文字的水平方式,对齐方式有三种:左对齐: JLabel.LEFT;中心对齐:JLabel.CENTER;右对齐:JLabel.RIGHT

JLabel类的常用方法
setText(String s):设置标签显示文字 setBackground(Color c):设置标签的背景颜色,默认背景颜色是容 器的背景颜色 setForeground(Color c):设置标签上的文字的颜色,默认颜色是黑色
146

第五章 图形界面设计
按钮
按钮(JButton)在界面设计中用于激发动作事件。按钮可显示文本, 当按钮被激活时,能激发动作事件。 JButton构造方法
JButton():创建一个没有标题的按钮对象 JButton(String s):创建一个标题为s的按钮对象

JButton类的常用方法
setLabel(String s):设置按钮的标题文字 setMnemonic(char mnemonic):设置热键 setToolTipText(String s):设置提示文字 setEnabled(boolean b):设置是否响应事件 setRolloverEnabled(boolean b):设置是否可滚动 addActionListener(ActionListener aL):向按钮添加动作监视器 removeActionListener(ActionListener aL):移动按钮的监视器
147

第五章 图形界面设计
面板——JPanel
面板是一种通用容器,普通面板JPanel的作用是实现界面的层次结构, 在它上面放入一些组件,也可以在上面绘画,将放有组件和有画的 JPanel再放入另一个容器里。 JPanel类的构造方法
JPanel():创建一个JPanel对象 JPanel(LayoutManager layout):创建JPanel对象时指定布局 layout,JPanel的默认布局为FlowLayout

JPanel对象添加组件的方法
add(组件):添加组件 add(字符串,组件):当面板采用GardLayout布局时,字符串是引用 添加组件的代号。

148

第五章 图形界面设计
面板——JScrollPane 滚动面板JScrollPane是带有滚动条的面板,当容器的显示区域不足以 同时显示所有组件时,通过移动滚动条的滑块显示容器的组件。 JScrollPane是Container类的子类,只能添加一个组件。因此,使用 JScrollPane一般先将一些组件添加到一个JPanel中,然后把JPanel添 加到JScrollPane中。
JScrollPane类的构造方法
JScrollPane():创建JScrollPane对象 JScrollPane(Component com):参数com是要放置于JScrollPane对象的组 件对象

JScrollPane对象设置滚动条的方法
setHorizontalScrollBarPolicy(int policy):取policy 以下值 ? JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS ? JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEED ? JScrollPane.HORIZONTAL_SCROLLBAR_NEVER setVerticalScrollBarPolicy(int policy):policy 取以下值 ? JScrollPane.VERTICAL_SCROLLBAR_ALWAYS ? JScrollPane.VERTICAL_SCROLLBAR_AS_NEED ? JScrollPane.VERTICAL_SCROLLBAR_NEVER 149

第五章 图形界面设计
布局设计 在界面设计中,一个容器要放臵许多组件,为了美观,为组件安排在容 器中的位臵,这就是布局设计。java.awt中定义了多种布局类,每种布 局类对应一种布局的策略。常用的布局类:
FlowLayout:依次放置组件 BoarderLayout:将组件放置在边界上 CardLayout:将组件像扑克牌一样叠放,每次只能显示其中一个组件 GridLayout:将显示区域按行、列划分成相等的格子,组件依次放入格子中 GridBagLayout:将显示区域划分成许多矩形小单元,每个组件可占用一个 或多个小单元

每个容器都有一个布局管理器,由它来决定如何安排放入容器内的的组 件。布局管理器实现LayoutManager接口的类。 Container对象通过方法setLayout()来设臵选用哪种布局管理器。 组件的setLocation()、setSize()、setBounds()方法,只有在 setLayout(null)时才起作用,即没有布局管理器的情况下由用户自己 设臵位臵大小等。一旦选择了某种布局管理器,将不起作用。
150

第五章 图形界面设计
FlowLayout(流水线式)
FlowLayout常用构造方法
FlowLayout():默认组件居中,间隙5个像素 FlowLayout(int align):参数align指定组件的对齐方式,其值必须 是以下5个之一: ? FlowLayout.LEFT,表示组件在所在行中居左对齐 ? FlowLayout.RIGHT,表示组件在所在行中居右对齐 ? FlowLayout.CENTER,组件在所在行中居中对齐 ? FlowLayout.LEADING ,表示每行组件都与容器开始边对齐 ? FlowLayout.TRAILING,表示每行组件都与容器结束边对齐 FlowLayout(int align,int horz ,int vert):设置对齐方式及间 隙像素

用add(组件)方法,依次加入组件 FlowLayout是JApplet、JPanel、JScrollPane的默认布局管理器
151

第五章 图形界面设计

流布局所指定组件的不同对齐方式下的效果图和窗口改变大小的效果图

152

第五章 图形界面设计
BorderLayout
BorderLayout常用构造方法
BorderLayout():默认组件间没有间隙 BorderLayout(int horz, int vert):设置组件间隙象素

用容器的add(组件名,位置)方法加入到相应的位置区域,默认位 置是中间。位置设置有:West、East、Center、North、South BorderLayout是JWindow、JFrame,JDialog内容面板默认布局管理器 南北水平方向缩放,东西垂直方向缩放,中间两个方向缩放

边界布局示意图

设置了间距的边界布局效果图

153

第五章 图形界面设计
GridLayout布局 GridLayout布局是把容器划分成若干行和列的网格状,行 数和列数由程序控制,组件放在网格的小格子中。
GridLayout布局的构造方法有:
GridLayout():生成一个单列的GridLayout布局。默认情况下,无间 隙。 GridLayout(int row,int col):设定一个有行row和列col的 GridLayout布局。 GridLayout(int row,int col,int horz,int vert):设定布局的行数和列 数、组件的水平间距和垂直间距。

GridLayout布局以行为基准,当放置的组件个数超额时,自动增 加列;反之,组件太少也会自动减少列,行数不变,组件按行优 先顺序排列(根据组件自动增减列)。GridLayout布局的每个网格 必须填入组件,如果希望某个网格为空白,可以用一个空白标签 (add(new Label()))顶替。
154

第五章 图形界面设计
import javax.swing.*; import java.awt.*; public class GridLayoutTest extends JFrame { private JButton b1, b2, b3, b4, b5, b6; public GridLayoutTest() { super("GridLayout "); Container cp = this.getContentPane(); cp.setLayout(new GridLayout(3, 2)); b1 = new JButton("1"); b2 = new JButton("2"); b3 = new JButton("3"); b4 = new JButton("4"); b5 = new JButton("5"); b6 = new JButton("6"); cp.add(b1); cp.add(b2); cp.add(b3); cp.add(b4);cp.add(b5); cp.add(b6); this.setSize(150, 150); this.setVisible(true); } public static void main(String args[]) { new GridLayoutTest(); } } 演示示例:GridLayout布局

155

第五章 图形界面设计
CardLayout布局管理器
被加到容器中的组件按先后次序叠放到一起,如果要显示调用布局管 理器的show()方法。 add(组件代号,组件):容器加入组件的方法把组件加到容器中, 并用组件代号(字符串)代表这个组件。 让容器显示某个组件的方法
使用show(容器名,组件代号) 按组件加入容器的顺序显示组件 ? first(容器):容器中第一个加入的组件。 ? last(容器):容器中最后一个加入的组件。 ? next(容器):容器中当前组件的下一个组件。 ? previous(容器):容器中当前组件的前一个组件。

156

第五章 图形界面设计
null布局
通过setLayout(null)可以设臵空布局管理器。空布局管理器可以准 确地定位组件在容器中的位臵和大小。 setBounds(int a,int b,int width,int height)方法是所有组件 都拥有的一个方法,调用该方法可以设置组件的大小(参数a和b) 和在容器中的位置(参数width和height)。 setLocation(int x ,int y) setSize(int width,int height)

157

第五章 图形界面设计
文本框
文本框(JTextField)是界面中用于输入和输出一行文本的框。 JTextField类用来建立文本框。 与文本框相关的接口是 ActionListener。 JTextField类的主要构造方法
JTextField():文本框的字符长度为1。 JTextField(int columns):文本框初始值为空字符串,文本框的字符 长度设为columns. JTextField(String text):文本框初始值为text的字符串。 JTextField(String text,int columns):文本框初始值为text,文本框 的字符长度为columns。

158

第五章 图形界面设计
文本框
JTextField类的其他方法
setFont(Font f):设置字体 setText(String text):在文本框中设置文本 setEditable(boolean):指定文本框的可编辑性,默认为true,可编辑。 setHorizontalAlignment(int alignment):设置文本对齐方式。对齐 方式有:JTextField.LEFT, JTextField.CENTER, JTextField.RIGHT requestFocus():设置焦点 addActionListener(ActionListener ):为文本框设置动作监视器,指 定ActionListener对象接收该文本框上发生的输入结束动作事件 removeActionListener(ActionListener):移去文本框监视器 getColumns():返回文本框的列数。 getMinimumSize():返回文本框所需的最小尺寸 getMinimumSize(int): 返回文本框在指定的字符数情况下,所需的 最小尺寸 getPreferredSize():返回文本框希望具有的尺寸
159

第五章 图形界面设计
密码框(JPasswordField)
密码框(JPasswordField)是一个单行的输入组件,与JTextField基本 类似。密码框多一个屏蔽功能,就是在输入时,都会以一个别的指定 的字符(一般是*字符)输出。除了文本框的方法外,密码框常用方法: getEchoChar(),返回密码的回显字符 setEchoChar(char),设置密码框的回显字符

160

第五章 图形界面设计
文本区 文本区(JTextArea)是窗体中一个放臵文本的区域。文本 区与文本框的主要区别是文本区可存放多行文本。 JTextArea组件没有事件。
JTextArea类的主要构造方法
JTextArea():以默认的列数和行数,创建一个文本区对象 JTextArea(String s):以s为初始值,创建一个文本区对象 JTextArea(Strings,int x,int y):以s为初始值,行数为x,列数为y创 建一个文本区对象。 JTextArea(int x,int y):以行数为x,以列数为y创建一个文本区对象

当文本区中的内容较多,不能在文本区全部显示时,可给文本区 配上滚动条。
JTextArea ta = new JTextArea(); JScrollPane jsp = new JScrollPane(ta); //给文本区添加滚动条
161

第五章 图形界面设计
文本区
JTextArea类的常用方法
setText(String s):设置显示文本,同时清除原有文本 insert(String s,int x):在指定的位置插入指定的文本 replace(String s,int x,int y):用给定的s替换从x位置到y位置的文本 append(String s):在文本区追加文本 setCarePosition(int n):设置活动光标的位置 getCarePosition():获取文本区中活动光标的位置。 setLineWrap(boolean b):设置自动换行,缺省情况,不自动换行

162

第六章 图形界面设计
主要内容(重点15%)
选择框和单选按钮 列表和组合框 菜单 对话框 滚动条 键盘和鼠标事件

考核知识点和考核要求
识记:鼠标事件类型、处理接口、处理方法 简单应用:声明和创建列表、组合框、对话框、滚动条 综合应用:声明和创建选择框、单选按钮,选择框和单选按钮分 组,设置菜单和菜单项、处理菜单和菜单项事件

163

第六章 图形界面设计
选择框和单选按钮
选择框、单选框和单选按钮都是选择组件,选择组件有两种状态,一 种是选中(on),另一种是未选中(off),它们提供一种简单的 ?on/off‖选择功能,让用户在一组选择项目中作选择。 选择框——复选按钮(JCheckBox) 选择框是一个小方框的按钮。当在一个容器中有多个选择框,同 时可以有多个选择框被选中。 单选按钮(JRadioButton) 单选按钮是一个圆形的按钮,同一组的单选按钮只允许有一个被 选中。 单选框——对象(ButtonGroup) 使用ButtonGroup对象将选择框分组,同一时刻组内的多个选择框 只允许有一个被选中,称同一组内的选择框为单选框。

164

第六章 图形界面设计
复选按钮
选择框(JCheckBox)也称复选框,被选中则在框中打勾。与选择框相关 的接口是ItemListener,事件类是ItemEvent。 JCheckBox类常用的构造方法
JCheckBox():用空标题构造选择框 JCheckBox(String s):用给定的标题s构造选择框 JCheckBox(String s, boolean b):参数b设置初始状态是否选中

JCheckBox类的常用方法
setState(boolean b):设置选择框的状态 setLabel(String s):设置选择框的标题 isSelected():获取选择框是否被选中的状态 itemStateChanged(ItemEvent e):处理选择框事件的接口方法 getItemSelectable(),获取可选项。获取事件源。 addItemListener(ItemListener l):为选择框设定监视器 removeItemListener(ItemListener l):移去选择框的监视器
165

第六章 图形界面设计
单选按钮
JRadioButton类的常用构造方法
JRadioButton():用空标题构造单选按钮 JRadioButton(String s):用给定的标题s构造单选按钮 JRadioButton(String s,boolean b):参数b设置初始状态是否选中

单选框
实现单选需要使用ButtonGroup将单选按钮分组,单选按钮的分组方 法是先创建对象,然后将单选按钮添加到同一个ButtonGroup对象中。

JPanel jPanel=new JPanel(); //初始化一个Jpanel对象 jPanel.add(new JButton(―ok‖)); //往Jpanel容器添加一个Jbutton this.setContentPane(jPanel); //将窗体容器内容面板设为Jpanel

166

第六章 图形界面设计

JRadioButton rbSexM = new JRadioButton("男",true); JRadioButton rbSexF = new JRadioButton("女",false); JPanel sexPanel = new JPanel(); sexPanel.add(rbSexM, null); sexPanel.add(rbSexF, null); //实现单选 ButtonGroup sexGroup = new ButtonGroup(); sexGroup.add(rbSexM); sexGroup.add(rbSexF); //复选 JPanel interestPanel = new JPanel(); interestPanel.add(new JCheckBox("电影"),null); interestPanel.add(new JCheckBox("运动"),null); interestPanel.add(new JCheckBox("看书"),null);

167

第六章 图形界面设计
选择项目事件处理 用户对选择框或单选按钮做出选择后,程序应对这个选择作出必 要的响应,程序为此要处理选择项目事件。 选择项目处理程序的基本内容:
监视选择项目对象的类要实现接口ItemListener 程序要声明和建立选择对象 为选择对象注册监视器 编写处理选择项目事件的接口方法itemStateChanged(ItemEvent e), 在该方法内用getItemSelectable()方法获取事件源,并作相应处理

168

第六章 图形界面设计
列表
列表(JList)在界面中表现为列表框,是JList类或它的子类的对象。 程序可以在列表框中加入多个文本选择项条目。列表事件的事件源有 两种:一是鼠标双击某个选项,二是鼠标单击某个选项。 双击选项是动作事件,与该事件相关的接口是ActionListener, 注册监视器的方法是addActionListener(),接口方法是 actionPerformed(ActionEvent e)。 单击选项是选项事件,与选项事件相关的接口是 ListSelectionListener,注册监视器的方法是 addListSelectionListener,接口方法是 valueChanged(ListSelectionEvent e)。 JList 类的常用构造方法
JList():建立一个列表 JList(String list[]):建立列表,list是列表的选择条目
169

第六章 图形界面设计
列表
JList类的常用方法
getSelectedIndex():获取选项的索引 getSelectedValue():获取选项的值 getSelectedIndices():返回所选的全部索引的数组(按升序排列) getSelectedValues():返回所有选择值的数组,根据其列表中的索 引顺序按升序排序 getItemCount():获取列表中的条数 setVisibleRowCount(int n):设置列表可见行数 setSelectionMode(int seleMode):设置列表选择模型。选择模型有 单选和多选两种。 ? 单选:ListSelectionModel.SINGLE_SELECTION ? 多选: ListSelectionModel.MULTIPLE.INTERVAL_SELECTION remove(int n):从列表的选项菜单中删除指定索引的选项 removeAll():删除列表中的全部选项
170

第六章 图形界面设计
组合框
组合框(JComboBox)是文本框和列表的组合,可以在文本框中输入选项, 也可以单击下拉按钮从显示的列表中进行选择。 组合框的常用构造方法
JComboBox():建立一个没有选项的JComboBox对象 JComboBox(Object[]items):利用数组对象建立JComboBox对象

组合框的常用方法
addItem(Object obj):向组合框加选项 getItemCount():获取组合框的条目总数 removeItem(Object ob):删除指定选项 removeItemAt(int index):删除指定索引的选项 insertItemAt(Object ob,int index):在指定的索引处插入选项 getSelectedIndex():获取所选项的索引值(从0开始) getSelectedItem():获得所选项的内容 setEditable(boolean b):设置组合框是否可编辑,默认不可编辑
171

第六章 图形界面设计
组合框
在JComboBox对象上发生事件分为两类: 用户选定项目 事件响应程序获取用户所选的项目,事件的接口是ItemListener 用户输入项目后按回车键 事件响应程序读取用户的输入。输入事件的接口是 ActionListener

172

第六章 图形界面设计
菜单 菜单与JComboBox和JCheckBox不同,它们在界面中是一直可见的。在 菜单中选择一个选项产生一个ActionEvent事件,该事件被发送给选 项监视器。
弹出式菜单 下拉式菜单 向窗口增设菜单的方法:先创建一个菜单条对象,然后再创建若干菜单对 象,把这些菜单对象放在菜单条里,再为每个菜单对象添加菜单项。
菜单条(JMenuBar) 菜单条通常在JFrame的顶部,一个菜单条可以放多个菜单(JMenu)。例如 Eclipse的菜单条File、Edit、Source等。 菜单(JMenu) 每个菜单可以有许多子菜单或菜单项(JMenuItem)。例如File菜单有New、 Open File、Close 、Close All等。 菜单项(JMenuItem) 在 JMenuItem 中除了可以添加字符串外,还可添加图标
173

第六章 图形界面设计
菜单栏
JMenuBar的构造方法JMenuBar()只有一个,用于建立一个新的菜 单栏。 通过JFrame的setJMenuBar(JMenuBar mb)方法将指定菜单栏 加入到JFrame窗体的顶部。 add(JMenu m):将菜单m加入到菜单条中 countJMenus():获得菜单条中菜单条数 getJMenu(int p):取得菜单条中的菜单 remove(JMenu m):删除菜单条中的菜单m

174

第六章 图形界面设计
菜单 由类JMenu创建的对象就是菜单。类JMenu的常用方法如下:
JMenu():建立一个空标题的菜单 JMenu(String s):建立一个标题为s的菜单 add(JMenuItem item):向菜单增加item菜单项 add(JMenu menu):向菜单增加menu菜单,实现在菜单嵌入子菜单。 addSeparator():在菜单选项之间画一条分隔线 getItem(int n):获取指定索引处的菜单项 getItemCount():获取菜单项数目 insert(JMenuItem item,int n):在菜单的位置n插入菜单项item remove(int n):删除菜单位置n的菜单项 removeAll():删除菜单的所有菜单项

175

第六章 图形界面设计
菜单项
JMenuItem():构造无标题的菜单项 JMenuItem(String s):构造有标题的菜单项 setEnabled(boolean b):设置当前单项是否可被选择 isEnabled():返回当前菜单项是否可被用户选择 getLabel():得到菜单项的名称 setLabel():设置菜单选项的名称 addActionListener(ActionListener e):为菜单项设置监视器,接受 点击某个菜单的动作事件

选择框菜单项 菜单也可以包含具有持久的选择状态的选项,这种特殊的菜单可 由JCheckBoxMenuItem、JRadioButtonMenuItem类来定义,作为一 个菜单项加到下拉菜单中。

176

第六章 图形界面设计
对话框
对话框是为了人机对话过程提供交互模式的工具。应用程序通过 对话框,或给用户提供信息,或从用户获得信息。 对话框是一个临时窗口,可以在其中放置用于得到用户输入的控 件。 在Swing中,有两个对话框类,
JDialog类:提供构造并管理通用对话框 JOptionPane类:给一些常见的对话框提供许多便于使用的选项

177

第六章 图形界面设计
JDialog类
JDialog类是对话框的基类,对话框本身就是一个容器,默认的布局 管理器是BorderLayout,因此可以将组件加到对话框的内容面板里。 对话框依赖其他窗口,分为强制和非强制两种。建立对话框时,必须 给它指明是依赖哪个窗口的。这个窗口关闭了,这个对话框也关闭了, 默认是一个非强制型号的对话框。 强制型对话框 强制型也称有模式对话框。不能中断对话过程,直至对话框结束, 才让程序响应对话框以外的事件。 非强制对话框也称非模式对话框。非强制型对话框可以中断对话 过程,去响应对话框以外的事件。

178

第六章 图形界面设计
JDialog类常用的构造方法
JDialog():构造一个初始化不可见的非强制型对话框。 JDialog(JFrame f,String s):参数f设置对话框所依赖的窗口,参数s 用于设置标题。 JDialog(JFrame f,String s,boolean b):构造一个标题为s,初始化 是否可见的对话框。参数b决定对话框是否强制或非强制型。

JDialog类的常用方法
getTitle():获取对话框的标题。 setTitle(String s):设置对话框的标题。 setModal(boolean b):设置对话框的模式。 setSize():设置框的大小。 setVisible(boolean b):显示或隐藏对话框。

179

第六章 图形界面设计
JOptionPane类
JOptionPane类定义了四个简单对话框类型,提供一组静态方法,让 用户选用某种类型的对话框。 showConfirmDialog 确认对话框,显示问题,要求用户确认(yes/no/cancel) showInputDialog 输入对话框,提示用户输入 showMessageDialog 信息对话框,显示文本消息,告知用户发生了什么情况 showOptionDialog 选项对话框,显示选项供用户选择

180

第六章 图形界面设计
参数类型
Component parentComponent String title Object message

参数描述
指定对话框的父窗口对象, 以决定显示位置 对话框的标题 显示在对话框中的描述信息

备注
默认Frame为父窗口或null

String/图标/组件/数组 ERROR_MESSAGE INFORMATION_MESSAGE WARNING_MESSAGE QUESTION_MESSAGE PLAIN_MESSAGE DEFAULT_OPTION YES_NO_OPTION YES_NO_CANCEL_OPTION OK_CANCEL_OPTION 通常是String数组,也可以是图标或组 件数组 如果没有指定,则根据messageType 参数显示缺省图标 181

int messageType

对话框所传递的信息类型标 识

int optionType

对话框上按钮的类型

Object[] options Icon icon Object initialValue

对话框上的选项 对话框上显示的装饰性图标 初始选项或输入值

第六章 图形界面设计
JOptionPane.showMessageDialog(parentComponent,mess age,title,messageType,icon)
JOptionPane.showMessageDialog(frame, "File not found.", "An error", JOptionPane.ERROR_MESSAGE);

JOptionPane.showOptionDialog(parentComponent,messa ge,title,optionType,messageType,icon,options,initi alValue)
JOptionPane.showOptionDialog(frame, "Click OK to continue", "Warning",JOptionPane.DEFAULT_OPTION,JOptionPane.WARNIN G_MESSAGE,null, options, options[0]);

演示示例:标准对话框的使用

182

第六章 图形界面设计
showXxxDialog()返回类型
showMessageDialog()没有返回值 showConfirmDialog()和showOptionDialog()方法返回int型数值, 代表用户选择按钮的序号 JOptionPane中定义了常量分别代表用户选择结果。

showInputDialog()方法的返回值为String或Object,代表用户的输 入或选项
演示示例:JOptionPane使用
183

第六章 图形界面设计
滚动条(JScrollBar)
滚动条也称为滑块,用来表示一个相对值,该值代表指定范围内的一 个整数。用JScrollBar类实现和管理可调界面。 JScrollBar类常用的构造方法 JScrollBar(int dir,int init,int width,int low,int high)
dir表示滚动条的方向 JScrollBar.VERTICAL表示垂直滚动条 JScrollBar.HORIZONTAL表示水平滚动条 init表示滚动条的初始值,该值确定滚动条滑块开始时的位置 width是滚动条滑块的宽度 low和high指定滚动的下界和上界 滑块的宽度可能影响滚动条可得到的实际的最大值,滚动条可以达到 的最大值是指定最大值减去滑块的宽度。

184

第六章 图形界面设计
JScrollBar类常用方法
setUnitIncrement():设置增量,即单位像素的增值。 getUnitIncrement():获取增量。 setBlockIncrement():设置滑块增量,即滑块的幅度。 getBlockIncrement():获取滑块增量。 setMaxinum():设置最大值。 getMaxinum():获取最大值。 setMininum():设置最小值。 getMininum():获取最小值。 setValue():设置新值。 getValue():获取当前值。

185

第六章 图形界面设计
JScrollBar类对象的事件类型是AdjustmentEvent;类要实现的接 口是AdjustmentListener
adjustmentValueChanged():接口方法 addAdjustmentListener():注册监视器的方法 getAdjustable():获取事件源对象的方法

186

第六章 图形界面设计
鼠标事件
鼠标事件的事件源往往与容器相关,当鼠标进入容器、离开容器,或 者在容器中单击鼠标、拖动鼠标时都会发生鼠标事件。为处理鼠标事 件提供两个接口:MouseListener,MouseMotionListener接口。 鼠标事件注册方法
addMouseListener(监视器):加入监视器 removeMouseListener(监视器):移除监视器 addMouseMotionListener(监视器):注册监视器

事件相应的方法
getX():获取鼠标X的坐标 getY():获取鼠标Y的坐标 getModifiers():获取鼠标左键或右键 getClickCount():获取鼠标被点击的次数 getSource():获取发生鼠标事件的事件源

187

第六章 图形界面设计
MouseListener接口的鼠标事件
mousePressed(MouseEvent):负责处理鼠标按下的事件 mouseReleased(MouseEvent):负责处理鼠标释放事件 mouseEntered(MouseEvent):负责处理鼠标进入容器事件 mouseExited(MouseEvent):负责处理鼠标离开容器事件 mouseClick(MouseEvent):负责处理鼠标点击事件

MouseMotionListener接口的鼠标事件
mouseDragged(MouseEvent):负责处理鼠标拖动事件 mouseMoved(MouseEvent):负责处理鼠标移动事件

188

第六章 图形界面设计
键盘事件
键盘事件的事件源一般与组件相关,当一个组件处于激活状态时,按 下、释放或敲击键盘上的某个键时就会发生键盘事件。 键盘事件的接口是KeyListener 注册键盘事件监视器的方法是addKeyListener(监视器) 实现KeyListener接口的方法
keyPressed(KeyEvent e):键盘上某个键被按下 keyReleased(KeyEvent e):键盘上某个键被按下,又释放 keyTyped(KeyEvent e):keyPressed和keyReleased两方法的组合

管理键盘事件的类是KeyEvent,该类提供方法:
getKeyCode():获得按动的键码,键码表在KeyEvent类中定义,参 见附录E。

189

第七章 图形、图像与多媒体
主要内容(次重点10%)
绘图基础 绘图 图像处理基础 多媒体基础

考核知识点和考核要求
识记:Graphics类的基本功能,坐标系统 领会:利用Graphics2D类设置绘图状态属性 简单应用:着色和设置字体,利用Graphics2D类对象绘制几何图 形、绘制二次、三次曲线,显示图像和图像缓冲,播放幻灯片、 动画、音乐的方法 综合应用:显示文字,绘制基本几何图形

190

第七章 图形、图像与多媒体
绘图基础
基本图形包括点、线、圆、矩形等,是构成复杂图形的基础。绘 制基本图形要使用AWT中的Graphics类,它提供了各种基本图形的 绘制方法,可以直接引用这些方法 确定平面坐标系,坐标原点(0,0)位于整个区域的左上角。一 个坐标点对应屏幕上的一个像素,必须是整数。 窗口大小由超文本文件中的width和height指定。 Graphics类
类Graphics在java.awt包中 功能:建立字体、设定显示颜色、显示图象和文本,绘制和填充各种 几何图形。 生成Graphics的对象的方法: ? 构造图形对象 ? 使用Component的getGraghics()方法
191

第七章 图形、图像与多媒体
绘图基础
绘图是指根据用户需要,在一些组件上画出各种几何图形。 组件重画原理:一般每个组件(Component)类里都有一个paint() 方法。它主要用来在组件需要重新绘制时由系统自动调用。因此 用户如果要在组件内绘图一般是将paint()方法进行重写,之后把 绘图语句放到这里,则系统在需要重新绘制组件时,将会自动调 用到paint()语句,绘出用户的图形。 如果用户强制重绘组件时,只需调用组件的repaint()方法即可。 repaint()会间接去调用paint()方法,一般用户不直接去调用 paint()方法。 对于JComponent组件类,有一个paintComponent()方法,它由 paint()方法调用,用户绘图时重写这个方法即可。

192

第七章 图形、图像与多媒体
显示文字
drawString (String str,int x,int y):在指定位置显示字符串 drawChars(char data[ ],int offset,int length,int x,int y):在指定 位置显示字符数组中的文字,从字符数组的offset位置开始,最多显 示length个字符。 drawBytes(byte data[ ],int offset,int length,int x,int y):在指定位 置显示字符数组中的文字,从字节数组的offset位置开始,最多显示 length个字符。

193

第七章 图形、图像与多媒体
设置字型 setFont(Font font):设臵字型,包括字体、风格和字号三要素。
常用的字体有Times New Roman、宋体、楷体等。 常用的风格有三种:正常、粗体和斜体,分别用Font.PLAIN、 Font.BOLD和Font.ITALIC三个常量表示。风格可以组合使用,例如 , Font.BOLD+Font.ITALIC。 字号是字的大小,单位是磅。

JAVA语言中,用类Font对象设臵字体,其构造方法为:
Font(String fontName,int style,int size) getStyle():返回字体风格 getSize():返回字体大小 getName():返回字体名称 isPlain():测试字体是否是正常字体 isBold():测试字体是否是粗体 isItalic():测试字体是否是斜体
194

第七章 图形、图像与多媒体
设置颜色
用类Color的对象设置颜色,有两种方法生成各种颜色。 ? 用类Color预定议的颜色:black,red, white, yellow ?? ? 通过红绿蓝(RGB)的值合成颜色。用类Color的构造方法 Color(int R, int G,int B)创建一个颜色对象,参数R,G,B分别 表示红色、绿色和蓝色,它们的取值是从0到255。 setColor(Color c):用类Graphics的方法设置显示颜色,参数c的取 值参见表7-1。 getColor():用类Graphics的方法获取颜色。 setBackground(Color c):用类Component的方法设置背景颜色。

195

第七章 图形、图像与多媒体
绘图模式 绘制的图形与早先绘制的图形重叠时,如何确定重叠部分的颜色。
正常模式:指后绘制的图形覆盖绘制在早先绘制的图形之上,使早先 绘制的图形的重叠部分不再可见。 setPaintMode():设置绘图模式为覆盖模式(正常模式)。正常模式 是绘图的默认模式。 异或模式:把绘图看作是按图形着色。 setXORMode(Color c):设置绘图模式为异或模式,参数c为异或模 式设定的绘图颜色。

196

第七章 图形、图像与多媒体
Graphics类的绘图方法
Graphics类提供基本的几何图形绘制方法:画线段、画矩形、画圆、 画带颜色的图形、画椭圆、画圆弧、画多边形等。 画线 在窗口画一条线段,可以使用Graphics类的drawLine()方法: drawLine(int x1,int y1,int x2,int y2) 例如,在点(3,3)与点(50,50)之间画线段,在点(100,100)处画一 个点。
g.drawLine(3,3,50,50); g.drawLine(100,100,100,100); //画一条线段 //画一个点

197

第七章 图形、图像与多媒体
画普通矩形
drawRect(int x,int y,int width,int height):画线框围起来的矩形。 其中参数x和y指定左上角的位置,参数width和height是矩形的宽和 高。 fillRect(int x,int y,int width,int height):用预定的颜色填充一个矩 形,得到一个着色的矩形块。

g.drawRect(80,100,40,25); g.setColor(Color.yellow); g.fillRect(20,70,20,30);

//画线框 //画着色块

198

第七章 图形、图像与多媒体
画圆角矩形
drawRoundRect(int x,int y,int width, int height, int arcWidth, int arcHeight):用线围起来的圆角矩形。其中参数x和y指定矩形左上角 的位置;参数width和heigth是矩形的宽和高;arcWidth和 arcHeight分别是圆角弧的横向直径和圆角弧的纵向直径。 fillRoundRect(int x,int y,int width,int height,int arcWidth,int archeight):是用预定的颜色填充的圆角矩形。 g.drawRoundRect(10,10,150,70,40,25); g.setColor(Color.blue); g.fillRoundRect(80,100,100,100,60,40); g.drawRoundRect(10,150,40,40,40,40); g.setColor(Color.red); g.fillRoundRect(80,100,100,100,100,100); //画一个圆角矩形 //涂一个圆角矩形块 //画圆 //画圆块

199

第七章 图形、图像与多媒体
画三维矩形
draw3DRect(int x,int y,int width,int height, boolean raised):画 一个突出显示的矩形。其中x和y指定矩形左上角的位置,参数width 和height是矩形的宽和高,参数raised是突出与否。 fill3DRect(int x,int y,int width,int height,boolean raised),用预定 的颜色填充一个突出显示的矩形。

g.draw3DRect(80,100,40,25,true); //画一个线框 g.setColor(Color.yellow); g.fill3DRect(20,70,20,30,true);//画一个着色块

200

第七章 图形、图像与多媒体
画椭圆形 椭圆形由椭圆的横轴和纵轴确定。
drawOval(int x,int y,int width,int height):画用线围成的椭圆形。 其中参数x和参数y指定椭圆形左上角的位置,参数width和height是 横轴和纵轴。 fillOval(int x,int y,int width,int height):用预定的颜色填充的椭圆 形。也可以用画椭圆形方法画圆形,当横轴和纵轴相等时,所画的椭 圆形即为圆形。 g.drawOval(10,10,60,120); g.fillOval(100,30,60,60); g.fillOval(15,140,100,50); //画椭圆 g.setColor(Color.cyan); //涂圆块 g.setColor(Color.magenta); //涂椭圆

201

第七章 图形、图像与多媒体
画圆弧
drawArc(int x,int y,int width,int height,int startAngle, int arcAngle):画椭圆一部分的圆弧线。参数startAngle和arcAngle表 示从startAngle角度开始,时针方向画arcAngle度的弧。正值度数是 逆时针方向负值度数是顺时针方向。 fillArc(int x,int y,int width, int height, int startAngle, int arcAngle):用setColor()方法设定的颜色,画着色椭圆的一部分。 g.drawArc(10,40,90,50,0,180);//画圆弧线 g.drawArc(100,40,90,50,180,180); //画圆弧线 g.setColor(Color.yellow); g.fillArc(10,100,40,40,0,-270); //填充缺右上角的四分之三的椭圆 g.setColor(Color.green); g.fillArc(60,110,110,60,-90,-270); //填充缺左下角的四分之三的椭圆

202

第七章 图形、图像与多媒体
画多边形 多边形是用多条线段首尾连接而成的封闭平面图。多边形线段端 点的x坐标和y坐标分别存储在两个数组中,画多边形就是按给定 的坐标点顺序用直线段将它们连起来。
drawPolygon(int xpoints[],int yPoints[],int nPoints):画一个多边 形 fillPolygon(int xPoints[],int yPoints[],int nPoints):用方法 setColor()设定的颜色着色多边形。

其中数组xPoints[]存储x坐标点,yPoints[]存储y坐标点, int px1[]={50,90,10,50}; //首末点相重,才能画多边形 nPoints是坐标点个数。注意,上述方法并不自动闭合多边形,要 int py1[]={10,50,50,10}; int px2[]={140,180,170,180,140,100,110,140}; 画一个闭合的多边形,给出的坐标最后一点必须与第一点相同。
int py2[]={5,25,35,45,65,35,25,5}; g.setColor(Color.blue); g.fillPolygon(px1,py1,4); g.setColor(Color.red); g.drawPolygon(px2,py2,9);

203

第七章 图形、图像与多媒体
擦除矩形块 当需要在一个着色图形的中间有一个空缺的矩形的情况,可用背 景色填充一矩形块实现,相当于在该矩形块上使用了“橡皮擦”。 clearRect(int x,int y, int width,int height):擦除一个由 参数指定的矩形块的着色。
g.setColor(Color.blue); g.fillOval(50,50,100,100);g.clearRect(70,70,40,55);

限定作图显示区域 clipRect(int x,int y,int width,int height):用一个矩形表 示图形的显示区域,要求图形在指定的范围内有效,超出部分坐 标值不显示。多个限制区有覆盖时,得到限制区域的交集区域。 复制图形 copyArea(int x,int y,int width,int height, int dx, int dy):dx和dy分别表示将图形粘贴到原位置偏移的像素点数。
204

第七章 图形、图像与多媒体
Graphics2D类的绘图方法
Java语言在Graphics类提供绘制各种基本的几何图形的基础上,扩展 Graphics类提供一个Graphics2D类,它拥用更强大的二维图形处理能 力,提供、坐标转换、颜色管理以及文字布局等更精确的控制。 绘图属性 Graphics2D定义了用于添加或改变图形的状态属性,可以通过设定 和修改状态属性,指定画笔宽度和画笔的连接方式;设定平移、 旋转、缩放或修剪变换图形;以及设定填充图形的颜色和图案等。 绘图方法 Graphics2D类保留Graphics类的绘图方法,同时增加将几何图形 (线段、圆等)作为一个对象来绘制。在java.awt.geom包中包含用 于创建各种图形对象。主要有:Line2D线段类,Ellipse2D椭圆类, RoundRectangle2D圆角矩形类,Arc2D圆弧类,QuadCurve2D二次 曲线类,CubicCurve2D三次曲线类。 几何图形类
205

第七章 图形、图像与多媒体
绘图属性
stroke属性 控制线条的宽度、笔形样式、线段连接方式或短划线图案。该属性的设 置需要先创建BasicStroke对象,再调用setStroke()方法来设置。 paint属性 控制填充效果。先调用GradientPaint()确定填充效果,用setPaint()方 法设置。 transform属性 实现图形平移、缩放和斜切等变换操作。首先创建AffineTransform对 象,然后调用setTransform()方法设置transform属性。 clip属性 实现剪裁效果。设置剪裁属性可调用setClip()方法确定剪裁区的Shape。 composit属性 设置图形重叠区域的效果。先用方法AlphaComposite.getInstance() 得到AlphaComposite对象,再通过setComposite()方法设置混合效果。 Alpha值的范围为0.0f(完全透明)~0.1f(完全不透明)。
206

第七章 图形、图像与多媒体
Graphics2D类的绘图方法
先在重画方法paintComponent()或paint()中,把参数对象g强制转换 成Graphics2D对象;然后用静态方法Double()创建该图形的对象; 以图形对象为参数调用Graphics2D对象的draw()方法绘制这个图形。 //用Graphics2D绘制线段和圆角矩形 Graphics2D g2d = (Graphics2D)g; //将对象g转换成Graphics2D Line2D line = new Line2D.Double(30.0,30.0,340.0,30.0); g2d.draw(line); RoundRectangle2D rRect = new RoundRectangle2D.Double(13.0,30.0,100.0,70.0,40.0,20.0); g2d.draw(rRect); 先用java.awt.geom包提供的Shape对象,并用单精度Float坐标或双 精度Double坐标创建Shape对象,然后再用draw()方法绘制。 //先创建圆弧对象,然后绘制圆弧: Shape arc = new Arc2D.Float(30,30,150,150,40,100,Arc2D.OPEN); g2d.draw(arc)/绘制前面创建的图形对象arc
207

第七章 图形、图像与多媒体
Graphics2D的几何图形类
线段 //声明并创建线段对象,起点是(2,3),终点是(200,300) Line2D line = new Line2D.Double(2,3,200,300); 矩形 //声明并创建矩形对象,矩形的左上角是(20,30),宽是300,高是40 Rectangle2D rect = new Rectangle2D.Double(20,30,80,40);

圆角矩形
//左上角是(20,30),宽是130,高是100,圆角的长轴是18,短轴是15 RoundRectangle2D rectRound = new RoundRectangle2D.Double(20,30,130,100,18,15);

椭圆
//左上角 (20,30),宽是100,高是50 Ellipse2D ellipse = new Ellipse2D.Double(20,30,100,50);
208

第七章 图形、图像与多媒体
Graphics2D的几何图形类
圆弧 参数Arc2D.OPEN、Arc2D.CHORD、Arc2D.PIE表示圆弧是开弧、弓弧和饼弧。

//外接矩形的左上角(10,30),宽85,高60,起始角5度,终止角90度 Arc2D arc1 = new Arc2D.Double(8,30,85,60,5,90,Arc2D.OPEN); Arc2D arc2 = new Arc2D.Double(20,65,90,70,0,180,Arc2D.CHORD); Arc2D arc3 = new Arc2D.Double(40,110,50,90,0,270,Arc2D.PIE);
二次曲线 二次曲线用二阶多项式表示:y(x)=ax2+bx+c 一条二次曲线需要三个点确定:始点、控制点和终点。

QuadCurve2D curve1 = new QuadCurver2D.Double(20,10,90,65,55,115);
三次曲线 三次曲线用三阶多项式表示:y(x)=ax3+bx2+cx+d 一条三次曲线需要四个点确定:始点、两个控制点和终点。

CubicCurve2D curve2 = new CubicCurve2D.Double(12,30,15,70,20,25,35,94);
209

第七章 图形、图像与多媒体
图像处理基础
图像是由一组像素构成,用二进制形式保存的图片。 java语言支持GIF、JPEG和BMP这3种主要图像文件格式。 java语言的图像处理功能被封装在Image类中。 图像载入和输出 载入图象的方法:先声明Image对象,用getImage()载入图象文件。
Image getImage(URL url):指明Application程序图像文件所在位置。 Image getImage(URL url,String name):url指明图像所在位置, name是文件名。 //取Application程序文件所在位置 Image img = Toolkit.getDefaultToolkit().getImage("./src/image/1.jpg"); //取Applet程序文件所在的位置 Image img = getImage(getCodeBase(),―1.jpg"); //取HTML文件所在的位置 Image img = getImage(getDocumentBase(),‖pictures/imageSample.gif‖);
210

第七章 图形、图像与多媒体
获取图像信息(属性)方法
getWidth(ImageObserver observer):取宽度。 getHeight(ImageObserver observer):取高度。

显示图像的方法
boolean drawImage(Image img,int x,int y,ImageObserver observer) boolean drawImage(Image img,int x,int y,Color bgcolor,ImageObserver observer) boolean drawImage(Image img,int x,int y,int width,int height,ImageObsever observer) booleandrawImage(Image img,int x,int y,int width,int height,Color bgcolor,ImageObsever observer)

参数img是Image对象,x,y是绘制图像矩形的左上角位置,observer (1) g.drawImage(image,0,0,null); //原图显示 (2) g.drawImage(image,10,10,Color.red,this);//图形加底色显示,注意: 是加载图像时的图像观察器(Applet常用this作为实参),bgcolor 如原图的大小与给定的范围不同,系统会自动缩放 是显示图像用的底色,width和height是显示图像的矩形区域,当这 (3) g.drawImage(image,0,0,this); // 原图显示 个区域与图像的大小不同时,显示图像就会有缩放处理。 (4) g.grawImage(image,0,120,100,100,this);//缩放显示 (5) g.grawImage(image,0,240,500,100,this);//缩放显示 211

第七章 图形、图像与多媒体
图像缓冲技术
创建缓冲区图像,需要引入java.awt.image包中的BufferedImage 类。 调用createImage()方法创建一个缓冲区图,返回一个Image对象, 然后再将它转换成一个BufferedImage对象。例如,
BufferedImage bimage = (BufferedImage)this.createImage(this.getWidth(),this.getHeight());

也可利用构造方法来建立。
BufferedImage(int width,int heigh, int imageType);

其中参数imageType是图像类型。 使用缓冲区显示图像,需先在缓冲区中准备好图像,再将缓冲区 中的图像显示在界面上。图形对象Graphics建立方法:
Graphics2D g2d = bimge.createGraphics();
212

第七章 图形、图像与多媒体
多媒体基础
播放幻灯片和动画
将图片读入数组,单击鼠标变换图片,逐张显示成幻灯片效果。 程序通过快速显示一组图片造成显示动画的效果。

播放声音 Java语言支持au、aiff、wav、midi、rfm等音频格式。 播放音频文件,可使用java.applet.AudioClip类创建AudioClip 对象,并用getAudioClip()方法为其初始化。
AudioClip audioClip = getAudioClip(getCodeBase(),‖myAudioClipFile.au‖); getAudioClip(URL url, String name):根据url地址及音频文件 name获得可播放的音频对象。 play():播放声音 loop():循环播放 stop():停止播放
213

第八章 多线程
主要内容(重点掌握15%)
线程的基本概念 Thread类和Runnable接口 线程的互斥与同步

考核知识点与考核要求
识记 线程与进程的区别,线程的各种状态、优先级,线程间的互斥与 同步 简单应用 线程互斥和同步的实现方法 综合应用 用Thread子类实现多线程,用Runnable接口实现多线程

214

第八章 多线程
线程的基本概念
线程和进程共同点 顺序执行的语句序列来完成特定的功能,都是程序的一个执行过 程。 线程和进程不同点
进程是一个实体,每个进程有自己的状态、专用数据段(独立内存资 源);同一个进程下的线程则共享进程的数据段。 创建进程时,必须建立其专用数据段;创建线程时不必建立新的数据 段。 线程没有入口和出口,由进程触发执行。线程不是能够独立运行的程 序,而只是某个进程内的一个执行流。

215

第八章 多线程
线程的基本概念
线程的优点 线程的建立和线程间的切换速度大大超过进程,不需要数据段的 保护和恢复。线程的执行效率比进程的执行效率高
适合于开发服务程序,如Web服务、聊天服务等 适合于开发有多种交互接口的程序,如聊天程序的客户端、网络下载 工具 适合于有人机交互又有计算量的程序,如字处理程序Word、Excel等

线程的缺点 由于多个线程共享数据段,带来数据访问过程中的互斥和同步问 题,使系统管理变得复杂。 Java的线程通过java.lang.Thread类实现。

216

第八章 多线程
线程的生命周期
新建状态 新建状态指创建了一个线程,但它还没有启动。处于新建状态的线程 对象,只能够被启动或终止。 Thread mythread = new Thread(); 就绪状态 当线程处于新建状态后,调用了start()方法,线程就处于就绪状态。 就绪状态线程具备了运行条件,但尚未进入运行状态。线程通过线程 调试获得CPU资源变成运行状态。 myThread.start(); 运行状态 ? 某个就绪状态的线程获得CPU资源,为运行状态。当线程对象开 始执行时,系统调用该对象的run()方法。 ? 使用yield()方法可以使线程主动放弃CPU,进入就绪状态。 ? 线程执行结束或执行stop()方法进入死亡状态。
217

第八章 多线程
阻塞状态 正运行的线程遇到某个特殊情况,进入阻塞状态,暂时停止执行。线 程进入阻塞状态后,必须等到引起阻塞的原因被消除,才转入就绪状 态,进入就绪队列排队。当线程再次变成运行状态时,将从原来暂停 处开始继续运行。sleep()和wait()是常用的引起阻塞的方法。 线程从阻塞状态恢复到就绪状态有三种途径: ? 自动恢复(例如:sleep时间到、I/O操作完成) ? 用resume()方法恢复 ? 用notify()或notifyAll()方法通知恢复 死亡状态 指线程不再具有继续运行的能力,从而使线程终止进入死亡状态。 ? 线程完成了全部工作,即执行完run()方法的最后一条语句 ? 线程处于“可运行”状态时,调用了stop()方法结束了线程的运



218

第八章 多线程

new Thread()

就绪 运行 start()

suspend() sleep() wait() I/O流阻塞

yield()

等待 睡眠 挂起 阻塞

创建新线程

可运行态

不可运行态

stop() run()exit
stop() stop() 死亡

resume() notify() notifyAll() I/O指令

219

第八章 多线程
线程的操作方法
start() :启动线程对象 run():用来定义线程对象被调度之后所执行的操作,用户必须重写 run()方法 yield():强制终止线程的执行 isAlive():测试当前线程是否在活动 sleep(int millsecond):使线程休眠一段时间,时间由参数所决定 void Wait():使线程处于等待状态

Thread类中有关优先级的方法
setPriority(int newPriority):重置线程优先级 Int getPriority():获得当前线程的优先级

220

第八章 多线程
线程调度与优先级
Java提供了一个线程调度器来监视和控制就绪状态的线程,通常是抢 占式,而不是时间片式。 优先级高的线程比优先级低的线程优先执行。在优先级相同的情况下, 就按“先到先服务”的原则。 线程的优先级用数值表示,数值越大优先级越高(范围1~10)。缺省 时,线程自动从父线程获得相同的优先级 ? MAX_PRIORITY:最大优先权,值为10 ? MIN_PRIORITY:最小优先权,值为1 ? NORM_PRIORITY:默认优先权,值为5 任务紧急的线程,其优先级较高,相反,则给一个较低的优先级。 每个Java程序都有一个默认的主线程,就是通过JVM启动的第一个线 程。对于应用程序,主线程执行的是main()方法。对于Applet,主线 程是指浏览器加载并执行小应用程序的那一个线程。 有一种线程称为守护线程(Daemon),这是一种用于监视其他线程 工作的服务线程,它的优先级最低。
221

第八章 多线程
Thread类和Runnable接口
程序员能控制的关键性工作有两个方面:一是编写线程的run()方法; 二是建立线程实例。Java程序实现多线程应用有两种途径: 在类中实现Runnable接口,在类中提供Runnable接口的run()方法。
class MyClass implements Runnable public void run(){ …} Thread myThread=new Thread(this); }

继承Thread类声明Thread子类,用Thread子类创建线程对象。
class ThreadA extendsThread { public void run(){ …} } ThreadA myThread=new ThreadA();

222

第八章 多线程
Thread的构造方法中包含有一个Runnable实例的参数,必须定义 一个实现Runnable接口的类并产生一个该类的实例,对该实例的 引用就是适合于这个构造方法的参数
public class MyClass implements Runnable{ Runnable{ class MyClass extends Applet implements int i; public void start(){ public void run(){ Thread(this); thread=new while (true) { thread.start(); System.out.println("Hello "+i++); } } private Thread thread; } } } Runnable target= new MyClass(); Thread t= new Thread(target); 演示示例:创建线程方法一
223

第八章 多线程
从Thread类派生出一个子类,在类中一定要实现run()
class Lefthand extends Thread { public void run(){ …… } }

然后用该类创建一个对象
Lefthand left = new Lefthand();

用start()方法启动线程
left.start();

演示示例:创建线程方法二
224

第八章 多线程
线程互斥与同步
线程的互斥 如果多个线程共享某个变量,且都对变量有修改,则要考虑多个线 程间的相互协调问题,为临界段加锁(临界段:多个线程间互斥 使用共享资源的程序段)。 通过synchronized关键字可以对共享对象的操作上锁,分为同步 块和同步方法两种方式。
同步块用来给某个对象加锁 public class MyStack { int idx = 0; synchronized(对象名){//多个线程共享的操作。} char [] data = new char[ 6]; public synchronized void push( char c) { data[ idx] = c; 同步方法利用的是this所代表的对象的锁。 idx++; } public synchronized void add(){ //多个线程共享的操作。} public synchronized char pop() { idx--; return data[ idx]; } }

225

第八章 多线程
synchronized关键字注意事项:
同步块(同步方法)内的过程是做为一个整体执行的。进入到这个同 步块内部的线程拿到这个对象的锁后,只有执行完临界段代码后才会 释放这个对象的锁,另外的线程想执行这段代码,只有等待。 多个同步块只要锁定的对象是相同的,则执行上是互斥的。 注意同步块内部是有线程切换存在的,可切换到不需进入这个临界段 的线程去执行。 注意死锁问题。

226

第八章 多线程
线程同步 多线程之间除有互斥情况外,还需要同步。当线程A使用到某个对 象,而此对象又需要线程B修改后才能符合本线程的需要,这时线 程A就要等待线程B完成修改工作,这种线程相互等待称为线程的 同步。 为了实现同步,Java语言提供wait()、notify()和notifyAll()三 个方法供线程在临界段中使用。在临界段中使用wait()方法,使 执行该方法的线程等待,并允许其他线程使用这个临界段。wait() 方法常用以下两种格式:
wait():让线程一直等待,直到被notify()或notifyAll()方法唤醒。 wait(long timeout):让线程等待到被唤醒,或经过指定时间后结束 等待。 notify():通知第一个处于等待的线程。 notifyAll():通知所有等待的线程结束等待,重新竞争CPU。
227

第九章 输入和输出流
主要内容(一般掌握3%-5%)
字节流和字符流 缓冲式输入输出 随机访问 文件对话框

考核知识点与考核要求
识记 文件随机访问方法 简单应用 缓冲式输入输出方法,使用文件对话框打开和保存文件,类 JFileChooser的使用 综合应用 File、FileInputStream、FileOutputStream、FileReader、 FileWriter对象创建
228

第九章 输入和输出流
字节流和字符流
类库java.io包支持打开流、向流写数据、从流读取数据和关闭流等 操作的类,要使用这些类,程序必须导入java.io包。 File对象 建立输入输出流对象之前可以先建立一个File对象。 File对象对应一个目录或文件,对象的属性包括文件路径、名字、 文件长度、可否读写等。 File对象只用来命名文件、查询文件属性和处理目录,不提供读 写文件操作。
File f1=new File(―myfile.txt‖); //相对路径 File f2=new File(―E:/myfile.txt‖);//绝对路径

File对象常用方法
mkdir():创建一个目录。 creatNewFile():创建一个文件。
229

第九章 输入和输出流

import java.io.File; …… File file = new File(path); System.out.println("文件或目录是否存在:" + file.exists()); System.out.println("是文件吗:" + file.isFile()); System.out.println("是目录吗:" + file.isDirectory()); System.out.println("名称:" + file .getName()); System.out.println("路径: " + file.getPath()); System.out.println("绝对路径: " + file.getAbsolutePath()); System.out.println("最后修改时间:" + file.lastModified()); System.out.println(―文件大小:‖ + file.length()+ ― 字节‖);

演示示例:File对象的使用
230

第九章 输入和输出流
流对象 Java程序的输入和输出流称为流对象。
按方向分:输入流和输出流。 按处理数据单位分:字节流和字符流。 按功能分:节点流和处理流。

输入输出流由文件名或File对象创建。java.io提供读写字节和读写 字符两种基本抽象类。

字节流用于读写二进制数据,比如图像和声音文件等。字节流读写操作 由FileInputStream类和FileOutputStream类提供支持。 字符流数据是16位的Unicode字符,读写操作由FileReader类和 FileWriter类提供支持。
231

第九章 输入和输出流
文件读写的主要操作包括:建立流对象、读数据、写数据和关闭流。
字节流读写文件 String s = "1234中国zxcv"; // 字节流读取文件 FileInputStream fis=new FileInputStream("C:\\1.txt"); byte[] b=new byte[1]; while(fis.read(b)!=-1){ //判断文件是否结尾 System.out.print((char)b[0]); } fis.close(); // 字节流保存文件 FileOutputStream fos=new FileOutputStream("c:\\1.txt"); fos.write(s.getBytes()); fos.close();

232

第九章 输入和输出流
字符流读写文件 String s = "1234中国zxcv"; // 字符流读取文件 FileReader fr=new FileReader("c:\\1.txt"); int temp; while((temp=fr.read())!=-1){ System.out.print((char)temp); } fr.close(); // 字符流保存文件 FileWriter fw=new FileWriter("c:\\1.txt"); fw.write(s+ "\n"); fw.close();

233

第九章 输入和输出流
缓冲流读写文件 当程序处理的文件按行组织,并且行不是定长。 String s = "1234中国zxcv"; // 缓冲流读取文件 FileReader fr = new FileReader(―c:\\1.txt‖); BufferedReader br = new BufferedReader(fr); String str; while ((str = br.readLine()) != null) { System.out.println(str); } // 缓冲流保存文件 FileWriter fw = new FileWriter("c:\\1.txt"); BufferedWriter bw = new BufferedWriter(fw); bw.write(s+ "\n"); bw.newLine(); bw.flush(); bw.close(); fw.close();
234

第九章 输入和输出流
public static void main(String[] args) throws IOException { int size; InputStream fileobject = new FileInputStream(args[0] ); System.out.println(―可读取的字节数: " + (size = fileobject.available())); 创建一个 char[] text = new char[200] ; FileInputStream 对象 for (int count = 0; count < size; count++) { text[count] = ((char) fileobject.read()); System.out.print(text[count]); 使用 available( ) 方法确 } 定文件的大小 System.out.println(""); fileobject.close(); } 使用 read( ) 方法一次读取 一个字符,然后将字符存储 在字符数组中并显示字符 演示示例:用FileInputStream 读文本文件
235

第九章 输入和输出流

public static void main(String[] args) { try { String str ="好好学习Java"; byte[] words = str.getBytes(); OutputStream fos = new FileOutputStream("Text.txt"); fos.write(words, 0, words.length); System.out.println("Text文件已更新!"); fos.close(); } catch (IOException obj) { 使用 write( ) 方法 System.out.println("创建文件时出错!"); 将数据写入文件 } }

演示示例:用FileOutputStream 写文本文件
236

第九章 输入和输出流
/**创建一个FileReader对象.*/ FileReader fr=new FileReader("mytest.txt"); /**创建一个BufferedReader 对象.*/ BufferedReader br=new BufferedReader(fr); /**读取一行数据.*/ String line=br.readLine(); 创建一个 FileReader 对象

创建一个 BufferedReader对象 while(line!=null){ System.out.println(line); line=br.readLine(); } /**流的关闭.*/ br.close(); fr.close(); 演示示例:用BufferedReader 读文本文件
237

第九章 输入和输出流

/**创建一个FileWriter 对象*/ FileWriter fw=new FileWriter("mytest.txt"); /**创建一个BufferedWriter 对象*/ BufferedWriter bw=new BufferedWriter(fw); bw.write("大家好!"); bw.write("我正在学习BufferedWriter。"); 创建一个 FileWriter 对象 bw.newLine(); bw.write("请多多指教!"); 创建一个 BufferedWriter对象 bw.newLine(); bw.write("email: study@jb-aptech.com.cn"); bw.flush(); fw.close();

演示示例:用BufferedWriter写文本文件
238

第九章 输入和输出流
随机访问
文件随机访问,利用RandomAccessFile类创建的流既可以随机输 出、输入。 决定是以只读方式("r " )还是以 创建一个随机访问文件
使用文件名 读写方式("rw")访问文件 myRAFile=new RandomAccessFile(String name, String mode) 使用文件对象

myRAFile=new RandomAccessFile(File file, String mode);

移动文件读写指针的方法
getFilePointer():返回文件指针的当前位置 seek(long pos):将文件指针置于指定的绝对位置,0代表文件开始 length():返回文件的长度

239

第九章 输入和输出流
文件对话框
文件对话框用于完成对文件的使用,读取文件内容,数据保存等操 作。 通过java.swing包中的类JFileChooser实现打开和保存文件对话框。 构造方法
JFileChooser():建立JFileChooser对象,默认的文件对话框路径是 用户的Home目录 JFileChooser(String currentDirectoryPath):建立JFileChooser对 象,并设立文件打开路径

其他方法
showOpenDialog():打开“打开文件对话框” showSaveDialog():打开“文件保存对话框” accept(File f):当目录中文件与筛选条件相符时,其方法返回TRUE, 并将此文件名显示在对话框中 getDescription():对筛选条件的描述,由程序指定。 setFileFilter():设置筛选条件
240

第十章 网络与数据库编程基础
主要内容(一般掌握3%-5%)
网络编程基础 数据库编程基础

考核知识点与考核要求
识记 统一资源定位符URL,socket通信C/S建立连接通信方式,数据库 的连接方法,数据源设置方法,DriverManager、Connection、 Statement、ResultSet类使用方法 简单应用 SQL语句执行,数据库查询、更新

241

第十章 网络与数据库编程基础
Java网络编程基础
网络编程是指利用不同层次的通信协议提供的接口实现网络进程 通信的编程。 网络编程中有两个主要的问题:
如何准确的定位网络上一台或多台主机, 找到主机后如何可靠高效的进行数据传输。

在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由, 由IP地址可以唯一地确定Internet上的一台主机。而TCP层则提供 面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主 要对象,一般不需要关心IP层是如何处理数据的。

242

第十章 网络与数据库编程基础
TCP/IP是一组在Internet网络上的不同计算机之间进行通信的协议 的总称,它由应用层的HTTP、FTP、SMTP和传输层的TCP及网 络层的IP等一系列协议组成。
TCP(传输控制协议)是面向连接的、可靠的点对点的传输协议。 UDP(用户数据报协议)是无连接的不可靠的传输协议。 IP是网络层协议,实现按IP地址的网络路由的功能。 IP地址:标识计算机等网络设备的网络地址,由四个8位的二进制数 组成,中间以小数点分隔。如:166.111.136.3,166.111.52.80 主机名(hostname):网络地址的助记名,按照域名进行分级管理。 服务类型(service):网络的各种服务。如:web服务,ftp服务,smtp 服务,Telnet服务等。

243

第十章 网络与数据库编程基础
支持网络通信的类java.net包

244

第十章 网络与数据库编程基础
Java网络基本类——InetAddress类 描述Internet地址的类,没有构造函数,不能用new来构造。
static InetAddress getLocalHost():返回本地主机。 static InetAddress getByName(String host):在给定主机名的情况 下确定主机的 IP 地址。 String getHostAddress():获得格式%d.%d.%d.%d的IP地址 String getHostName():获得主机名 public static void main(String[] args) { InetAddress myIp = null; try { myIp = InetAddress.getLocalHost(); System.out.println(myIp); System.out.println(myIp.getHostAddress()); //获得IP地址 System.out.println(myIp.getHostName()); //获得主机名 }catch(UnknownHostException e) {} } }

245

第十章 网络与数据库编程基础
Java网络基本类——URL(Uniform Resource Locator)类
统一资源定位器URL表示Internet上某一资源的地址 包括两部分组成:protocol://resourceName 协议名://机器名:端口号/文件名/内部引用 http://www.gamelan.com:80/Pages/network.html#BOTTOM ? 协议名(protocol)指明获取资源所使用的传输协议,如http、 ftp、gopher、file等 ? 资源名(resourceName)则应该是资源的完整地址,包括主机

名、端口号、文件名、资源中的某个特定位置 。
创建URL对象

URL gamelan=new URL("http", "www.gamelan.com", 80, "/Pages/network.html");

246

第十章 网络与数据库编程基础
一个URL对象生成后,其属性是不能被改变的,可以通过类URL所提 供的方法来获取这些属性 ? String getProtocol():获取该URL的协议名 ? String getHost():获取该URL的主机名 ? int getPort():获取URL的端口号,如果没有设置端口,返回-1 ? String getFile():获取该URL的文件名 ? String getRef():获取该URL在文件中的相对位置 ? String getQuery():获取该URL的查询信息 ? String getPath():获取该URL的路径 ? String getAuthority():获取该URL的权限信息 ? String getUserInfo():获得使用者的信息 URL url = new URL("http://java.sun.com:80/docs/index.html#DOWNLOADING"); System.out.println("protocol = " + url.getProtocol()); System.out.println("host = " + url.getHost()); System.out.println("filename = " + url.getFile()); System.out.println("port = " + url.getPort()); System.out.println("ref = " + url.getRef());

247

第十章 网络与数据库编程基础
Java网络基本类——URLConnection类
openConnection()方法,从系统获得一个URLConnection 。要接 收和发关信息需要URLConnection对象,相当于完成对指定URL的 一个HTTP连接。 程序有了URLConnection对象后,就可使用URLConnection类提供 的方法获得流对象和实现网络连接。 ? getOutputStream():获得向远程主机发送信息的 //创建一URL对象 OutputStream流对象 URL url =new URL (―http://www.javasoft.com/cgi-bin/backwards‖); ? getInputStream():获得从远程主机获取信息的InputStream流 //由URL对象获取URLConnection对象

对象 URLConnectin con=url.openConnection(); //由URLConnection获取输入流,并构造DataInputStream对象 ? connect():设置网络连接 DataInputStream dis=new DataInputStream (con.getInputSteam()); //由URLConnection获取输出流,并构造PrintStream对象 PrintStream ps=new PrintSteam(con.getOutupSteam()); String line=dis.readLine(); //从服务器读入一行 ps.println("client…"); //向服务器写出字符串 "client…"

248

第十章 网络与数据库编程基础
Java网络基本类——socket类 在Java中,基于TCP协议实现网络通信的类有两个:在客户端的 Socket类和在服务器端的ServerSocket类。SeverSocket类的功能 是建立一个Sever,并通过accept()方法监听客户端的连接请求。

服务器
ServerSocket(port#) 注册 服务 客户机 Socket(host,port#) (attempt to connect) OutputStream InputStream Socket.close()
249

ServerSocket.accept() Socker()
OutputStream InputStream Socket.close()

等待 连接

第十章 网络与数据库编程基础
客户机/服务器模式
网络应用模式主要有:主机/终端模式,集中计算,集中管理;客户机 /服务器(Client/Server,简称C/S)模式,分布计算,分布管理;浏 览器/服务器模式,利用Internet跨平台。 在客户机/服务器工作模式中,Server端要接受多个Client端计算机的 通信。除用IP地址标识计算机之外,用端口号标识正在Server端后台 服务的线程,端口号与IP地址的组合称为网络套接字(socket)。 双方实现通信有流式socket和数据报式socket两种可选方式。 流式socket是有连接的通信,即TCP(Transmission Control Protocol)。每次通信前建立连接,通信结束后断开连接。特点是 可以保证传输的正确性、可靠性。 数据报式socket是无连接的通信,即UDP(User Datagram Protocol)。将欲传输的数据分成小包,直接上网发送。无需建立 连接和拆除连接,速度快,但无可靠保证。
250

第十章 网络与数据库编程基础
Java数据库编程基础
执行 SQL 语句

客户机/服务器 应用程序

数据库

检索查询结果

ODBC

JDBC

两个常用的API
251

第十章 网络与数据库编程基础
Java数据库编程基础
应用系统是一个三层次结构:客户机与服务器采用网络连接;客 户机按通信协议与服务器服务程序通信;数据库服务程序通过SQL 命令与数据库管理系统通信。 Java程序与数据库连接
使用JDBC-ODBC桥接器与数据库连接(个人开发与测试) 用纯Java的JDBC驱动程序实现与数据库连接(生产型开发) 修 修 插入 插入 改 改

客户机/服务器 Java应用程序 GUI应用程序

Java 应用程序编 应用程序编程接口 程接口 ODBC

(开放式数据库连接) JDBC (Microsoft 提供) (Java 数据库连接) (sun公司提供)

数据库 数据库

删除

删 除 查询 查询
252

第十章 网络与数据库编程基础

Java 应用程序 JDBC API JDBC Driver Manager JDBC–ODBC桥 ODBC 纯Java 驱动

DB Server

DB Server

253

第十章 网络与数据库编程基础
使用JDBC-ODBC桥方式连接数据库
将对JDBC API的调用,转换为对另一组数据库连接API的调用 优点:可以访问所有ODBC可以访问的数据库 缺点:执行效率低、功能不够强大
DB Server Java 应用程序

JDBC API

JDBC-ODBC桥

ODBC API

ODBC层

254

第十章 网络与数据库编程基础
… 使用JDBC-ODBC进行桥连 Connection conn = null; 加载驱动 配置数据源:控制面板?ODBC数据源?系统DSN try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 编程 } catch (ClassNotFoundException e) { 必须进行相关异常处理 logger.error(e); 建立连接 } try { conn = DriverManager.getConnection("jdbc:odbc:ConnSQLServer", ―user", ―123"); System.out.println("建立连接成功!"); } catch (SQLException e) { logger.error(e); } finally { 关闭连接 try { conn.close(); } catch (SQLException e) { logger.error(e); } }
255

第十章 网络与数据库编程基础
使用纯Java方式连接数据库
由JDBC驱动直接访问数据库 优点:100% Java,快又可跨平台 缺点:访问不同的数据库需要下载专用的JDBC驱动

Java 应用程序

JDBC API

JDBC 驱动

DB Server

256

第十章 网络与数据库编程基础
… Connection conn = null; 加载驱动 try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); } catch (ClassNotFoundException e) { 必须进行相关异常处理 logger.error(e); 建立连接 } try { conn = DriverManager.getConnection( "jdbc:sqlserver://localhost:1433;DatabaseName=db", ―user", ―123"); System.out.println("建立连接成功!"); } catch (SQLException e) { logger.error(e); } finally { 关闭连接 try { conn.close(); } catch (SQLException e) { logger.error(e); } } 演示示例:使用纯Java方式连接数据库

257

第十章 网络与数据库编程基础
JDBC程序的工作原理
JDBC API
Java 应用程序 提供者:Sun公司 内容:供程序员调用的接口与类,集成 在java.sql和javax.sql包中,如: ? DriverManager类 ? Connection接口 ? Statement接口 ? ResultSet接口

JDBC API JDBC Driver Manager

JDBC 驱动

JDBC 驱动

DriverManager
提供者:Sun公司 作用:管理各种不同的JDBC驱动

Sql Server

Oracle

JDBC 驱动
提供者:数据库厂商 作用:负责连接各种不同的数据库
258

第十章 网络与数据库编程基础
JDBC API做三件事:与数据库建立连接、执行SQL语句、处理结果

Connection

2 4
数据库服务器

3
客户端

Statement ResultSet

DriverManager

1

DriverManager:依据数据库的不同,管理JDBC驱动 Connection:负责连接数据库并担任传送数据的任务 Statement:由Connection产生、负责执行SQL语句 ResultSet:负责保存Statement执行后所产生的查询结果
259

第十章 网络与数据库编程基础
try { 加载JDBC驱动 Class.forName(JDBC驱动类); } catch (ClassNotFoundException e) { System.out.println("无法找到驱动类"); } 与数据库建立连接 try { Connection con=DriverManager.getConnection(JDBC URL,数据库用户名, 密码); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1"); while (rs.next()) { 发送SQL语句, int x = rs.getInt("a"); 并得到返回结果 String s = rs.getString("b"); float f = rs.getFloat("c"); } con.close(); 处理返回结果 JDBC URL用来标识数据库 } catch (SQLException e) { e.printStackTrace(); 释放资源 }
260

第十章 网络与数据库编程基础
… 声明Statement变量 Connection conn = null; Statement stmt = null; … // 建立连接 conn = DriverManager.getConnection( "jdbc:sqlserver://localhost:1433;DatabaseName=epet", "jbit", "bdqn"); 获取Statement对象 // 插入狗狗信息到数据库 stmt = conn.createStatement(); StringBuffer sbSql = new StringBuffer( "insert into dog (name,health,strain) values ( '"); sbSql.append(name + "',"); sbSql.append(health + ","); 执行SQL语句 sbSql.append(strain + "')"); stmt.execute(sbSql.toString()); … 关闭Statement对象 stmt.close(); conn.close();
演示示例:使用Statement添加宠物
261

第十章 网络与数据库编程基础
声明Statement变量 Connection conn = null; Statement stmt = null; … // 建立连接 conn = DriverManager.getConnection( "jdbc:sqlserver://localhost:1433;DatabaseName=epet", "jbit", "bdqn"); 获取Statement对象 // 更新狗狗信息到数据库 stmt = conn.createStatement(); stmt.executeUpdate("update dog set health=80 where id=1");
… stmt.close(); conn.close();

执行SQL语句

关闭Statement对象
演示示例:使用Statement更新宠物
262

第十章 网络与数据库编程基础
Connection conn = null; Statement stmt = null; ResultSet可以理解一个二维表,每行代表 ResultSet rs = null; 一条记录,每列代表一个字段。并且存在 … 一个光标,光标所指行为当前行 conn = DriverManager.getConnection( "jdbc:sqlserver://localhost:1433;DatabaseName=epet", "jbit", "bdqn"); //查询并输出狗狗信息 执行SQL语句进行查询, 将光标向下 stmt = conn.createStatement(); 结果赋给结果集变量rs 移动一行 rs = stmt.executeQuery("select * from dog"); System.out.println(" \t\t狗狗信息列表\n编号\t姓名\t健康值\t品种"); 遍历结果集,输出所 while ( rs.next() ) { 有狗狗信息 System.out.print( rs.getInt(1) +"\t"); System.out.print( rs.getString(2) +"\t"); System.out.print(rs.getInt("health")+ "\t"); 可使用列号或 System.out.println(rs.getString("strain")); 列名标识列 } … 注意关闭顺序 rs.close(); stmt.close(); conn.close(); 演示示例:使用Statement和ResultSet查询宠物
263

第十章 网络与数据库编程基础
Statement常用方法
ResultSet executeQuery(String sql):执行SQL查询并获取 ResultSet对象 int executeUpdate(String sql):可执行插入、删除、更新等操作, 返回值是执行该操作所影响的行数 boolean execute(String sql):可执行任意SQL语句,然后获得一个 布尔值,表示是否返回ResultSet

ResultSet常用方法
boolean next():将光标从当前位置向下移动一行 boolean previous():游标从当前位置向上移动一行 void close():关闭ResultSet 对象 XXX getXXX(int colIndex):以XXX形式获取结果集当前行指定列号 值 XXX getXXX(String colLabel):以XXX形式获取结果集当前行指定 列名值
264

第十章 网络与数据库编程基础
Connection conn = null; 使用JDBC完成主人登录验证功能 Statement stmt = null; ResultSet rs = null; … // 建立连接 conn = DriverManager.getConnection( "jdbc:sqlserver://localhost:1433;DatabaseName=epet", "jbit", "bdqn"); // 判断宠物主人登录是否成功 stmt = conn.createStatement(); String sql="select * from master where name='"+name+ "' and password='"+password+"'"; System.out.println(sql); rs = stmt.executeQuery(sql); if(rs.next()) System.out.println("登录成功,欢迎您!"); else System.out.println("登录失败,请重新输入!"); … stmt.close(); conn.close(); 演示示例:实现主人登录验证

265

第十章 网络与数据库编程基础
PrepareStatement对象 创建SQL语句时,暂时用参数?表示值,然后由SQL语句对象生成 PrepareStatement对象,接着通过设定实际参数实现记录的更新。

Statement 接口 提高了代码的可读 性和可维护性 PreparedStatement接口 (预编译的 SQL 语句)

提高了安全性

提高了SQL语句执 行的性能
266

第十章 网络与数据库编程基础
声明PreparedStatement变量 Connection conn = null; PreparedStatement pstmt = null; … // 建立连接 conn = DriverManager.getConnection( "jdbc:sqlserver://localhost:1433;DatabaseName=epet", "jbit", "bdqn");
创建PreparedStatement对象 // 更新狗狗信息到数据库 String sql="update dog set health=? where id=?"; pstmt = conn.prepareStatement(sql); pstmt.setInt(1, 80); 设置每个输入参数的值 pstmt.setInt(2, 1); pstmt.executeUpdate(); pstmt.setInt(1, 90); pstmt.setInt(2, 2); pstmt.executeUpdate(); 执行SQL语句 … pstmt.close(); conn.close(); 演示示例:使用PreparedStatement更新宠物

267

复习串讲!


相关文章:
自考04747《Java语言程序设计(一)》简答题全集
自考04747《Java语言程序设计(一)》简答题全集_学科竞赛_高中教育_教育专区。自考Java语言程序设计简答题汇总1、简述 java 语言的特点? Java 语言是目前使用最为广泛...
自考04747《Java语言程序设计(一)》串讲笔记
搜 试试 7 帮助 全部 DOC PPT TXT PDF XLS 百度文库 教育专区 高等教育 工...自考04747《Java语言程序设计(一)》串讲笔记_工学_高等教育_教育专区。今日...
2015年10月自考Java语言程序设计(一)(04747)试题及答案解析
2015年10月自考Java语言程序设计(一)(04747)试题及答案解析_自考_成人教育_教育专区。2015年10月自考Java语言程序设计(一)(04747)试题及答案解析 ...
自考04747《Java语言程序设计(一)》串讲笔记
自考04747《Java语言程序设计(一)》串讲笔记_工学_高等教育_教育专区。自考串讲笔记 1.1 Java 语言的特点 Java 语言最初的应用对象是消费性电子产品。最初的名字...
2015年4月自考Java语言程序设计(一)(04747)试题
2015年4月自考Java语言程序设计(一)(04747)试题_自考_成人教育_教育专区。2015年4月自考Java语言程序设计(一)(04747)试题与答案 ...
2015年10月自考Java语言程序设计(一)(04747)试题及答案解析
2015年10月自考Java语言程序设计(一)(04747)试题及答案解析_自考_成人教育_教育专区。2015年10月自考Java语言程序设计(一)(04747)试题及答案解析 ...
自考04747《Java语言程序设计(一)》编程题全集(50题及答案)
搜 试试 7 帮助 全部 DOC PPT TXT PDF XLS 百度文库 教育专区 高等教育 ...自考04747《Java语言程序设计(一)》编程题全集(50题及答案)_院校资料_高等教育...
2015年10月自考Java语言程序设计(一)(04747)试题及答案解析[1]
2015年10月自考Java语言程序设计(一)(04747)试题及答案解析[1]_从业资格考试_资格考试/认证_教育专区。2015 年 10 月高等教育自学考试全国统一命题考试 Java 语言...
2014年4月 _Java语言程序设计(一)自考试卷及答案
http://www.8minzk.com 全国 2014 年 4 月高等教育自学考试 Java 语言程序设计(一)试题课程代码:04747 本试卷满分 100 分,考试时间 150 分钟. 考生答题注意...
更多相关标签:
自考java语言程序设计 | 04747 | 自考 汉语言文学 | 自考汉语言文学专科 | 汉语言文学自考科目 | 自考本科汉语言文学 | 自考语言类 | 自考汉语言文学专业 |