|
z前言 C/C++与java比较
C/C++ java 全局变量 有 没有。 (在类中定义) goto语句 有 没有。 用异常处理机制(try-catch) 指针 有,指针运算非常灵活 没有指针操作,运算。 用类实现数组 内存管理 C:malloc(),free() C++:new , delete new(授予处理权限) 数据类型的支持 int IBM pc 16位 VAX 32位 int 32位 java是一致的 类型转换 非常灵活 严格运行时检查是否兼容 头文件 全局变量、函数声明、类的声明 没有。 (final static) 结构体和联合合 有 没有 预处理 有 宏定义 没有 字符串 字符数组 类(字符串类) 预算符重载 有 没有 多重继承 支持 不支持(用接口达到多重继承) 布尔型和整型的关系 相互转换 1 true 0 false 不允许 %和%=操作(取余) 整数类型 整型和浮点型
Java语言最大的优点??可移植性 Java 版本 1 J2SE(标准版)中型平台 standard edition 2 J2EE(企业版)大型平台 Enterprise edition 3 J2ME(微型版)嵌入式 Micro Edition
第一章 Java入门 1. Java application 基本语法结构 A)程序创建 1. 文件扩展名: . java 2. 文件名必须与公有类(public)的类名完全相同 3. java程序至少包含一个类 4. 可以把两个类放在一个文件中,但一个文件中只能有一个类是公有的。 5. 每个java application必须有一个main()方法,他定义了程序从何处开始执行java解释器通过调用main()方法来执行application程序 6. Java源程序分区大小写 B)编译程序 javac xxx.java 编译后产生 xxx.class 文件 一个类对应一个 . class文件 ,原文件中有几个类就对应有几个 . class文件 C)程序的执行 java xxx 2. Java applet 基本语法结构 a) applet的创建 (1).公有类必须继承java.applet.Apple继承用关键字extends (2).applet不需要main()方法,因为applet不需要有java解释执行 (3).void paint(Graphics g)是applet显示图形的方法 (4).import是软件中用的重要手段 b) applet执行 (1) 浏览器地址拦中输入完全路径 (2) 命令提示符输入:appletviewer xxx.html Java程序错误:(1)编译错误 == 语法错误 (2)运行时错误 Java按运行环境分为三种 1. java application 操作系统 2. applet 浏览器 3. servlet web服务器
第二章 数据基本类型和基本操作 程序 基本数据类型 基本操作 硬件 内存、寄存器 CPU
1. 标识符:常量、变量、方法、类、对象 (1) 首字母:字母、_ 、$ (2) 不能使用关键字,不能包含运算符 标识符命门规则:P23 2. 变量:存储数据 (存储区域和操作) 3. 常量:用关键字final定义。例如:final PI = 3.14; 4. 数据类型 1)简单型 (1)字符型 (2)数值型 整型 byte short int long (4种) 实型(浮点型) flout double (3)逻辑型 true false 2)复合型 类 数组 字符串 5. 类型的转换 java只能允许字符与数值的转换 数值 <===> 字符 两种转换: 1强制转换: int i=(int)’a’将a强制转换为整型i 2隐藏转换:精度 低-高 a)不同类型转换:数值与字符型 (强制转换) b) 同种类型转换 数值型内部 (1)精度低??>高(隐藏转换) (2)精度高??>低(强制转换) 例如: Float i=(float)0.0 或 float i=0.0f 高转低需要强制转换 C/C++:ASCII (8位) Java编码制: Unicode (16位) ‘\uxxxx’ 6.&&、|| 条件与/或 推荐使用 执行效率高 符合人的思维 &、| 无条件与/或 double?> float?> long?> int?> short?> byte 64 32 64 32 16 8 7.编程风格 命名习惯P34
第三章 控制语句 一、程序的基本结构的代构件表示
二、注意事项 1 if-then-else (1) if(i=1)布尔表达式应用括号 (2) if嵌套风格 if(){} else if(){} else if(){} else if(){}
2 switch (1)switch (~)括号 (2)switch表达式要能计算出一个char,byte,short,int的值(只能是这四种) 3 while循环 和do-while选还 while 先判断后执行(for 等价于 while循环) do-while先执行后判断 三、关键字break和continue的区别 1.不带标号 break中止最内层循环,continue中止最内层循环的本次迭代(循环次数一次是一个迭代) for (int i=1;i<=5;i++) { If(i==3)break; 或是continue; System.out.println (“ok!”); } Break执行结果 ok! //1 ok! //2 Continue执行结果 ok! //1 ok! //2 ok! //4 ok! //5 2.带语句标号 break中止标号标记的循环,continue中止标号标记的循环的本次迭代 layer1: for(~~~) { Break layer1 }
第四章 方法(函数) 引用(调用):类名.方法名(); [m] static返回型 方法名(参数1 ,参数2....) {........; ........; return; return 变量名/表达式 } 参数: 定义:形参 调用:实参 参数传递的两种方式: (1) 传值(基本数据类型) (2) 传址(复合数据类型:类,数组,字符串) public static int max(int a,int b){...} public static double max(double a,double,b){...} 定义时: 类中的方法 引用时: 类名.方法名(); 调用< 值 语句void 区别方法的不同:方法名+参数类表(类型,个数,顺序) 引用方法的两种方式:1)当成值(有返回值) 2)当成语句(无返回值)
第五章 使用对象和类编写程序 一,类的uml表示法 二,类的定义 [m] 修饰符 [m] class classname extends superclass_name1, superclass_name1 implements implements1, implements2 { 属性 方法 } [m] 修饰符: 1,可见性修饰符: public 所有包中 default(不写) 本包中 2,性质修饰符: abstract 抽象类??必须被扩展才能生成对象 final 终极类??不能被继承扩展 三,对象的声明和创建 1,声明: 类名 对象名; 简单数据类型名 变量名; 2,创建: 对象名=new 类名(); 3,声明+创建:类名 对象名 = new 类名(); 四,构造方法(constructor) ??初始化对象的数据 1,方法名与类名完全相同 2,构造方法可以有多个运行时重载 3,没有返回值类型,连void也没有 4,方法调用:调用时使用new操作符。 例如:类名 对象名 = new 类名( ); 5,默认构造方法:没有参数 6,不定义任何构造方法,系统会隐含提供一个默认的构造方法 定义了若干个构造方法,系统不会再提供默认的构造方法 7,构造方法的可见性修饰符: public 任何包中都可以调用 defaut 本包中 private 该类不能创建实例(math类)//
五,实例变量/方法<??>类变量/方法 ㈠实例变量(instance variable):[m] 类型名 变量名 类变量(class variable): [m] static 类型名 变量名 a)类变量:描述对象的公有属性,只能有一个副本, b)实例变量:描述对象的特有属性,有多个副本, ㈡实例方法:只能在实例创建后使用。[m] 返回型 方法名(参数1 ,参数2....) 类方法:可在实例创建前后使用。[m] static返回型 方法名(参数1 ,参数2....) 例如:Math.sqrt(); ㈢实例变量/方法的引用 对象名.data/method 类变量/方法的引用 ① 对象名.data/method ② 类名.data/method (推荐使用) ㈣实例变量不可能被类方法访问。 ㈤类成员储存在类的公用内存, 实例成员在每个实例中都有副本。 六. 全局变量和局部变量的比较 1.全局变量(Globle):实例变量+类变量。 局部变量(Local): 方法中定义的变量。 例如: class A { 变量 ??>全局变量 方法 { 变量 ??>局部变量 } } 2.初始化:Globle 有默认初始值。char “\u0000”, 整型 0 , 浮点型 0.0 , boolean false 类对象变量 null Local 没有。 3.作用域(变量可以被引用的区域): Globle:整个类;可在任何位置声明,没有顺序关系。 Local:从声明处开始延续到块尾,要先声明再使用。 4.声明次数: Globle:只有一次。Local:在互不嵌套的情况下可以声明多次。 5.同名:a.当Globle与Local同名时,L优先,G隐藏。 b.若想引用: 类名.变量名; (类变量) this.变量名。 (实例变量) 七. 关键字 this 用途1:引用实例变量 实例方法 构造方法 在实例方法或构造方法中访问隐藏的实例变量 例如:class A { int i = 5; void setI(int i) { this.i = i;} } 2:this() 语句(可有参数) Java要求this()语句出现在构造方法中的任何语句之前 例如: class Circle { int radius; circle(int r) { this.radius=r; } circle() { this (5);} } 八. 类成员的可见性修饰符 public:任何包中 defaut(不写): 本包中 private: 本类中??本类中使用,不能继承,不能在子类中访问 protected: 子类中?? 可以被同一包中的任何类或它的子类访问,即使子类在不同的包中也可以,但不能被继承 九.字符串 ㈠String类 java.lang.String (1)创建: ①String 变量名=new String("IBM"); ②String 变量名="IBM"; (2)常用方法 ①比较:"= =" 检验两个字符串变量是否引用同一对象(地址) equals()检验来那个字符串变量是否引用同一对象(值) ②其他:P124-126 ㈡StringBuffer类 java.lang.StringBuffer P126 ⑴创建: StringBufer 变量名=new StringBuffer(D) StringBuffer类提供三个构造方法 ㈢StringTokenizer类 (解析字符) java.util.StringTokenizer P128 ⑵创建 new. StringTokenizer st=new StringTokenizer("i am a student")
十.访问器方法 P103 ①读取方法(getter) ②设置方法(setter) 十一.垃圾回收 P97
第六章 类的继承性 类:继承??重用性, 多态--扩展性 一、子类 extends 父类--扩展:子类的属性和方法:增加新的,修改父类的 1.父子类属性同名:父类隐藏 子类引用父类:实例变量:a) super.data b) ((父类/祖类)this).data c) ((父类/祖类)对象名).data 类变量: a)上面三种 c)父类/祖类.data 2.父子类方法相同(同名,同参) 实例方法:子类覆盖父类,子类中所有方法都可以引用父类??支持多态性 子类引用父类:super. method(); 类方法:子类隐藏父类(能找到) 子类引用父类:a) super. method(); b) ((父/祖)this).method(); c) ((父/祖)对象名).method(); d) 父类/祖类.method(); (比较好的引用方法) 3.所有属性和方法可以用super引用 4.父类属性和父类方法都可以用类名引用。 注意:子类向上转型为父类后,父类的所有成员都可见(除实例方法),子类所有成员都隐藏(除实例方法) 二、父类与子类的兼容性 多态性:运行时选择执行代码段的特性 父类和子类之间的类型转换 1父=子 总可以进行,不需要类型转换 2子=(子)父 可进行但运行时会检察 父类变量持有: 正确子类型 正常执行 不相关的类型,会抛出一个class+Exception 3不相关的任何类型间不能进行类型转换 一般能容纳具体。把具体对象当作一般对象处理 父类对象变量持有子类对象变量 多态性实现了“接口和实现的分离”(music.java) 1. 父类对象变量=子类对象变量 ??当子类向上转型后,子类中所属性和方法都隐藏(除实例方法),父类中所有属性和方法都可见(除实例方法) 2. 方法的形参是父类,则可将子类对象作为实形来传递 总结:1)父=子 2)子=(子)父 三、关键字 this 和super 1).this a) this. data b) this (参数) 构造方法中第一条语句 2).super A. super.data/method(); B. super(参数) 构造方法中第一条语句 四、继承关系中的构造方法调用链 前提:子类对象创建前,必先创建父类对象(先有父,再有子) ① 不显示调用:系统隐含调用父类的默认构造方法(等价于在子类构造方法插入super();) ② 显示调用:明确给出构造方法中第一条语句super(参数); 3方法覆盖(父子类之间)override、方法重载(同名不同参)overload 五、运算符 instanceof ??确保对象是类的实例 对象名 instanceof 类名 例: (a instanceof B)返回布尔值 六、 1对象的初始化--属性(对象的状态) 1)构造方法: a) 实例属性 b) 类属性 2)定义: a)实例属性-->编译??>插入到构造方法 b) 类属性-->编译??>插入到类的初始化方法中。 第一次访问类时调用初始化方法:a)new方法 b)类名.属性/方法 3)初始化模块 ① {实例变量 初始化} ② static{类变量 初始化}
2函数调用的绑定方式 method call<??>method body 方法调用 方法体 A. 先期/静态绑定:执行前(C语言、面向过程语言) B. 后期/动态绑定:执行时 Java中所有方法都是动态绑定,除了final方法 3 final关键字 ① 类: 终极类(不可继承) ② 属性:(变量)==常量(子类可以重定义。在父类中定义常量,可以在子类中重新定义为变量) ③ 方法:子类中不能重新定义和修改 (静态绑定) 4 Object类 Java中的每个类都源自java.long.Object类 1)equals()方法::Object中的equals()方法等价于‘==’ 其子类中要覆盖,使其判断内容相等 2)toString()方法:子类覆盖,使其代表对象的有意义的串. 七、重复运用class的两种方式 1.继承(Inheritance) 新的class接受了既有(已经存在的)的属性和方法,并可以对之扩展, 类之间的关系是is-a(是一个) 2.组合(composition) 在新类中产生既有类的对象,作为属性 类间关系是has-a(有一个)
3.面向对象 (MVC模式)
八、类的抽象 ㈠ 关键字 Abstract(类方法) 1.抽象方法 如果方法的声明中用到了修饰符abstract,那么定义的这个方法可以不包含具体的实现 例子:abstract method(P); //{}可以不写 2.抽象类 任何包含抽象方法的类是抽象类,且要显示的声明abstract,但是抽象类可以不包含抽象方法 3.一些规则 (1)抽象类不能实例化 (2)当抽象类的子类 1 实现部分抽象方法,子类仍是抽象类 2 实现全部抽象方法,子类是具体类 (3)static,private,final不能是抽象的。因为这些方法不能被子类覆盖 (4)终极类(final类)不能含抽象方法。 (5)不包含抽象方法的类,也可以声明为抽象类,也不能被实例化。 ㈡ 接口(也是一种数据类型) 1、定义:关键字 interface interface 接口名 例如:public interface 接口名 {},产生 接口名.class 的文件 可以当成一种特殊的类 也不能实例化 2、限制规则 1) 接口不包括任何实现,其中的所有方法都是默认为抽象方法,所有的方法都是实例方法 2) 接口方法默认都是public型的 3) 接口中不能定义实例变量和静态变量,只允许用static和final声明的变量??静态常量 4) 接口不能实例化,所以接口中不定义构造方法 3、接口的实现 定义:关键字 implement 实现了 所有的,可实例化 部分,必须显示把自己声明为abstract
4、接口的使用 实现了接口的类可看成接口的实例
5、多接口的实现 一个类只能有一个父类,但可实现任意多接口 implements 接口,接口,…… 这时,只意味这必须实现这些接口中的所有抽象方法 6、接口的扩展(extends) 1 像类有之类一样,接口也可以有子接口 2 子接口继承了父接口中的所有抽象方法和静态常量,同时还可以定义新的 3 接口的extends从句中可以包含多个超接口(父接口) interface I extends I1,I2,I3,I4 … 7、 标记接口(marker interface) 空接口(没有任何方法) 当一个类实现了接口,那么这个类的一个实例也是这个接口的一个有效实例 标记接口正是利用这项技术提供额外的信息 例如:Cloneable接口 总结 接口:多重继承 属性:静态常量 方法:都是抽象方法,无构造方法 抽象类:单继承 属性:无限制(与其它类一样) 方法:可以有具体方法,必须有构造方法 OO(面向对象)设计原则 1. 开闭原则 (open/closed principle)OCP 定义:一个模块在: 扩展性方面应该是开放的 修改性方面应该是封闭的 实现:在设计软件是,要有意识地使用接口进行封装 2.Liskov替换原则 定义:指子类可以替换父类,出现在父类能出现的任何地方. 实现:设计时将父类设计为抽象类(或接口),让子类继承抽象类(或实现接口)其他类只与父类协作交互,运行时子类会替换父类,这样的系统有较好的可扩展性
第七章 数组和向量 一、数组 1.声明和创建数组 (1)声明:数据类型 [ ] [ ] [ ] 数组名/数组对象变量 例如:int [ ] [ ] i; String [ ] s; Circle[ ] [ ] [ ] c; (2)创建:数组名 = new 数据类型 [大小][大小] s=new String[10]; c=new Circle[5][6][7]; (3)声明+创建 数据类型[ ][ ][ ] 数组名 = new 数据类型 [数组大小] (推荐使用) 数据类型 数组名 [ ][ ][ ] = new 数据类型 [大小] Circle [ ] c = new Circle[5]; double [ ] mylist = new double[5]; 2. 初始化及处理 数组的大小:arrayObject.length 指定 c.length 、 mylist.length 例如: Circle [ ] c; c = new Circle [5]; c.length=5; 初始化:for(int i=0;i<c.leagth;i++) c[i] = new Circle[i]; 创建后有默认值: 整型: 0 实型: 0.0 字符型: \u0000 boolean型: false 类 类型: null 引用: 数据名[下标值][下标值]。 数组中的元素 下标值范围: 0.....(数组名.length-1) 4、声明+创建+初始化: 数据类型[ ] 数组名={值]1,值2,值3.....}; 例如:double[] d={1.0,2.0,3.0,4.0,5.0}; Cilcle[] c={new Circle(1),new Circle(2),new Circle(3)}; 5、数组复制的3种方法 P182页 用循环语句复制数组的没一个元素。 For (int i = 0; I < Array1.length; i++) Array2[i] =Array1[i]; 使用Object 类的clone方法 Int[] arry1=(int[])arry2.clone(); 使用 System类中的静态方法arraycopy Arraycopy(array1, 1 pos, array2, 2pos,length); 二、将基本数据类型处理为对象 P186页 1、包装类 三、向量类 P197
复习 包装类
数据类型<简单型 8(1+1+4+2) 复合型 String 数组 在自定义类 接口 抽象类 变量< 基本变量 int I 对象型 Student s=new seudent(); “李明”,18.newCollege() 父类和子类之间的类型转换 1父=子 总可以进行,不需要类型转换 2子=(子)父 可进行但运行时会检察 父类变量持有< 正确子类型 正常执行 不相关的类型,会抛出一个class+Exception 3不相关的任何类型间不能进行类型转换 Student s=new student(); collegStudent cs=new collegStudent s=cs; 父=子 School student cs2=( School student)s 子=(子)父 第八章 图形程序设计入门 引言 AWT(Abstract Windows Toolkit) 抽象窗口工具集 Swing(组件)优点: 1 更丰富 更漂亮 2 平台依赖少,bug少 3 观感一致,依于平台的绘图方法 注:Swing组件不能取代AWT的全部类,辅助类保持不变
Java 图形类库 1容器(Container) JFrame (有且只有一个)框架??Application JPanel 面板??Application / Applet JApplet Applet 2组件(Component) JButton、JTextField、JTextArea、JcomboBox等 3辅助类 Color、Font、FontMetrics、Dimension、LayoutManager、等 一、JFrame(框架类) 在包import.javax.swing 中 1 创建: import javax.Swing.* JFrame frame = new JFrame(); 2 设置大小 setSize(宽,高); 3 使可见 show(); //显示框架方式1(在最前方) setVisible(true); //显示框架方式2 4 setDefaultClose_Operation(JFrame.EXIT_ON_CLOSE) 告诉应用程序,框架关闭时程序结束。 dispose(); //关闭窗口,并回收用于创建窗口的任何资源 5指定位置 setLocation(x,y)?? (x, y)左上角坐标 6向框架中添加组件 只能在内容窗格上添加组件(ContentPane) 获取内容窗格:getContentPane(); Container cp = getContentpane(); cp.add(new JButton(“ok”); getContertPane().add(new JButton(“concel”); 二、布局管理器(容器类) ??辅助容器类??映射 布局策略?>实际显示 1 不用布局管理器 容器(1)setLayout(null);//不用布局管理器 组件(2)setBound(x,y,width,height);//组件放在那个点 容器 (3) add(Component) 评价:使用源编码的象素尺寸来安排组件的办法,缺少灵活性 2 使用布局管理器 (1)FlowLayout (3个构造方法) ①指定对齐方式(左中右),水平/垂直的间距 ②按照组件添加的顺序从左向右排列,一排满后再排另一排 ③add(Component) (2)GridLayout(3个构造方法) ①指定行数 列数 水平/垂直间距 ②按照添加顺序从左向右,按照指定的行数列数,以网格的形式排列 ③行数列数的指定规则 1)行数=0 列数=value(一个值),列数固定 行数动态分布 2)行数=value 列数=0 行数固定 列数动态分布 3)行数=value 列数=value 行数固定 列数动态分布 (3)BorderLayout (2个构造方法) ①指定水平/垂直间距 ②按东/西/南/北/中 指定区域放置 ③add(Component. index) 书上213 三、JPanel 使用单一的容器很难达到预期的视觉效果 面板是放置Component的更小容器,用于组织组件的更小容器,面板不可见。 JPanel p= new JPanel(); p.add(new JButton(“ok”)); p.add(new JPanel()); 对比:JFrame和JPanel ⑴ ⑵给JFrame添加组件到内容窗格 给JPanel直接添加到面板上 ⑶JFrame中画图用paint()方法 JPanel中画图用排paintComponent()方法 四、在面板上画图 1、方法:创建一个JPanel的子类,并覆盖paintComponent()方法 Public void paintComponent(Graphics g) 2、Graphics 类 (绘图) java.awt.Graphics 3、显示字符串:g.drawString(s, x, y); 绘制几何图形drawLine(); 绘制几何图形的方法 P221 显示图像 drawImage(Image); 4、比较: 在框架和面板上绘图 ⑴在框架中绘图 ①产生一个JFrame的子类 ②覆盖 public void paint(Graphics g) ⑵在面板中绘图 ①产生一个JPanel的子类 ②覆盖public void paintComponent(Graphic g) 注意:以上要先调用父类的相应方法来清除视区??清除以前画的 JFrame super.paint(g) JPanel super.paintComponent(g) 五、个比较常用的辅助类 P205页 1、color类 java.awt.Color 自调制: Color c= new Color(R,G,B) (0~255) Component类中的方法:设置颜色 SetBackgroud(c);??背景色。SteForeground(c);??前景色 Graphics中设置颜色方法setColor (c) 2、Font类 ??设置字体 Font f= new Font (name,style,size) setFont(f); 3、FontMetrics类 P217页 ??帮助计算字符/字符串的高度和宽度 Graphics中设置字体方法getFontMetrics(f) FontMetrics fm = getFontMetrics (f) fm.getAscent (); fm.stringWidth (“hello”); 4 ToolKit 类(它对象有许多和本地窗口打交道的方法) Toolkit kit= Toolkit.getDefaultToolkit (); Dimension d= kit.getScreenSize (); d.width 、d.height Image img=Kit.getImage (“xxx.gif”) 六、事件驱动的程序设计 GUI 程序驱动??过程顺序 事件驱动??激活事件 用户通过GUI与程序交互,事件驱动着程序的执行 1、事件(Event) 引发者 ①外部人 ②底层系统软件 程序发生了某些事情的信号 内部表达事件:用事件类的一个实例(对象)来表达该事件,这个事件对象包含与事件有关的一切属性。 java.util.EventObject 类?? 一切事件的父类 P231页 2、源对象(source Object) ??在其上发生事件的组件 注意:一个组件上发生某个事件,那么这个组件的任何子类也能发生同类事件 3 事件的处理机制 监听器(Listener):是一个关心事件的对象并对特定事件做出相应处理 注册:调用源对象的方法(addXListener())声明某对象为监听器 JButton jbtok=new JButton(“ok”); jbtok.addActionListener(监听器对象); Java 为每种GUI事件类型提供了一个监听接口 P237页
Class 监听器 implements ActionListener { Public void actionPerformed(ActionEvent e) { 响应事件的处理代码 } } 具体用户行为、源对象、事件类型、监听接口、监听方法: P231页8-27? P232页8-28
一.JApplet类中的常用方法 1.Init():装载applet时调用 创建新线程 new Thread 装载图像 设置用户界面组件 从HTML网页中获取参数 2.start():init()完成后,再次访问包含applet的网页时,(第一次,和在跳回来) 方法中的主要功能:所有方法HTML页的主要操作 3.stop():离开网页时,或包含applet的web页不可见时(窗口最小化) 4.destroy():当浏览器退出时或apple被销毁前 二.在不支持java的浏览器中运行applet 1 要安装java plug-in 2 将带有<applet>标记的HTML文件转成带有<object>标记的HTML文件 三.HTML中的<applet>可以控制applet (1)code :指apple文件名 (2)codebase :指定applet的目录名 (3)width / height :指定applet的区域大小 (4)vspace / hspace :指定applet周围的空白边界大小 (5)align :指定applet在浏览器中的对齐方式 四.从HTML文件向applet传递参数的方法 步骤:1 在html文件中声明<param name=X value=20> 2 在Japplet的init()方法中使用getParameter(“praname”)返回指定的参数值
五.applet与Application之间的转换 JApplet与JFrame 共同点:1都是Container的子类 2 都是向内容窗格加组件 3 用户组件、布局管理器、事件处理机制,都相同 不同点:1运行环境不同 applet?web浏览器 Application?Java解释器 2执行时的安全级别:applet?执行受限制 Application?没有任何限制 转换的方法: (1)applet?>Application的步骤 ①废弃HTML文件,HTML文件中的参数可从命令行获得 ②从JFrame或其子类派生出一个主类(含main()方法的类) ③用init()和start()方法中的代码编写新主类构造方法(将init()和start()方法中的代码考入到构造方法中) ④添加一个main()方法{a 获取参数 b 设大小 c 显示} (2)Application->applet的步骤 ①制作一个HTML文件 带有<applet>标签 若需要从命令行取参数 可从getParameter() ②从JApplet或其子类派生一个主类 ③用init()方法代替构造方法 ④删除main()方法(不删,执行时忽略) (3)如何编写一个程序既能用Application运行又能够在applet运行(为applet添加main()方法) 理论意义 淡化二者的差别 现实意义 水陆两栖 类的特点:1.主类是JApplet的扩展类 2.有init(),start()没有构造方法 3.所有的文章都在main()方法中 总的来说:为Applet添加main()方法 具体步骤:①创建一个JFrame的实例 ②创建一个该applet的实例 ③把applet添加到JFrame的内容窗格中 ④调用applet的init()方法和start()方法 ⑤设置JFrame的大小、尺寸,显示 (4)使用appletviewer 执行applet而不需要另外创建HTML文件的方法。 appletviewer能从一个文件中取出<applet>标签,并忽略其余内容。 作法:将<applet>标签以注释的 形式加入到java源文件中。 在DOS环境中运行appletviewer XXX.java Timer timer = new Timer(时间间隔,监听器); timer.start(); timer.stop();
boolean suspended Run() { while (suspended) wait(); } init() thread.start() start() suspended=false; stop() suspended=true; destroy() thread=null;
十一 异常处理 程序中有3种错误: 1)编译错误 2)逻辑错误??设计错误 3)运行时错误 GUI设计 事件(表达) 可忽略 异常处理 异常(表达) 不可忽略
1 异常的内部表达 P345 图 根类: java.lang.Throwable 两个子类: 1)Error类 内部的系统错误 不能捕捉 2)Exception类 由程序和外部环境引起的 RuntimeException 可不捕,这类程序常有 异常机制的目的: ??不会减少必要的错误处理的工作量, 它的优点是使程序更容易阅读??通过把所有的异常处理都集中到一个局部位置,使主控制流程免受干扰 2 Java异常处理操作 (1)声明异常??可能抛出的异常一定要先声明 Public void method() throws IOException { 方法体 目的:告诉编译器在执行方法的过程中可能出现的错误 } 可不声明: RuntimeException Error (2)抛出异常 < 1.系统 2.程序本身?throw new IOException() 方法内部只能抛出下列异常 1、声明的 2、Error 、RuntimeException 3、以上的子类 (3)捕获异常 ??当调用一个显示声明异常的方法时,必须用try-catch 块括该方法 try { method(); } catch(IOException ex) { 处理代码 } catch{ RuntimeException ex}…… 无限添加(如果需要)
3.执行情况分析 (1)没出现异常跳过Catch子句 (2)出现略过其余语句,转向catch快寻找匹配的处理 < 有:执行相应处理,不再管其余catch(第一个匹配的处理) 没有:退出该方法,将异常传给调用该方法的方法
4执行情况分析 (1) 没出现异常:跳过catch子句 (2) 出现:略过其余语句,转向catch块,寻找匹配的处理,当有多个catch,它找到第一个匹配后就执行,后不执行以后所有catch语句.catch顺序先子后父. A.有:执行相应处理, B.没有匹配的catch时就跳出try和catch所在的块.将异常传给调用该方法的方法
5 重新抛出异常 当一个方法中出现异常时,如果不捕获就会立即退出。如果想在退出前执行一些处理,而让上一层执行异常处理,则在做完退出处理后,重新抛出异常 6 finally 子语 希望不论异常是否出现,是否被捕获都执行某些代码 try{}catch(Exception ex){}finally{可被执行的语句} 7使用注意事项 (1)异常处理不能代替简单测试 (2)不要过分细化异常(目标是:将正常代码与异常处理代码分开) (3)不要压制异常 (4)不要羞于传递异常
第十二章 国际化 本章概括:(表面)??格式、显示、界面 InternationalizatioN ?? I 18 N 1.引言 Java支持国际化的主要特征 (1)Unicode:支持多语言字符 (2)Locale类:类封装有关地区特征的信息 (3)ResourceBundle类:将地区特征有关的信息从程序中分离出来
2.Locale类 ?? java.util.Locale (1)创建 new Locale (String language , string country) new Locale ("zh" , "CN") new Locale ("en" , "US") (2)常用属性:P367 (3)常用方法:P368
3.资源簇 ResourceBundle 类(抽象类) 目的:将程序中地区敏感的代码与不敏感的代码分离 资源簇:就是提供地区特定信息的一个java类文件或文本文件 (1)将资源存放在ResourceBundle类及其子类的扩展类中, java.util.listResourcebundle,扩展类必须实现getContents()方法,并返回一个二维数组,且数组的第一列必须是String型的以作为key(键) . value(值)//相对来讲 优点:访问速度快。 (2)将资源方在文本文件中 ① 必须建一个扩展名为(. properties)的文本文件 ② Value必须是String型 优点:修改方便 (3)资源的操作方法 1 为了从资源簇中获取值需要用静态方法getBundle(BaseName 或 Locale),来创建一个ResourceBundle的实例。 BaseName ? BaseName_language_country 2 用getObject( ) 实例方法,获取对应键的值。 例如getObject(”ok”)
(1)对于源对象注册监听器 jcb.addActionLister ( ) (2)实现监听器接口 <1操作界面上所有组件 2 actionPerformed( )方法只有一个,产生该事件的源对象都有多个
4处理数字的格式化问题 (1)java.text.NumberFormat类(抽象类) ①获得实例(对象) (4个静态工厂方法 P381页 第二行) ②用实例方法format( )格式化数字 (2)java.text.DecimalFormat类??是具体类,是NumberFormat的子类 ①获得实例 < 1)new DecimalFormat(指定Locale ) 2) 使用NumberFormat类的4个静态工厂方法获得实例后,强制类型转换为DecimalFormat DecimalFormat df= (DecimalFormat) NumberFormat.getInstance ( ) ②指定格式import java.util.* 实例方法 applyPattern(“格式化”); ③格式化数字 实例方法 format( )
5处理日期格式化问题 (1 )java.text.DateFormat(抽象类) ①获得实例 (4个静态工厂方法{getInstance( ) } ) P369 ②用实例方法格式化 format( )格式日期 (2)java.text.SimpleDateFormat类 具体类.DateFormat的子类 ①获得实例 new SimpleDateFormat(“格式串”); ②用实例方法format()格式日期 (3)java.util.Date类(具体类) ①获得实例 new Date( ) ②获得时间 getTime( ) //返回的是毫秒数 是数字 而且是从1970年1月1日0点0分到现在经过多少毫秒 toString ( ) //返回当前时间 (4)java.util.calendar类(抽象类) ① 获得实例 静态工厂方法:getInstance(Locale) 指定时区 Locale zh cn (5)java.util.TimeZone类(抽象类) 静态工厂方法:getDefault( )
十三章 多线程 引言:任意时刻可以有多条语句在执行(多CPU) 好处:程序的执行效率高 缺点:进程管理占用系统负荷 线程:就是一个对象,可运行的对象。 对象的类 <实现Runnable接口 扩展 实现了Runnable接口的类.(Thread类) 1 创建线程的方法1??扩展Thread类(java.lang.中) 步骤、(1)定义一个Thread类的扩展类 (2)覆盖public void run( )方法 //run( )是告知系统如何执行线程 (3)创建对象(用构造方法) (4)调用该对象的start()方法,将该线程启动(注意不能直接调用run()方法) start()方法引起run的调用 2创建线程的方法2??实现Runnable接口 步骤、(1)定义一个实现Runnable接口的类 (2)实现public void run()方法 (3)将该类的对象作为Thread类构造方法的参数,创建一个线程实例 (4)调用该对象的start()方法启动线程 3 线程的状态 4 控制线程状态的常用方法 (1)start() :启动线程,引起run()方法的调用,(创建线程 不自启动) (2)sleep(Long) :将线程暂停参数指定的毫秒数,(不释放对象锁) (3)Wait(Long) :将线程挂起制定的毫秒数,(释放对象锁) Wait( ):将线程挂起,直到当调用notify()或notifyAll()时 (这两个方法只能在Synchronized函数中或同步块中使用) (4)notify() :唤起一个线程 (5)yield() :只希望让其他正在等待的线程有机会执行,且在没有其他线程等待时立即重新执行。 (6)join()方法:如果一个线程需要等待另一个线程消亡后再继续运行,则可调用希望其消亡的那个线程的join()方法。 (7)isAlive()判断线程是否处于运行状态 (8)setPriority()设置线程的优先级 另外:Java2不赞成使用stop( ) , suspend( ) , resume( ) , destroy( ) 原因:它们不释放线程所取得对象锁 5 线程编程的4种方式 同步:多个线程间的协调,按照协调方式的不同,线程程序的难度可分为4个等级 (1)不相关的线程??最简单 指执行不同功能的线程之间没有交互关系 例子:Drinks.java (2)相关但无需同步的线程 指一组线程作用于同一数据结构的不同部分,或只读同一数据机构。线程间不需要同步。例子:TestPrime.java (3)互斥的线程 指一组线程需要操作同一数据结构时,为避免数据结构的不确定性,这些线程必须相互等待以免修改同一数据 说明:java中线程的互斥时建立在类(对象)数据的基础上的,java中的每个对象都又自己的Lock标志,可以用作同步。 对象锁机制:每个线程在改变某个对象之前必须首先获得该对象的锁,且在每一时刻只会有一个线程能够锁住该对象 (先获锁,再访问,一次只有一个线程能获得锁) ①获锁 <得到??代码执行 被另一个线程占用(没得到)??挂起直到锁被释放 ②对象锁:当调用任何synchronized方法时,对象便被锁定,该对象的所有synchronized方法便无法再被调用,直到第一个方法执行完毕并解除锁定为止。 ③类锁:当调用任何synchronized static方法时,类便被锁定,该类的所有synchronized static方法便无法再被调用,直到第一个方法执行完毕并解除锁定为止。 ④同步区块:synchronized block synchronized(对象名 / this){data++} Object O=new Object( ); 线程组 用途:具有类似功能线程需作为一个整体操作 (4)交互的互斥线程 指在线程交互传递数据时,当一个线程等待其他线程提供数据,但数据尚未就绪时,他将因等待数据而暂停执行。这就是典型的wait/notify线程同步问题 每一个java对象都有一个等待线程列表 (1)当线程调用了一个对象的wait()方法时,系统就把这个线程加到该对象的等待线程列表上,并暂停这个线程。 (2)当另一个线程调用同一个对象的notify()/notifyAll()方法时,该对象会唤醒等待该对象的线程,并允许它继续运行 wait/notify同步机制最常见的用途是解决生产者/消费者问题 (1)生产者线程模板 while(buffer_full) { wait(); } ptofuvr_data(); notify(); (2)消费者线程模板 while(no_data) { wait(); } consume_data(); notify(); (3)主程序 main() newProducer().start(); newConumer().start();
第十四章 多媒体 多媒体??开发常有音频和图像的程序 { ①装载 ②播放/显示 一.URL(Universal Resource Locate) 描述internet 上的资源位置 { 本地:目录 internet:URL java.net.URL 类用于处理url applet的安全限制 1 不允许读取用户计算机上的文件系统 P16 2 不允许运行用户计算机上的程序 3 不允许建立用户计算机和其他计算机连接(网络连接) 获得url: ①applet中: {java.applet.applet类中 {getCodeBase() 返回applet所在目录(url) getDocumentBase() 返回HTML文件所在目录(url) ②Application中: java.lang.Class类中{ getResource(filename); 调用任意对象的getClass()获得Class的实例 二.java.applet.AudioClip 接口 1 装载(获得AudioClip实例的方法) (1)applet: java.applet.Applet类中的getAudioClip(URL url); (URL url,String filename); (2)Application: java.applet.Applet类中的静态方法 Applet.newAudioClip(URL url); 2 播放 AudioClip实例的{ play() loop() stop() 三.java.awt.Image类 1 装载(获得Image实例) (1)applet:java.applet.Applet类中的getImage(URL url) (URL url,String filename) (2)application:使用ImageIcon类中getImage() ImageIcon imageIcon = new ImageIcon (url) imageIcon.getImage(); 2 显示 (1)将一个标签用作图像的显示区域 JLabel jll= new JLabel(imageIcon) (2)java.awt.Graphic类drawImage() P425页 参数指定 图像 左上角坐标 背景色 按比例缩放 观察者 img x , y bycolor width/height ImageObserver(接口) imageUpdate() Java中所有GUI组件都是ImageObserver的实例
media Tracker 1 创建 new 2 注册 addImage(img,id) 3控制< checkID(id) waitForID(id) waitForAll()
第十五章 文件的输入输出 一 引言 1 Java中所有的I/O(各种数据源)都是数据流的形式进行处理的 2 Java中数据流是一个对象(类)包含一些读写数据的方法,以及一些辅助方法,关闭、刷新、统计 3 数据流按读写单位来分 { 字节(byte)8个 字符(character)16个 4 大部分数据流对象都是单向的 RandomAcessFile类是双向的 二 输入 InputStream/Reader(抽象类) 字节/字符 int read(); int read(); 0-255 int read(byte[] b); int read(char[] c); 三 输出OutputStream/Writer(抽象类)字节/字符 Void write(byte b) void write(char c) Void write (byte[] b) void write(char[] c) 四 磁盘文件的读写 1 file类处理文件名和路径名 string的包装类(Wrapper) 2 使用{ (1)创建一个file对象 File F = new File (“in.dat”) (“c:\\book\\in.dat”) (2)常用方法 exists()、 getName()、 getPath()、 getParent() 2 使用文件数据流进行行读写 < FileInputStream / FileOutStream FileReader / FileWriter (1)创建文件数据流 String filename(String) (File file) (2)读写方法read()、 write() 五 过滤器流 为了某种谜底的过滤字节或字符数据流 程序<??filter<??FileInputStream<??File 程序??>Filter??>FileWrite??>File 为了读取整数 浮点数 字符串 需要一个过滤器事包装输入输出流 (抽象类)FilterInputStream / FilterOutputStream用于处理基本数据类型。常使用它们的子类 1 DataInputStream / DataOutputStream 以机器无关的方式读/写Java的基本数据类型数据 (1)创建一个包装原始数据流的过滤器 new DataInputStream (InputStream is); new DataOutputStream (OutputStream OS); (2)常用方法 P445 2 PrintStream / PrintWriter 3 缓冲数据流??(过滤器) ??采用减少读写次数的办法,加快输入输出的速度,使用字节数组或字符数据,作为高速缓冲(cache) BufferedInputStream / BufferedOutPutStream(字节) BufferedReader / BufferedWriter(字符) 使用{ (1)创建 new (InputStream is) (InputStream is,int bufferSize) (2)常用方法:readline() 整行读取 例子:ViewFile.java
复习 InputStream/OutPutStream FileInputStream/FileOutputStrea (共用方法) IO< 抽象数据源 磁盘文件数据源 Reader/Writer FileReader/FileWriter 1读取基本数据类型 DataInputStream/DataOutputStream 2输出文本格式 printStream,printWriter 3整块读写 BuffedInputStream/BuffedOutputStream BuffedReader/BuffedWriter
六 文件对话框 Java提供了显示对话框的javax.swing.JFileChooser类使得用户可以在对话框漫游文件系统 常用属性:P453
11 控制台文本I/O System { in 从键盘读入 out 数据结果显示 err 错误显示 static PrintStream out,err; InputStream in; 评价 Java缺少基本的终端输入方法,如果要执行交互式I/O,Java认定通过GUI进行。 解决方法:Java没有立即读取用户输入的单个字符的方法。Java从终端读取字符的唯一方式是当入户按下回车键后,一次性读取一行 解决具体步骤: (1)在System.in上包装InputStreamReader类 ??使能够这个Reader类的基础在包装其它Reader类 (2)在InputStreamReader类的基础上包装BufferedReader类 该类中的readline()方法将读取整行数据 (3)在读入的字符串上包装java.util.StringToKeizer类 该类中netToKen()依次抽取ToKen (4)调用基本类型的包装类中parseXXX方法,抽取期望的数据类型 八 对象数据流 (只要一个对象实现了Serializable接口或者Externaalizable接口) I:ObjectInputStream O:ObjectOutputStream 读: readObject() 写: writeObject()
JDBC(Java DataBase Connectivity) 1 JDBC是一组由Java类和接口组成的API其设计目的是以平台独立的方式实现application和applet对不同类型的数据库进行访问 2 JDBC能完成的3个事 { ①与一个数据建立连接 ②向数据库发送SQL语句 ③处理数据库返回结果 3 JDBC的体系结构 4 驱动程序的4种类型 (1)JDBC-ODBC桥 将对JDBC的调用转化为对ODBC的调用 (2)native API 将对JDBC调用转化为数据库客户端的调用 (3)JDBC-Net Driver (4)纯Java Driver 将对JDBC的调用转换为对数据库协议的调用 5 JDBC API的组成 java.sql.* (1)驱动程序管理器(DriverManager) 用来加载驱动程序 (2)连接(Connection) 封装了应用程序与数据库的连接信息 (3)驱动程序(Driver) 将应用程序的JDBC API 调用映射为对数据库的操作 (4)语句(Statement) 用来在数据库中执行一条SQL语句 (5)结果集(Result set) 负责保存检查返回的数据
文档注释 javadoc -d doc javadocDemo.java 1.如何插入注释 /**自由文本(可加入html修饰符)*/ javadoc 1,包 2,public 类接口 3,public 和protected 的方法和属性 2.类注释 直接放在class的定义前 3.方法注释 必须紧靠在它所描述的方法前 @Para Variable description @return description @throws class description 4.字段注释 5.通用注释方法 ①专用描述类 @author name @version test ②描述所以(类,属性,方法都适用) @since text 引入此特性版本 @deprecated text 废除此特性版本 @see link 1.package class # feature label 2.<a href=”… url…”>lable</a> 3文本 @ link 可在注释的任何地方插入 6.包的注释 7如何提取 javadoc ?d 存放目录 *.java
附录 H 包 包java.applet.Applte 红色部分是包名 1.包是解决名称的唯一性 (1)包有层次关系,可以嵌套 (2)java设计者建议用所在单位的internet域名来命名 例:neusoft.edu.cn为cn.edu.neusoft (3)Java要求包名与文件系统的目录结构一致 2.设置环境变量classpath指定起始目录 1) 包=目录,类=文件. class 2) 如何告诉编译器一个类属于那个包 源程序. java文件中的第一条非注释语句 package xxx.xxx.xxx. …… 3.如何创建与包结构对应的目录 (1)手工建 (2)javac ?d 包的根目录名 xxx.java javac ?d c:\ javac ?d . xxx.java 其中:“.”代表classpath的路径 例如:javac ?d . Applet.java 4.JVM寻找类的方法 自动查找 (1) $JavaHome/jre/lib/ext 目录(保留) (用户)(2) $JavaHome/jre/class 目录 (用户) (3)环境变量 classpath所设置的目录 5.导入improt 没有package指定说明,默认包==当前目录 import 包名A < 可用:引用另一包中的类,省略包名 可不用:引用另一包中的类,都必须加上包名
UML图标及其Java实现 (1)Package Package com.java; (2)依赖关系Dependency 1.关系对象出现在局域变量或者方法的参量里 2 关系类的静态方法被调用 (3)Association 关联关系 关系对象出现在实例变量中 (4)Aggregation 聚集关系 (5)Composition组合关系 (6)Generalization 泛化(继承)关系 Extends (7)Realization实现关系 Implement
实用角度看Java 第1篇 一.章 引言 ??入门<package XXX Import XXXX 类定义 二.基本变量(8种)??操作内存 变量的传递都是值传递 三.控制语句 ??控制CPU 四.方法 ?? 模块化思想 第2篇 五.类??面向对象的基础 封装 六.类的继承(接口,抽象类) 多态 七.数组,向量 第3篇 C/S 八.容器、布局管理器、事件处理基础 九.组件 十.鼠标事件、键盘事件、Applet、GridBugLayout 第4篇 十一.异常处理?? 思想(捕获) 十二.国际化 (日期、数字、界面文本) 资源簇 十三.多线程 <1.声明、创建 2.线程状态 3.常用方法 4.四种线程编程方式 十四.多媒体 音频、图象 Applet Application 十五.抽象I/O/磁盘文件I/O/过滤器 十六.SevereSocket 、Socket
考试角度看Java 1. 程序结构 2. 字符串和数组的定义与声明 3. 构造方法的重载调用形式 4. 父子类之间的转换 强制类型转换 5. 覆盖 可见性可以变宽,不能窄化。Throw变窄 6. 内部类,m.java 7. super();不能放在main()中 8. Instanceof a Instanceof 接口 9. 10. 背景色 setBackground(Color.whrite) 11. 4个布局管理器怎么指定位置 12. setEnabled(false) 按纽 13. 整形变量??>char 字符串??>10进制整数 Char??>字符串
14.多线程 public void run (){} 15. 打开一个图象文件的方法 8章 tookit 14章 applet,application 16. File f = new File(“/”,”a.au”), DataIputStream d = new DataIputStream(System.in) OutIputStreamWriter o = new OutIputStreamWriter (System.out) RandomAccessFile r = new RandomAccessFile(“out.log”) 17.重载 覆盖
编程 II18velcome.java 13章,互次 SynPressureDemo1,2,3 钟表
辨析:
|