1. JAVA语言教学目标2015-10-27
《JAVA语言程序设计》知识点与教学目标
第一章 Java语言概述
序号 知识点 教学目标 学生能够了解几个JAVA发展史上的几个关键的时间(1995 JDK1.0发布;1998年1.2版本,开始称为J2SE,J2EE,J2ME;1 Java的发展历史 2004年1.5版本又称为JavaSE,JavaME,JavaEE,2009年Oracle收购Sun公司) 创始人Games Gosling,语言名字的由来(Oak—Java) 2 J2SE的学习层次 Java的领域技术有哪些? 学生能够了解本课程的几大部分: 基本语法部分、面向对象对象、应用编程部分 学生能够了解下面的关键字所服务的技术领域: J2SE、J2ME、J2EE 学生了解下面关键字的含义: 4 JDK JRE JVM的含义 JDK——Java开发工具 JRE ——Java运行环境 JVM——Java虚拟机 学生能够分析JAVA语言的特点及含义: 5 JAVA语言的特点 简单 平台无关 多线程 学生能够编写简单的程序,编译并且执行,了解执行的步骤及特6 JAVA应用程序的运行机制 点: .java编译成.class文件,.class文件由JVM解释执行,执行时动态加载代码,执行校验程序。 7 Java程序运行方式分类 Java Application——以main()方法为程序入口 Applet——嵌入到浏览器里运行 学生会下载JDK,并且会安装: 8 JDK的下载和安装 下载的网站 安装方式 JAVA程序环境的配9 置(path和学生会设置如下环境变量,并且会在DOS命令状态下编译和运行JAVA程序。 path——增加JDK安装目录下的bin文件夹 classpath——.;JDK安装目录下的lib文件夹 3 classpath)
学生会编写JAVA源程序,编译并且运行程序: 10 Java程序开发的基本步骤 编写源程序为.java文件 源程序编译为.class文件 运行 学生能配置JAVA集成开发环境: 11 集成开发环境的配置 安装JDK (JDK+Eclipse) 下载Eclipse(http://www.eclipse.org/downloads/),解压,运行eclipse.exe 学生能理解JAVA源程序的基本结构,以及main方法的作用。 12 公共类、主方法 一个源文件中只允许一个公共类 含有main方法的类为主类 理解类里main方法的作用 学生理解main方法的作用,能写出main方法的几个限定词:public static void 程序执行的入口 学生能够按如下方式输入main方法参数: 14 给main方法输入字符串参数 命令行下:java HelloWorld abc def … 集成开发环境下,对工程做设置Run Configuration——Arguments——输入执行参数(Program arguments) 简单的JAVA程序(输出字符串) 学生会如下操作: main方法中输入语句: System.out.ptintln(“Hello World!”); 学生在实际编程中,遵循良好的编程风格: 16 良好的编程风格 变量起名 缩进 学生会通过如下几种方式调试程序,找出程序中的错误: 17 调试JAVA程序 (1)通过输出信息 System.out.print()来查看变量的值 (2)设置断点,DEBUG视图下运行程序,通过查看变量的值,进行调试、纠错 学生避免如下错误: (1)公共类名与源文件名不符; 18 初学者常见错误 (2)关键字大小写 (3)类的结构不正确 (4)引号、分号等符号全角 (5)语句没有写到方法中 13 15
第二章 Java语法基础
序号 知识点 教学目标 学生记住如下规则,并在实际编程中应用: 用来标识类名、变量名、方法名、接口名、枚举名、数组名、文件名等. 1 标识符的命名规则 标识符组成: (1) 字母(英文字母或汉字) (2) 数字 (3) 下划线“_” (4) 美元符号“$”; 首字符不能为数字;所有标识符区分大小写;关键字、false、true和null不能作为标识符 学生理解变量的含义、种类、作用域,会在程序中定义变量。 含义:用来存储数据,随着程序的运行而发生改变。 2 变量 变量的种类:(1)域成员变量(在类中)(2)局部变量(在方法中、形参) 变量描述:(1)变量类型 (2)变量名 (3)存储的值 学生理解常量的含义、种类,会在程序中定义及使用常量。 3 常量 (1)常量数值:100、1323.45、 ’a’、true、false (2)局部变量中的常量:final double PI=3.1415927; 学生会从键盘输入数据: (1)利用Scanner类的对象,方法:next()、nextLine()、nextInt()、4 从键盘输入数据 nextDouble()、nextBoolean()等等 (2)BufferedReader br=new BufferedReader(new InputStreamReader(System.in))); br.readline()方法取得字符串数据,再进行格式转换 5 查看API文档 学生能够查看API帮助文档,需要时就查。 先找包,再找类,再找方法 学生能够使用如下方法得到字符串对象的字符和所包含的字符的6 初识字符串类 个数。 charAt(i)——取得索引位置为i的字符 length()——字符串的长度 7 引入包 学生会引用非默认包里的类。 对于非java.lang包的类都要用import来引入 学生熟记基本数据类型及其特点。 8 数据类型 (1)8种基本数据类型:4种整型(byte、short、int、long)、2种浮点类型(float、double)、char和boolean,它们在内存中占
据的空间不同,范围大小不同,有相应的包装类 (2)引用类型数据类型:基本数据类型之外的数据类型 学生理解数据类型精度的含义,并记住精度的变化规律。 Java中的基本数据类型所占存储空间大小不同,特定的类型占用9 数据类型的精度 的内存空间是固定的,不随操作系统的变化而变化,为JAVA实现平台无关性、可移植性提供了可能; 基本数据类型精度从低到高排序: byte-short(char)-int-long-float-double 学生理解自动装箱的概念,并在程序中加以运用,并看懂别人的程序。 从基本类型转换成Object类型,称之为装箱,该过程由编译器自动完成。 Integer integer = 10; 例中integer指向的是Integer类的实例,该实例的整数值为10。10 自动装箱 同样的动作可以适用于 boolean、byte、short、char、long、float、double等基本数据类型,分别使用对应的打包类型(Wrapper Types)Boolean、Byte、Short、Character、Long、Float或Double。 Java定义:在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,始终只存在一个对象;而如果超过了从–128到127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个 Integer对象。 学生理解自动拆箱的概念,并在程序中加以运用,并看懂别人的11 自动拆箱 程序。 从包装类转换成基本类型的操作,称之为拆箱。 该过程由编译器自动完成。 12 数据类型转换 学生掌握数据类型转换的两种方式: (1)自动类型转换 (2)强制类型转换 学生应把握自动类型转换的条件: (1)两种类型相互兼容,如均为数值型(整型和浮点型)。 13 自动类型转换 (2)由低精度的数据类型向高精度的类型进行转换(由于不同的数据类型在内存空间中所分配的空间大小是不一样的,这决定了每种数据类型的大小不同,int类型所分配的空间小于double类型,所以int类型的数据可以存储到double类型中,反之则不能
自动进行转换)。 学生会进行数据类型的强制转换: 14 强制类型转换 用“(目标类型)原始数据”来进行强制转换,适用于高精度类型向低精度类型的转换,即从大空间向小空间转换,可能发生数据的溢出 学生会在编程中使用如下运算符: 15 算术运算符 + - * / % ++ -- -(单目减) 强调:a++、a--与++a、--a有时不同,前者为先计算,后取值,后者为先取值,后计算 学生会在编程中使用如下运算符: > < >= <= == != instanceof 16 关系运算符 强调:==用于判断基本数据类型和引用型数据类型时有不同的表现:前者为数值是否相等,后者为两者是否指向同一对象,而不去比较两对象的元素值是否相同 学生会在编程中使用如下运算符: 17 逻辑运算符 && || ! ^ & | 强调:&&、|| 与&、 |都可以进行与、或运算,但二者有区别,前者有短路问题,后者没有短路的问题,前者效率更高 学生会在编程中使用如下运算符: ~ & | >> << >>> 18 位运算 注意比较:>>和 >>>的区别,前者为带符号的右移(右移时,正数前面补0,负数补1),后者为无符号右移(不管数据为正数还是负数,前者均补充0),可以通过Integer.toBinaryString(int i)来测试。 19 赋值运算符 学生会在编程中使用如下运算符: = += -= *= /= %= 学生会在编程中使用如下运算符: int flag=a>b?1:2; 学生会使用一维数值来表示一组变量,并能够进行数组上的各种操作,如赋值,参与运算等。 21 一维数组 它是引用型数据类型 声明:数据类型[] 数组名称;或 数据类型 数组名称[]; 分配空间:变量名称=new 数据类型[数组长度];(一旦分配了内存空间,它就有默认数值) 20 条件运算符
数组长度:变量名称.length 数组元素:变量名称[下标] 可以通过Arrays类的: sort方法对数值型数组进行排序 对排序后的数组利用binarySearch()方法进行查找某项数据的位置; fill()方法对整个数组进行值的填充; toString()方法对数组元素的值生成“[,,,,,,]”形式的字符串; equals()方法判断两数组元素的值是否对应相等; 学生会使用二维数值来表示一组变量,并能够进行数组上的各种操作,如赋值,参与运算等。 它是引用型数据类型,可以看成是一维数组的数组 声明:数据类型[][] 数组名称; 或 数据类型 数组名称[][]; 分配空间:数组名称=new 数据类型[数组长度[数组长度];(一旦分配了内存空间,它就有默认数值) 数组长度: 22 二维数组 数组名称.length得到一维数组的长度 数组名称[行下标n].length得到 第n行的元素的个数 数组元素:变量名称[行下标] [列下标] 可以通过Arrays类的: fill()方法对整个数组进行值的填充; deepToString()方法对数组元素的值生成“[,,,,,,]”形式的字符串; deepEquals()方法判断两数组元素的值是否对应相等。 23 数组对象间的赋值 学生能够进行数组对象的赋值操作。 用赋值运算符“=”进行操作,并没有创建新的数组对象。 学生会进行数组元素的复制: 可以使用如下三种方式之一: 1、用循环来实现: 24 数组对象元素内容的复制 遍历整个数组,将每个元素的值逐个赋值给另一数组的元素; 2、使用System.arrarycopy()方法 System.arraycopy(源数组,起始索引,目标数组,起始索引,复制长度); 说明:目标数组要提前定义,复制长度受限帛
3、Arrays.copyOf()、Arrays.copyOfRange() Arrays.copyOf(源数组,长度)、Arrays.copyOfRange(源数组,起点,终点) 说明:生成新的数组,长度不受限,原来的数组元素不足的,根据数组类型补充默认值 学生能够利用switch语句编写程序。 使用说明: 25 switch语句结构 (1)只能判断字符类型(char)和整型(int)表达式。 (2)常用于判断等值情况,区间判断仍使用if结构。 (3)根据表达式的值直接指向对应的case,直到遇到break;语句或语句块结束停止。 26
第三章 类与对象
序号 知识点 教学目标 学生理解封装的概念和含义。 1 类的封装 将属性及方法相结合,共同体现对象的特性,称之为封装。属性:对象所拥有的各种特征。 方法:对象执行的操作。 学生理解并能声明、定义类模板: 定义类的时候包含四要素:类名、属性、方法、构造方法。 类名遵循标识符规定,首字符一般大写; 属性即成员变量,类型取JAVA数据类型之一,分为实例变量和类变量,二者分配空间的时机不同,前者是对象创建时,后者是2 类的声明 类加载时; 方法含存取权限、返回值类型、方法名、参数、方法体五元素,方法体由JAVA基本语法部分构成的语句组合而成,方法形数可含不定长参数,方法可以有多种重载形式; 构造方法可以有多种重载形式,方法名与类名相同,参数可以有多种形式,无返回值。 学生会操作如何创建对象,理解系统在对象创建时完成的一系列的操作: 3 对象的创建与使用 对象的创建:用new 类名()或带参数的构造方法来创建对象,在这个过程中,分配成员变量地址,并把各成员变量的地址返回给对象的引用名称,并且分配成员方法的入口地址。 对象的使用:对象的引用名称.成员变量(或成员方法) 学生理解对象的生命周期并能在对象创建、对象回收时做一些必4 对象的生命周期 要的操作: 对象创建时增加程序代码:在构造方法中完成; 对象回收时增加程序代码:在finalize()方法完成。 5 类和对象的关系 学生能理解类与对象的关系: 类是对象的抽象,对象是类的具体化 学生能理解成员变量和局部变量的异同,并在实际编程中会加以运用: 6 成员变量和局部变量 二者数据类型:取Java中的任一数据类型(基本类型或引用类型) 有效范围不同: 成员变量:整个类内有效,与出现位置无关
局部变量:在局部范围内有效,在变量定义之后才能使用,分为以下几种局部变量:(1)方法形参——在整个方法内有效;(2)复合语句内——在该复合语句内变量声明之后;(3)循环语句内——在该循环语句内变量声明之后;(4)方法内——在该方法内声明之后。 如果局部变量与成员变量同名,则局部变量有效,成员变量被隐藏,若不想隐藏,可以加“this.”来限定变量。 学生能理解成员变量和局部变量的区别,并在实际编程中会加以运用: 成员变量的两种形式。 7 类变量和实例变量 类变量用static修饰,是所有对象共享,可以由“类名.变量名”的形式来调用,也可以用“对象名.变量名”形式来调用(推荐前者),在类加载时分配内存空间; 实例变量是属于每一个对象的,只能以“对象名.变量名”形式来调用,在用new操作时分配内存空间并赋值。 学生理解方法传递参数的特点,并注意值传递与地址传递的区别: 8 方法参数 参数传值时,将变量的值的备份传给方法的参数。 参数类型若为基本类型,为值传递;参数类型若为引用型数据类型,为地址传递。 学生理解方法重载的含义,并在编程时能够加以运用: 9 方法的重载 方法名称相同,参数个数及类型不同。 返回类型不同,不是重载 学生会灵活使用不定长参数完成一定的功能: JDK5.0以后出现的新功能。在方法中使用不定长度参数时,声明10 不定长参数 的不定长参数必须在参数行的最后一个。声明参数行在类型关键词后加上…,如:public int sum(int... nums){ …… } 其中nums是一个数组,编译器会将参数行的sum(int... nums)解释为sum(int[] nums)。 学生会使用包管理类,并在使用时引入进来: 11 包 将一组相关的类或接口封装在包(package)里,从而更好地管理已经开发的Java代码,包名体现类与接口的目录结构。 学生理解访问修饰符的含义并在实际中会加以运用: 12 访问修饰符 类的封装、信息隐藏是 OOP 最重要的功能之一,也是使用访问修饰符的原因。信息隐藏的原因包括:对任何实现细节所作的更
改不会影响使用该类的代码,防止用户意外删除数据。 访问控制符包括:public、protected、默认、private 位置 同一个类 同一个包内的类 不同包内的子类 private 是 否 否 默认 是 是 否 否 protected 是 是 是 否 public 是 是 是 是 不同包且不是子类 否 abstract 学生会定义抽象类和抽象方法,并在子类中重写抽象方法: 该关键字修饰:类和方法 13 抽象方法:提供方法的头部,但不提供方法体,是抽象(abstract)类中的方法; 抽象类:通常包含抽象方法,不能被用来生成对象,只能被继承扩展,子类继承后实现未完成的抽象方法,否则亦为抽象类。 final 可以修饰的元素:域变量、方法、类 修饰变量:变量的值不能更新;定义域变量时若未给出初值,可14 以在构造函数中设置初值;但赋值机会只有一次 修饰方法:该方法成员无法被子类重写,如: public final int getIndex(){return index;} 修饰类:表示要终止被扩展,这个类不可以被其他类继承,如: public final class Ball{……} static 学生理解关键字的含义,并在编程中能加以运用: 静态的(static)成员变量——类变量 静态的(static)成员方法——类方法 15 基于类产生的对象,会拥有各自的域成员变量。而static修饰的成员变量属于类所有,是每个对象实例所共享的域成员。静态成员的引用方式: (1)类名称+“.”+域变量/方法 (2)对象名称+“.”+域变量/方法(不推荐使用) this 使用对象的引用名称调用方法时,在方法中的每一个域成员前隐含一个this引用,它指代调用方法的对象。 (1)形式参数名称或局部变量名称与域成员名称相同时,为避免16
参数或变量覆盖域成员,必须使用this名称来指定;(2)this还可以带参数,用于调用构造函数,避免直接以构造函数的名称来调用。
第四章 类的继承与多态
序号 知识点 教学目标 拥有共有属性的一般类作为父类,根据它再编写具有特殊属性的1 子类与父类 新类,新类继承一般类的状态和行为,并根据需要增加它的状态和行为。由继承而得到的类称为子类,被继承的类称为父类(超类)。用关键字extends来实现子类的定义。 子类继承父类的成员作为自己的成员,就好像它们是在子类中直2 子类的继承性 接声明一样,可以被子类的任何实例方法调用。 (1)在同一包中的继承性——继承父类中非private的成员;(2)不同包中的继承性——继承父类中protected、public成员。 用子类的构造方法创建一个子类的对象时,子类的构造方法总是先调用父类的某个构造方法。 父类中定义的成员变量分配内存空间,同时为成员方法分配入口3 子类对象的构造过程 地址,并把引用传给变量;再为子类定义的成员变量和方法分配空间和入口地址。 由于父类成员的存取权限的限制,在子类中,某些成员没有继承到。private修饰的成员不能继承;如果父类、子类不在同一包中,友好型的成员也继承不到。 成员变量和成员方法的隐藏 子类声明的变量与父类中声明的变量重名,在子类中调用该变量时,父类变量被隐藏(可用super来调用)。 子类声明的方法与父类中相同,在子类中调用该方法时,父类方法被隐藏(可用super来调用) 。 学生掌握如下要点: 5 方法的重写 方法的重写发生在父类与子类之间,方法名相同,参数列表相同;返回类型相同或是父类返回类型的子类;子类重写方法的访问权限>=父类被重写的方法。 6 super关键字 (1)在子类的构造方法中通过super关键字可以调用父类的构造方法,但必须位于子类构造方法的第一句; (2)使用super调用被子类隐藏的成员变量和成员方法。 7 对象的上转型对象 若A是B的父类,A a=new B(); 则a是上转型对象 4
上转型对象特点: 不能操作子类新增的成员(变量和方法);可以访问子类继承或隐藏的成员变量,也可以调用子类继承的方法或子类的重写方法。 注意事项: 不要混淆父类对象、子类对象、上转型对象;可以将上转型对象转换为子类对象;不能将父类对象的引用赋给子类声明的对象。 当一个类有很多子类时,并且这些子类都重写了父类中的某个方8 多态 法。把子类创建的对象的引用放到一个父类的对象中时,就得到了该对象的一个上转型对象。该对象在调用这个方法时就可能具有多种形态,即产生不同的行为,即多态。 9 类继承的单一性 Java不支持多重继承,即直接父类只有一个。 如下方式合法:public class B exntends A{} 如下方法非法:public class B exntends A1,A2{} 100%纯抽象的类。当不同类别的事物具有同一种行为时,适合用接口。定义的形式如下: public interface AAAA 10 接口的定义和使用 { public static final 数据类型 名称=初值; public abstract 数据类型 方法名称(参数…); } (其中着重部分为默认修饰符) 使用接口的好处:(1)克服了类单继承性的不足;(2)多态使系统有了很强的可扩展性和可维护性。 11 接口回调 用接口定义的变量来调用实现类重写接口所具体化的方法,能体现方法的多态性。 表示对象是否为某类的实例的运算符。 设A为父类,B为子类,则运算符运算后具有如下结果: 12 instanceof A a=new A();B b=new B(); a instance A (true) b instance B (true) a instance B (false) b instanceof A (true) 13 14 15
第五章 异常处理
序号 1 知识点 Java异常处理机制 教学目标 在程序代码执行过程中出现异常后,会按照我们预先制定的处理方法对异常进行处理,异常处理完成后,程序会继续运行下去。 try{……可能出现异常的代码} catch(Exception1 e1) { 异常处理代码} catch(Exception2 e1) Java异常处理——try、catch、finally { 异常处理代码 } finally { 收尾工作的代码,通常对数据库断开连接,关闭输入输出流等 } 多重catch语句,定义时要注意异常类之间的继承关系,父类在后面。finally代码无论有无异常发生,都能执行到。异常被第一个匹配的类捕获到。 若异常未被捕获,则导致程序异常结束。 3 throw、throws 关键字 throw在方法中手动抛出异常;throws声明方法有可能抛出的各种异常。 Java的可检测异常和非检测异常泾渭分明。 可检测异常经编译器验证,对于声明抛出异常的任何方法,编译可检测异常和非检测异常 器将强制执行处理或声明规则。 非检测异常不遵循处理或声明规则。在产生此类异常时,不一定非要采取任何适当操作,编译器不会检查是否已解决了这样一个异常。有两个主要类定义非检测异常:RuntimeException和Error。 2 4
第六章 常用类
序号 知识点 教学目标 字符串常量也是对象,它占用内存的一个独立空间。 Java执行程序时维护一个String Pool, 对于可共享的字符串对象,先在String pool中查找是否存在,找到后返回,而不是再创1 String常量 造一个新的String对象,以减少内存的耗用。 该字符串池存放:(1)字符串常量;(2)有限个字符串常量进行“+”运算的结果;(3)由类java.lang.String的成员方法intern()创建的字符串实例对象。 该类有多种形式的构造方法,可以通过方法与字符数组和字节数组、基本数据类型的数据相互转换,使用起来相当灵活。 2 String类概述 该类提供的方法较为常用,当方法返回字符串对象时,即生成了一个新的字符串对象(不是在原来的字符串对象上进行的修改),因此当在程序中频繁使用字符串操作时,该类不是一个好的选择。 (1)字符数组→字符串 String 类的构造方法,分别用字符数组中的全部字符和部分字符创建字符串对象: String(char[]) 3 String类对象与字符数组的转换 String(char[],int offset,int length) (2)字符串→字符数组 String类提供了将字符串部分存放到字符数组中的方法:public void getChars(int start,int end,char c[],int offset) String类将字符串中的全部字符存放在一个字符数组中的方法:public char[] toCharArray() (1)字节数组→字符串 String类的两个构造方法: String(byte[] b)用指定的字节数组构造一个字符串对象。 String(byte[] b,int offset,int length) 用指定的字节数组的一部4 String类对象与字节数组的转换 分,即从数组起始位置offset开始取length个字节构造一个字符串对象。 (2)字符串→字节数组 public byte[] getBytes() 方法使用平台默认的字符编码,将当前字符串转化为一个字节数组。 public byte[] getBytes(String charsetName) 使用参数指定字符
编码,将当前字符串转化为一个字节数组。 (1)将字符串数值: java.lang.Integer类的方法: public static int parseInt(String s) 将由“数字字符”组成的字符串转换成数字。 重载形式:public static int parseInt(String s,int p) 其他类型可使用java.lang包中的Byte、Short、Long、Float、Double类调相应的类方法可以将由“数字字符”组成的字符串相应的基本数据类型数值。 Boolean.parseBoolean(String str)将字符串布尔类型数值 (2)将数值字符串: 字符串对象与基本数据类型之间的转换 String 类的类方法将数值转化为字符串 public static String valueOf(byte n) public static String valueOf(short n) public static String valueOf(int n) public static String valueOf(long n) public static String valueOf(float n) public static String valueOf(double n) Integer、Long类的类方法将数值转化为某进制的字符串 public static String toBinaryString(long i)(二进制) public static String toOctalString(long i)(八进制) public static String toHexString(long i)(十六进制) public static String toString(long i ) (十进制) public static String toString(long i,int p)(p进制) 大、小写转换、字符串替换与匹配、查询字符长度、查找字符或6 String类的常用方法 字符串位置、查找某位置的字符、判断首尾字符、去掉首尾空格、包含关系等 与String类相比较,在该类对象直接进行增、删、改、查操作,不再产生新的对象。 7 StringBuffer 它维护一个容量,当现有字符容量不能容纳追加的字符时,自动扩容。 它拥有多个方法对字符串进行各种操作。 StringTokenizer StringTokenizer(String s, String delim):为字符串s构造一个分析器。参数dilim中的字符被作为分隔标记 。StringTokenizer对5
象称作一个字符串分析器,常用方法: (1)nextToken():逐个获取字符串中的语言符号(单词),字符串分析器中负责计数的变量的值就自动减1 。 (2)hasMoreTokens():只要字符串中还有语言符号,即计数变量的值大于0,该方法就返回true,否则返回false。 (3)countTokens():得到分析器中计数变量的值。 Date类的无参数构造方法创建的对象可以获取本地当前时间。常用java.text.SimpleDateFormat来实现日期的格式化。 Date类与 4 SimpleDateFormat类 SimpleDateFormat有一个常用构造方法:public SimpleDateFormat(String pattern);用参数pattern指定的格式创建一个对象。常用方法: public String format(Date date) 格式化时间对象date。 public Date parse(String text) 解析字符串的文本,生成 Date。 在定义类或接口时在类名(接口名)之后以“ 第七章 输入输出 序号 知识点 教学目标 泛指对某设备或某环境进行数据的输入或输出。 输入:键盘、磁盘文件、网络 输出:显示器、磁盘文件、网络。 1 输入/输出概述 JAVA将输入/输出问题抽象化为流(Stream)对象来解决。 因设备或环境的不同,会有各式各样的输入/输出问题, 也有相应的流对象提供解决方案。 代表磁盘文件本身的对象,定义了一些与平台无关的方法来操作2 File类 文件,通过调用该类提供的各种方法,能够创建、删除、重命名文件,判断文件的读写权限及是否存在,设置和查询文件的最近修时间等。 public boolean exists() 判断文件或路径是否存在 public String getName() public String getPath() public String getAbsolutePath() public String getParent() public boolean exists() public boolean canWrite() public boolean canRead() public boolean isFile() 3 File类常用方法 public boolean isDirectory() public boolean isAbsolute() public long lastModified() public long length() f.length() _the length of the file in bytes. public boolean mkdir() public boolean mkdirs() public boolean renameTo(File destination) public String[] list() public String[] list(FilenameFilter filter) public boolean delete() 字节输入输出流4 (InputStreamOutputStream和及InputStream和OutputStream是各种字节输入、输出流类的父类,它们是抽象类,通过子类的对象来实现读写。 查看API文档,InputStream类基本的3种读方法,OutputStream FileInputStream、类的3种写数据的方法如下: abstract read() int 从输入流中读取数据的下一个字节。 int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。 int read(byte[] b, int off, int len) 将输入流中最多 len 个数据字节读入 byte 数组。 void write(byte[] b) 将 b.length 个字节从指定的 byte 数组写入此输出流。 void write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。 abstract write(int b) void 将指定的字节写入此输出流。 用数组形式进行读写单字节读写方式执行效率高。 读数据常用while循环来实现,以读方法的返回值是否为-1为条件来判断输入流是否读取完毕。读进来的字节数据常以new String(byte[] b, int off, int len)方法重新组成字符串对象。 FileOutputStream类等) 5 字符输入、输出流Reader类和Writer类是各种字符输入、输出流类的父类,它们是 (Reader FileReader Writer 抽象类,通过子类的对象来实现读写。 基本的读、写方法如下: int read(char[] cbuf) 将字符读入数组。 abstract read(char[] cbuf, int off, int len) int int 将字符读入数组的某一部分。 read(CharBuffer target) 试图将字符读入指定的字符缓冲区。 void write(char[] cbuf) 写入字符数组。 abstract write(char[] cbuf, int off, int len) void 写入字符数组的某一部分。 void write(int c) 写入单个字符。 void write(String str) 写入字符串。 void write(String str, int off, int len) 写入字符串的某一部分。 用数组作为缓冲区进行读写比单字符读写方式执行效率高。 读数据常用while循环来实现,以读方法的返回值是否为-1为条件来判断输入流是否读取完毕。读进来的字节数据常以new String(char[] b, int off, int len)方法重新组成字符串对象。 FileWriter等) 分 类 操作数据方式 缓冲区 不使用 使用 字节输入、输出流 用byte数组 6 字节输入输出流与字符输入输出流比较 字符输入、输出流 用char数组 用flush()方法强制输出或close()关闭流 注意: 读写数据时, 对应的输入流和输出流配合使用,读写方法要配合使用。 OutputStreamWriter:是Writer的子类,将输出的字符流变为字节流,即将一个字符流的输出对象变为字节流输出对象。 InputStreamReader:是Reader的子类,将输入的字节流变为字符流,即将一个字节流的输入对象变为字符流的输入对象。 字节流—字符流的转换流 从JDK文档中可以知道FileOutputStream是OutputStream 的直接子类,FileInputStream也是InputStream的直接子类,但是在字符流文件中的两个操作类却有一些特殊,FileWriter并不直接是Writer的子类,而是OutputStreamWriter的子类,而FileReader也不直接是Reader的子类,是InputStreamReader的子类,那么从这两个类的继承关系就可以清楚地发现,不管是使用字节流还是字符流实际上最终都是以字节的形式操作输入/输出流的。 System类提供了setIn(InputStream in)方法,用来进行标准输入标准输入、输出重定向 重定向,setOut(OutputStream out)方法,对标准输出重定向。可以利用System.in从文件里读取数据, System.out向文件输出内容。 System.in属于BufferedInputStream类的对象, System.out属于PrintStream类的对象。 1、java.io.BufferedReader br=new java.io.BufferedReader( new InputStreamReader ( System.in)); 9 从键盘上输入数据的两种方式 String str=br.readLine(); 2、java.util.Scanner sc=new Scanner(System.in); String str=sc.next(); 7 8 DataInputStream 实现了DataInput接口, DataOutputStream数据流读写类 实现DataOutput接口。两接口分别提供了读写基于基本数据类型DataInputStream 和 的方法, 如:readInt()、readBoolean() 、 readLong()、10 DataOutputStream readDouble() 、writeInt(int)、writeBoolean(boolean)、writeLong(long) writeDouble(double)。 好处: 由于JAVA基本数据类型占内存大小是固定的, 因此读写方式具有机器(平台)无关性。 这两个类将输入、输出数据暂时放在内存中的某个位置(称为缓存),读写数据时先从缓存读写,缓存空的时候才真正进行一次I/OBufferedInputStrea11 m和读写操作。两个类为InputStream、OutputStream类的对象增加缓冲区功能,默认缓冲区buf大小:8192字节,两个类的对象实例各自维护一个缓冲区。 使用read()方法读数据时,尽量将buf填满,先从buf读入,当buf中数据不足时,对象才从输入流读取数据。写数据时,先将数据写至buf中,当buf满时,才实现OutputStream对象的write()方法,将buf数据写入目的地。 ByteArrayInputStrea12 m和ByteArrayOutputStream 对象输入输出ObjectInputStream13 和ObjectOutputStream 序列化——将某对象写到文件中;反序列化——从文件中读取数据恢复成某类的对象。对象所属的类必须为序列化类,即该类必须实现java.io.Serializable接口。 序列化还有一个序号serialVersionUID,用于解决类升级的问题,如修改了类的定义后,还能把原来写出的对象数据识别成该类对象。 与输入流和与输出流类,该类可读可写,定义了基本的read方法和write方法,又包含读写基本数据类型的方法。它维护一个文件指针,可以对指针进行定位,来存取数据。有读写字符串对象的方法writeUTF() 和readUTF()。 这两个类通常用于在内存中转换数据,或进行字符编码的转换,或进行其他处理。 BufferedOutputStream类 随机存取文件类14 RandomAccessFile 15 16 17 18 19 20 第八章 多线程 序号 知识点 教学目标 程序:完成特定任务、用某种语言编写的一组指令的集合,指一段静态的代码。它作为一个静态文件存储在计算机硬盘等存储空间。 进程(Process):正在被操作系统运行的应用程序。 线程(Thread):指进程中的一个执行流程。一个进程可以由多个1 程序、进程、线程的概念及含义 别执行不同的任务。于是,在一段时间内多个任务在同时执行,但在一个时间点(同一时刻)只有一项任务在执行。即CPU只能为一项任务服务,但CPU会为多个线程提供轮回机制,每个任务都能得到CPU时间片。优先级高的得到的时间片多,优先级低的得到的时间片少。 共享信息:多个进程的内部数据和状态是完全独立的,多线程共多进程和多线程的比2 较 切换开销:线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,因此线程的切换比进程切换的负担要小。 (1)创建Thread类的子类对象,调用start()方法来运行用户线程的run()方法代码; 3 多线程的创建和启动 (2)定义实现Runnable接口的子类,使用它创建对象,以该对象作为参数,传递给Thread类,来创建线程对象,同样,启动它的start()方法来执行Runnable接口实现类的run()方法代码。 享一块内存空间和一组系统资源,有可能相互影响。 线程组成;在一个进程中可以同时运行多个不同的线程,它们分 由于JAVA类的单继承性,实现Runnable接口形式创建多线程,这种办法应用显得更加灵活,更为常用。但是,除了类的单继承性约束外,二者可以实现同样的功能。 主线程名称为main,用户创建的线程也有默认名称,分别为Thread-0、Thread-1、……。 可以利用线程对象的setName(***)、getName()来设置、取得线4 线程的基本信息(名称、优先级) 程名称;利用setPriority(**)、getPriority()来设置并取得线程的优先级。 优先级的值为1—10,可以用常量来表示:Thread.MIN_PRIORITY=1 Thread.MAX_PRIORITY=10 Thread.NORM_PRIORITY=5 void static boolinterrupt() 中断线程。 interrupted() 测试当前线程是否已经中断。 ean boolean boolean boolean 5 线程的主要方法 void void join()等待该线程终止。 join(long millis)等待该线程终止的时间最长为 millis 毫秒。 void join(long millis, int nanos) 等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。 void setName(String name) 改变线程名称,使之与参isAlive() 测试线程是否处于活动状态。 isDaemon()测试该线程是否为守护线程。 isInterrupted() 测试线程是否已经中断。 数 name 相同。 void setPriority(int newPriority) 更改线程的优先级。 static void sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。 static void sleep(long millis, int nanos) 在指定的毫秒数加指定的纳秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。 void start() 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。 static void sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。 其他方法参加API帮助文档 线程也有创建、运行到消亡的过程——线程的生命周期。 创建状态:用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于创建状态,这是线程已被创建但未开始执行的特殊状态。处于创建状态的线程,系统不为它分配资源,6 线程的生命周期 但有自己的内存空间。创建状态的线程通过调用start()方法就绪状态。 就绪状态:处于就绪状态的线程已经具备了运行条件,但还没有分配到CPU,因而将进入线程就绪队列,等待系统分配CPU。线程根据自身优先级进入等待队列的相应位置。一旦获得CPU,就进入运行状态。该状态下线程对象调用isAlive()方法将返回true。 运行状态:顺序执行自己run()方法代码,直到调用其他方法而终止,或等待某资源而阻塞,或完成任务而死亡。该状态下线程对象调用isAlive()方法将返回true。 阻塞状态:在某些情况下线程让出CPU并暂时终止运行,进入阻塞状态。下面2种原因可能引起线程由运行进入阻塞状态:执行了sleep()方法或等待I/O设备等资源。 在阻塞状态的线程不能进入就绪队列,只有当引起阻塞的原因消除才能转入就绪状态。若睡眠时间已到或睡眠被中断或等待的I/O设备空闲时,再次获得CPU时,从原来终止的位置开始继续运行。注意:若线程正在等待某个条件,那么相关联的另一个线程必须通过调用notify()或notifyAll()方法告诉正在等待的线程条件发生了变化。 死亡状态:线程生命周期中的最后一个阶段,表示线程已退出运行状态,并且不再进入就绪队列。线程的终止分两种情况:(1)自然死亡——从线程的run()方法正常退出;(2)被强制性终止——使用Thread类中的destroy()方法或stop()方法终止(很少使用)。Java系统不赞成使用destroy()方法或stop()方法终止线程,因为若使用不当,可能会导致程序的死锁。 并发线程间关系可能是以下两种:无关线程和交互线程(并发线程间需要共享资源或交换数据)。交互线程的两种关系:竞争关系和需采用线程互斥方式解决共享资源的冲突问题。 线程之间的关系(线7 程的控制与协调) (1)无关线程 多个就绪线程随机执行,执行顺序不能确定; (2)竞争线程 多个线程共同竞争某个资源,解决竞争需要用synchronized解决同步问题; (3)需要协调与通信的线程 利用wait(),notify()和 synchronized来解决同步与协调问题。 第九章 网络编程 序号 知识点 教学目标 此类表示互联网协议 (IP) 地址。 该类没有公开的构造方法,但可以通过该类的静态方法得到实例对象。常用的有: static getByAddress(byte[] addr) 在给定原始 IP InetAddress 地址的情况下,返回 InetAddress 对象。 static getByName(String host) 在给定主机名的情况InetAddress 下确定主机的 IP 地址。 1 java.net. InetAddress static getLocalHost() 返回本地主机。 InetAddress 该类的常用方法: StringetHostAddress()返回 IP 地址字符串(以文本表现形g 式)。 StringetHostName() 获取此 IP 地址的主机名。 g 类 URL 是网络资源定位器(Uniform Resource Locator), 指向网络(World Wide Web) 上的一个资源。 URL的组成部分可以分成五个部分:Protocol、Host、Port范围: 0-65535 (16 bits)、File、Reference. 常用的构造方法: 2 java.net.URL URL(String spec) 根据 String 表示形式创建 URL 对象。 URL(String protocol, String host, int port, String file) 根据指定 常用成员方法: protocol、host、port 号和 file 创建 URL 对象。 String String String int String String getFile() 获取此 URL 的文件名。 getHost() 获取此 URL 的主机名(如果适用)。 getPath() 获取此 URL 的路径部分。 getPort() 获取此 URL 的端口号。 getProtocol() 获取此 URL 的协议名称。 getRef() 获取此 URL 的锚点(也称为“引用”) InputStream openStream() 打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。 其中openStream()方法返回InputStream,可以利用该输入流来读取网络资源的内容。 服务器端程序设计步骤: 1、服务器端创建 java.net.ServerSocket实例对象,注册端口号,设置允许连接的最大客户数目; 2、调用ServerSocket的accept()方法等待并监听有无客户端的连接,有客户建立连接时,accept()方法返回套接字(Socket实例) Socket编程—— 3 基于TCP的网络程序设计步骤 3、利用Socket类的方法getInputStream和getOutputStream获得套接字所对应的输入流和输出流; 4、利用输入流和输出流与客户交换数据; 5、通信结束,关闭输入流、输出流、套接字。 客户端程序设计步骤: 1、创建java.net. Socket实例对象(需要指定服务器的主机名及端口号),与服务器建立连接; 2、利用Socket类的方法getInputStream和getOutputStream获得套接字所对应的输入流和输出流; 3、利用输入流和输出流与客户交换数据; 4、通信结束,关闭输入流、输出流、套接字。 说明:对于服务器和客户端来说,一方的输入流是另一方的输出流,输入输出完毕,要关闭输入输入流和Socket对象。通常,服务器端程序先启动,通过循环来接受客户端的信息,为客户端服务。 其中涉及到的类有:ServerSocket、Socket类 两类的构造方法: (服务器)ServerSocket ss=new ServerSocket(10000); java.net.ServerSock4 et和 java.net.Socket类 Socket socket=ss.accept(); (客户端) Socket socket=new Socket(host,10000); Socket类的常用方法: getInputStream()——得到网络输入流 getOutputStream()——得到网络输出流 利用输入、输入流对信息进行读写。 UDP是一种简单的不可靠的无连接的网络数据传输协议。UDP传输数据涉及到的类: 数据传输通过数据报套接字(DatagramSocket) Socket编程—— 5 基于UDP的网络程序设计 传输的数据格式:数据报包(DatagramPacket) 设计思路:对于服务器和客户端来说,一方的输入流是另一方的输出流,输入输出完毕,要关闭输入输入流和DatagramSocket对象。 通常,服务器端程序先启动,通过循环来接受客户端的信息,为客户端服务。 涉及到的类有:DatagramSocket、DatagramPacket类,前者是运输器,后者是数据包。通过前者对后者进行发送或接收。 DatagramSocket类的构造方法: java.net. 6 DatagramSocket和java.net. DatagramPacket类 (服务器)DatagramSocket ds=new DatagramSocket(10000); (客户端) DatagramSocket ds=new DatagramSocket(); 常用方法:ds.receive(dp)——接收数据,存到dp对象里;ds.send(dp)——发送dp数据包里的数据。 DatagramPacket类的构造方法: 接收时 DatagramPacket dp=new DatagramPacket(byte[] b,int length); 发送时DatagramPacket dp=new DatagramPacket(byte[] b,int length,InetAddress ip,int port); 第十章 图形用户界面 序号 知识点 java.awt包与1 javax.swing包在GUI程序设计时的联系与区别 教学目标 早期版本的GUI组件所在的包: java.awt,特点:与平台相关性较强(heavyweight),与JAVA所宣称的一次编写,处处运行的理念不符,表现在:虽然能运行,但在不同系统上运行的界面外观不同;升级版Swing GUI 组件所在的包: javax.swing,特点:Swing组件的平台相关性较小(lightweight)。 组件和容器是Swing图形用户界面的组成部分(容器本身也是组件)。通常将它们按照一定的布局方式添加到给定的容器中,给组件和容器添加事件处理程序实现人机交互。 基于Swing组件的图形用户界面,采用JFrame框架窗口作为顶层容器。 构造方法:JFrame()创建一个不可见不含标题的初始框架;JFrame(String title)创建一个不可见含标题的初始框架 一般情况下,新创建的框架需要进行属性设置才能正常工作:setDefaultCloseOperation(int opertion) ,其中参数取值: JFrame.DISPOSE_ON_CLOSE //释放资源 3 JFrame类 JFrame.DO_NOTHING_ON_CLOSE //什么也不做 JFrame.HIDE_ON_CLOSE //隐藏并释放窗体 JFrame.EXIT_ON_CLOSE //程序退出 常用方法: setSize(int width,int height) //设置窗口大小 setVisible(boolean b) //设置窗口是否可见 public Container getContentPane()//得到框架的内容窗格 setLayout(LayoutManager mgr)——设置布局 可响应的事件参加API帮助文档。 对话框用来设计具有依赖关系的窗口。它可以依赖于某顶层容器,随着顶层容器显示或隐藏,也可以独立运行。 依赖于某对话框的构造方法:public JDialog(Dialog owner, String 4 JDialog类 title, boolean modal) 依赖于某框架的构造方法:public JDialog(Frame owner, String title, boolean modal) 对话框分类:模式对话框、无模式对话框,由构造方法的第三个参数而定。 2 图形用户界面的整体思路 系统提供的一些常用标准对话框(模式对话框),含有如下的静态方法显示不同类别的对话框。 5 JOptionPane类 showConfirmDialog 询问一个确认问题,如 yes/no/cancel。 showInputDialog 提示要求某些输入。 showMessageDialog 告知用户某事已发生。 showOptionDialog 上述三项的大统一 (Grand Unification)。 一种中间容器,用来组成其它组件,可以添加各种组件(包括面板组件)。面板(JPanel)的大小一般由它所包含的组件决定,随着组6 JPanel类 件个数增加,面板(JPanel) 随之增大。也可使用setPreferredSize(Dimension preferredSize) 方法设置此组件的首选大小; 使用方法setBackground(Color bg)设置面板的背景颜色。 JRadionButton 和JCheckBox类 常用方法: setSelected(boolean b)和isSelected()。JRadionButton对象使用时要将相关按钮放置于一个按钮组中,同一组的按钮只能选择一项。 通常用于展示数据,在构造对象时,可以直接赋值,也可以通过方法增加列表项,选择列表项,得到列表项的索引和值。 为GUI提供文本或图像信息。常用构造方法: public JLabel(String text)、public JLabel(Icon icon)、public JLabel(String text, Icon icon, int horizontalAlignment)。 常用成员方法: 9 JLabel setText(String text)、setIcon(Icon alignment)icon)、、7 8 JComboBox和JList setHorizontalAlignment(int setHorizontalTextPosition(inttextPosition) //水平向文本相对于图标的位置 setVerticalAlignment(int alignment)、setVerticalTextPosition(int textPosition) //竖直向文本位置 滑动条提供以图形的方式表示数值(有限的整数区间内的一个值)。10 JSlider类 对于该类对象,通常设置与获得如下属性:最小值、最大值、当前值、走向。 JTextField类和两个类均用来编辑单行文本,前者看到输入的字符,后者以“*”号显示。 在编辑框中键入回车键时,激发ActionEvent事件。 放置多行数据的文本区域不能自动进行滚屏处理。若要进行滚屏11 JPasswordField类 JTextArea类 12 处理,通常将文本区域控件放置于滚动窗格(JScrollPane)中。 13 容器的布局 给容器设置布局管理器的方法:setLayout(LayoutManager mgr)。设置布局后,用add(Component component)向容器中增加组件。不设置布局管理器,采用默认的布局管理器。 常用容器的默认布局: 容 器 javax.swing.JApplet javax.swing.JFrame javax.swing.JDialog javax.swing.JPanel 默认布局管理器 BorderLayout BorderLayout BorderLayout FlowLayout 备 注 顶层容器 顶层容器 顶层容器 中间容器 14 FlowLayout 最基本的布局管理器,java.awt.Applet、java.awt.Panel 和 javax.swing.JPanel的默认布局方式。特点:按行布局,从左到右依次放置GUI组件。每行组件的对齐方式常量: 左对齐 FlowLayout.LEFT、中间(默认) FlowLayout.CENTER、右对齐 FlowLayout.RIGHT。 15 GridLayout 将容器划分为大小相等的若干行乘若干列的网格。特点:从左至右、从上至下排放,行优先,每个组件占一格。如果组件个数>网格个数,将自动增加网格(行保持不变,增加列数);如果组件个数<网格个数,有的网格闲置。通过构造方法或 setRows 和 setColumns 方法指定行数和列数(非零值),指定的列数将被忽略,而按照行优先的原则重新计算。只有行为0时,列有效,按照列计算行数。 16 BorderLayout 容器JFrame、JApplet、JDialog的默认布局方式。将容器分成五个区域:NORTH (顶部)、SOUTH(底部)、WEST (左侧)、EAST (右侧)、CENTER (中间)。每个区域最多只能1个组件。向容器中加组件使用方法add(Component com , “Center”);[“West”“Ease”“North”“South”“Center”或BorderLayout.EAST BorderLayout.NORTHBorderLayout.WEST、、BorderLayout.SOUTHBorderLayout.EAST、、BorderLayout.CENTER ] 17 18 BoxLayout CardLayout 多个组件在容器中沿水平或竖直方向排列。 该布局方式类似码“扑克牌”,一个组件压在另一个组件的上面,每次只能看到一个组件。直接翻到指定名称的组件,不改变组件间的相对顺序,如果指定组件找不到,不进行任何操作。 如果容器或顶层容器的内容窗格的布局方式为CardLayout,添加组件的方法为:public void add(Component comp, Object constraints)。其中:comp为新加入的组件,constraints指定组件comp的名称(字符串)。说明:新加入的组件放在已加入组件的上面。 显示或激活下面组件的方法:public void next(Container parent) 将当前组件放置到最后面,把下一个组件变成当前组件。 直接翻转到指定组件的方法:public void show(Container parent,String name),其中parent目标容器,name组件名称; 直接翻到指定名称的组件,不改变组件间的相对顺序,如果指定组件找不到,不进行任何操作。 19 组合布局方式 容器的嵌套,被嵌套的容器可以具有不同的布局管理器。在嵌套的布局管理器中,JPanel 通常起到了“桥梁”的作用。 20 容器中加组件与移除组件的方法 Component add(Component comp) 将指定组件追加到此容器的尾部。 Component add(Component comp, int index) 将指定组件添加到此容器的给定位置上。 void add(Component comp, Object constraints) 将指定的组件添加到此容器的尾部。 void add(Component comp, Object constraints, int index) 使用指定约束,将指定组件添加到此容器的指定索引所在的位置上。 Component add(String name, Component comp) 将指定组件添加到此容器中。 void remove(Component comp)从此容器中移除指定组件。 void remove(int index) 从此容器中移除 index 指定的组件。 void removeAll() 从此容器中移除所有组件。 如果在窗口已经显示出来以后再进行组件的增减,要validate()刷新页面显示。 21 事件驱动 GUI是由事件(event)驱动的,用户与GUI交互产生事件(events)。一些常见的交互方式:移动鼠标、用鼠标点击按钮、在文本框中输入数据、关闭窗口等。 22 常见事件及触发动作 ActionEvent 动作事件——事件源:命令按钮、文本编辑框、密码式文本编辑框;触发动作:鼠标单击按钮、在文本框中按上 回车键。 ItemEvent 项事件——事件源:复选框、单选按钮、组合框;触发动作:鼠标左键单击选择项引起选择项状态发生改变时。 ListSelectionEvent 列表选择事件——事件源:JList列表框;触发动作:鼠标左键单击列表框中的项目时。 DocumentEvent文档事件——事件源:文本编辑框、密码编辑框、文本区域;触发动作:编辑区内容发生改变时。 23 响应事件的步骤 (1)事件源组件注册事件监听器 组件类声明了注册特定事件监听器的方法:add***Listenter(***Listener l)。例:按钮增加单击事件button1.addActionListener(al)。 (2)定义监听器处理程序,可用三种方式来实现:内部类、匿名类、窗口类。 内部类:在自定义的窗口类(JFrame的子类)中定义内部类,用该内部类生成对象作为监听器的处理程序。如:鼠标点击按钮button1后,在JLabel控件label1内显示信息“button1”的定义方式为: class MyActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { if(e.getSource()==button1) { label1.setText(e.getActionCommand()); } } 利用上述类定义对象作为button1注册的单击事件的监听器对象,button1.addActionListener( new MyActionListener())。 匿名类:在给按钮注册监听器时直接定义对象,上例中的程序修改为: button1.addActionListener( new MyActionListener( { } public void actionPerformed(ActionEvent e) { …………………… //与上例相同 } )); 窗口类:自定义的窗口实现ActionListener接口,因此,该类实现接口的抽象方法,因此它所代表的当前对象是监听程序的承担者。代码变为: class MyFrame extends JFrame implements ActionListener { ………… button1.addActionListener(this); ………… public void actionPerformed(ActionEvent e) { } …………………… //与上例相同 } 三种方法实现监听都比较常见。 24 事件适配器类(Adapter) JDK提供了诸多的适配器类实现了监听接口,如KeyListener接口的实现类为KeyAdapter,MouseListener接口的实现类为MouseAdapter。用户可以用适配器类来完成事件处理,只重写所需要处理的方法即可。这样可以解决在视觉上的方法内无代码的问题(因为用接口来处理事件,不管用户是否对接口中的方法感兴趣,在形式上都要写全。如果用适配器类来处理,只重写需要的方法即可)。 25 窗口的菜单设计 框架JFrame类有一个方法setJMenuBar(JMenuBar menubar),设置菜单条。菜单条内用add()方法加入菜单JMenu,菜单内用add()方法加入菜单项JMenu。 菜单或菜单项用setMnemonic(char c)来设置助记符(Alt+助记符用来打开菜单),菜单项用setAccelerator(KeyStroke)来设置快捷键。为某菜单项设置快捷键“Ctrl+S”的方法为: mi_save.setAccelerator(KeyStroke.getKeyStroke(KeyEvnet.VK} _S,InputEvent.CTRL_MASK)); 为菜单项加响应事件的代码的方法:mi_save.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { …………………… } }); 26 第十一章 数据库编程 序号 知识点 教学目标 JDBC(Java Data Base Connectivity):用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问。对于任何一种DBMS,只要提供了相应的JDBC驱动程序,就可以通过JDBC程序对该数据库进行操作。 1 JDBC 将Java语言和JDBC结合起来使程序在任何平台上运行。 常用的JDBC如下: mysql-connector-java-5.1.18-bin.jar(MySQL数据库) ojdbc.jar(Oracle数据库) sqljdbc.jar(SQLServer数据库 2005) sqljdbc4.jar(SQLServer数据库 2005或2008) 准备数据库、连接数据库、执行SQL语句进行数据库操作、2 Java数据库程序设计步骤 关闭连接。 首先将相应DBMS的JDBC连接JAR包配置到工程中,然后在程序中加载驱动程序,获得连接对象。如: mySQL数据库连接: Class.forName(\"com.mysql.jdbc.Driver\"); String url = \"jdbc:mysql://localhost:3306/test\"; Connection con = DriverManager.getConnection(url, \"root\3 常见数据库连接 \"123\"); SQLServer数据库连接: Class.forName(\"com.microsoft.sqlserver.jdbc.SQLServerDriver\"); String =\"jdbc:sqlserver://localhost:1433;DatabaseName=test\" Connection con = DriverManager.getConnection(url, url \"sa\Oracle数据库连接: Class.forName(\"oracle.jdbc.driver.OracleDriver\"); String sourceURL = \"jdbc:oracle:thin:@127.0.0.1:1521:orcl\"; Connection c = DriverManager.getConnection(sourceURL, \"sa\\"123\"); (1)加载JDBC驱动 SQL语句的执行14 (数据表的增、删;记录的增、删、改;列的增、删、改) (2)得到数据库连接对象(如:con) (3)创建语句对象(如:st) (4)准备字符串对象(如:sql)存储即将执行SQL语句 (5)执行SQL语句(如:st.executeUpdate(sql);) (6)关闭语句对象、数据库连接对象 (1)加载JDBC驱动 (2)得到数据库连接对象(如:con) SQL语句的执行25 (数据表记录的查询) (3)创建语句对象(如:st) (4)准备字符串对象(如:sql)存储即将执行SQL语句 (5)执行SQL语句返回结果集对象 (如:ResultSet rs=st.executeQuery(sql);) (6)对结果集进行遍历或其他操作 (7)关闭结果集、语句对象、数据库连接对象 表示结果集。 (1)结果集类型: TYPE_FORWARD_ONLY光标只能向前移动的 ResultSet 对象的类型。 TYPE_SCROLL_INSENSITIVE可滚动但通常不受 ResultSet 底层数据更改影响的 ResultSet 对象的类型 6 ResultSet接口 TYPE_SCROLL_SENSITIVE 该常量指示可滚动并且通常受 ResultSet 底层数据更改影响的 ResultSet 对象的类型。 (2)并发性 CONCUR_UPDATABLE 该常量指示可以更新的 ResultSet 对象的并发模式。 CONCUR_READ_ONLY 该常量指示不可以更新的 ResultSet 对象的并发模式。 (3)常用方法: 取得记录中数据:它维护一个指针,指向某条记录,有多种取得某列数据的方法。如: getString(int colIndex) getString(String colName) getXxxxx(int colIndex) getXxxxx(String colName) 记录指针的移动: first() last() beforFirst() afterLast() absolute(int n) moveToCurrentRow() moveToInsertRow() 等等 判断记录的位置:isFirst() isLast()isBeforeFirst() isAfterLast() 更新当前行数据:updateXxxx(int colIndex,xxx data) updateRow()——用此 ResultSet 对象的当前行的新内容更新底层数据库。 其他方法见API帮助文档。 对列属性的查询可以通过结果集来进行。 (1-5)同SQL语句的执行3(数据表记录的查询) SQL语句的执行37 (数据表列属性的查询) (6)得到结果集的元信息ResultSetMetaData对象 (如:ResultSetMetaData rsmd=rs.getMetaData();) (7)通过ResultSetMetaData对象来获取列数、第n列列名、类型、长度等信息 (8)关闭相关的对象 (1)对于数据库的表,建立与之相对应的类; 8 将表中数据进行封装 (2)从数据库中检查出来数据,封装成对象 (3)将对象加到链表中,以便于下一步使用。 表示语句对象的接口。分几种情况进行创建和使用: (1)增删改操作的语句对象,使用连接对象调用createStatement()方法进行创建,调用它的executeUpdate(String sql)方法执行SQL语句; (2)查询只读、顺序读取的表记录时,使用连接对象调用9 Statement createStatement()方法进行创建,调用它的executeQuery(String sql)方法得到结果集; (3)查询随机读取和并发结果集的表记录时,使用连接对象调用createStatement(int rsType,int rsConcurrency)方法进行创建,调用它的executeQuery(String sql)方法得到结果集。如果定义了可并发的结果集,在此结果集中可以进行数据的更新,然后使用 ResultSet对象的updateRow()对数据库进行更新。 表示预编译语句对象的接口。通常在执行SQL语句中有未知变量时使用。使用步骤: (1)加载JDBC驱动 (2)得到数据库连接对象(如:con) (3)创建预编译语句对象 (如:pst=con.preparedStatement(String sql);) 10 PreparedStatement (4)对SQL语句中的未知数赋值,如: pst.setXxxx(int colIndex,xxx data); (5)执行SQL语句返回结果集对象 (如:ResultSet rs=pst.executeQuery();或 int count=pst.executeUpdate();) (6)对结果集进行遍历或其他操作 (7)关闭相关对象 因篇幅问题不能全部显示,请点此查看更多更全内容