收藏 分享(赏)

2015复习(改) (4)解析.ppt

上传人:weiwoduzun 文档编号:2425231 上传时间:2018-09-15 格式:PPT 页数:149 大小:1.36MB
下载 相关 举报
2015复习(改) (4)解析.ppt_第1页
第1页 / 共149页
2015复习(改) (4)解析.ppt_第2页
第2页 / 共149页
2015复习(改) (4)解析.ppt_第3页
第3页 / 共149页
2015复习(改) (4)解析.ppt_第4页
第4页 / 共149页
2015复习(改) (4)解析.ppt_第5页
第5页 / 共149页
点击查看更多>>
资源描述

1、JAVA 语言与应用复习,课程介绍,选修课(2.5学分) 课程目的: 了解并掌握java编程技术 理解面向对象程序设计的思路和方法 掌握网络编程的基本技术 考核方式: 出勤 + 平时作业 30% 试卷成绩 70%,2,Java语言概述,Java环境,Java 源程序,编译,字节码 文件,Java 虚拟机,执行,Linux,Windows,Mac,4,Java2 家族,在Java中,类库以包(package)的形式提供,不同版本的Java提供不同的包,以面向特定的应用。 J2SE (Standard) J2SE 包含那些构成Java语言核心的类。 比如:数据库连接、接口定义、输入/输出、网络编程

2、 J2EE (Enterprise) J2EE 包含J2SE 中的类,并且还包含用于开发企业级应用的类。 比如:EJB、servlet、JSP、XML、事务控制 J2ME (Micro) J2ME 包含J2SE中一部分类,用于消费类电子产品的软件开发。 比如:呼机、智能卡、手机、PDA、机顶盒,5,Java语言的核心机制,Java语言包含三种核心机制:Java 虚拟机 垃圾收集机制 代码安全检测,6,Java 虚拟机(JVM) 在一台计算机上由软件或硬件模拟的计算机。Java虚拟机读取并处理经编译过的平台无关的字节码class文件。 Java编译器针对Java虚拟机产生class文件,因此是独

3、立于平台的。Java解释器负责将Java虚拟机的代码在特定的平台上运行。运行原理如图。,7,垃圾收集机制(Garbage collection) 在C/C+ 等语言中,由程序员负责回收无用内存。 Java语言解除了程序员回收无用内存空间的责任。它提供一种系统级线程跟踪存储空间的分配情况。 并在JVM的空闲时,检查并释放那些可被释放的存储器空间。垃圾收集在Java程序运行过程中自动进行,程序员无法精确控制和干预。,8,代码安全性检测(Code Security) Java执行代码的时候,由JVM对运行的代码进行安全性检测,当进行一些非法操作的时候,比如修改一些系统设置的时候,JVM会发出警告。,

4、9,Java有那些特性? 面向对象 封装性、多态性、继承性、动态链接 操作平台无关性 严格的语言定义:“没有依据机器的不同而不同” 或“由编译器决定”等字眼,最后的目标码都是一致的,初值都是确定的,10,Java程序的几种类型,Application “Java应用”是可以独立运行的Java程序。 以main()方法作为程序入口 由Java解释器加载执行。,11,Applet 没有main()方法作为程序入口,不能独立运行 由浏览器或appletviewer加载执行。,Client 机,Server 机,Browser,网页,字节码,12,Servlet/JSP 是Java技术对CGI 编程的

5、解决方案。 是运行于Web server上的、作为来自于Web browser 或其他HTTP client端的请求 和 在HTTP server上的数据库及其他应用程序之间的中间层程序。,13,J2SDK的主要功能,java/bin的目录下包含义下主要文件: Javac.exe: Java编译器, 用来将java程序编译成 Bytecode Java.exe: Java编译器,执行已经转换成Bytecode的 java应用程序. Javadoc.exe:文档生成器,创建HTML文件 jdb: Java调试器, 用来调试java程序 javap: 反编译,将类文件还原回方法和变量. Apple

6、tviewer.exe : Java解释器, 用来解释已经转换成Bytecode的java小应用程序.,14,知识点,Java程序3种类型 JDK常用命令 Java虚拟机,15,Java 编程基础,变量和数据类型 类和对象 重载方法和重写方法,16,基本数据类型,Java 共有八种基本数据类型: 四种整数类型(byte、short、int、long) 两种浮点数类型(float、double) 一种字符类型(char) 一种布尔类型(boolean),17,Java 中的数组,数组用来使用同一个变量名存储同样的类型的一组变量 Java 中的数组是这样申明的 语法: Datatype name_

7、of_array ; 例子(ArrayProblem.java): int array_1 ; int array_2 ;,18,数组,属于复杂数据类型 由类型相同的元素组成的有顺序的数据集合 数组是固定的不能扩展 可以存储基本数据类型或对象 通过数组名和下标可以访问各元素,19,java.lang 包,该包中包含的类是Java编程语言设计的基础 其中比较重要的类包括: Object封装类,类体系结构的根,封装基本数据类型,为基本数据类型建立对象表达式,20,java.util,java.util 包括了Java 语言中的一些低级的实用工具,比如:处理时间的Date 类、处理变长数组的 Vec

8、tor 类、实现栈的 Stack 类和实现杂凑表的HashTable类等,使用它们开发者可以更方便、快捷地编程。,21,知识点,概要 Java是严格区分大小写、完全面向对象的语言,类是程序的基本单位。 一个应用程序可以由多个源程序文件组成,扩展名为.java。 Java中的三种注释 一个文件中可定义若干个类,但最多只能定义一个public访问修饰的类,称该类为主类。 在主类中定义main()方法,22,知识点,标识符的命名规则 标识符的合法符号包括:字母、数字、下划线_及美元符号$。字母为大写或小写的英文字母,数字为09; 标识符的首字母必须为字母、下划线或美元符号,即数字不允许为标识符的首字

9、母; 标识符区分大小写; 标识符不允许与关键字相同,但允许关键字作为标识符的一部分; 标识符应遵循命名规范,如:类名的首字母大写、属性与方法名的首字母小写。,23,知识点,常量和变量、数据类型 数组 数组是具有相同类型的数据的集合,数组元素的类型可以使基本数据类型,也可以使类或接口; 使用数组名和下标可以唯一确定数组中的每个元素,数组下标的索引号从0开始,故最后一个元素的索引号应是(数组长度-1); 数组必须先经过声明和初始化后才能使用。使用new关键字动态初始化数组; 字符串类、Math类及其常用方法 数据类型转换 表达式中涉及不同类型的数据时,需要进行数据类型转换。类型转换包括:自动类型转

10、换和强制类型转换,24,控制结构,选择 if-else switch 循环 while do-while for,Java 支持下列控制结构:选择、循环、跳转,跳转 break continue,25,知识点,控制结构 控制结构包括:顺序结构、选择分支结构、循环结构、跳转结构。 选择分支结构:if-else、switch-case、 循环结构:while、do-while、for 跳转结构:break、continue,26,类和对象,目标,掌握如何创建类和构造对象 掌握方法的重载和重写 了解类的继承 了解包概念,28,Java 中的类,Java 中的一切都是对象。 所有的对象都来自类,类是用

11、户自己定义的或是系统内置的 。 类是对象的抽象结构,对象是类的物理实现。 当类建立完毕后,就可以用来建立实例或对象。,29,类的声明和new,String s = new String(“a string”); String s 是什么意思?,a string,s,一个字符串类的对象被创建,对象被初始化为 “a string”,内存空间被分配,一个能够指向字符串对象的引用(变量)被创建,变量s指向内容为“a string”的字符串对象,30,类的继承重载与重写方法,有两种类型的方法:重载方法和重写方法 重载方法是那些位于同一类中、同名但具有不同参数列表的方法。Overloading.java

12、重写方法是那些既存在于超类中又存在于子类中的方法。OverrideDemo.java,31,类的继承 super 与 this,“super”关键字用于指示父类对象 “this”关键字用于指示当前对象。,32,方法的参数,值传递(值拷贝):基本类型参数 地址传递(引用传递):抽象数据类型(引用类型),33,基本类型的值传递,3.14,3.14,A,B,0x2F,0x2F,A,B,引用类型的地址传递,34,包,在Java中,包主要有以下用途 : 包允许将类组合成较小的单元 有助于避免命名冲突 包允许在更广的范围内保护类、数据和方法 包可以是类、接口和子包的集合,35,构造函数,构造函数名称与类名

13、称相同 构造函数没有返回类型 其任务是在创建对象时初始化其内部状态,class Fruit boolean seedLess;boolean seasonal;float price;Fruit(boolean seed, boolean season, float p) seedLess = seed;seasonal = season;price = p; ,36,重载构造函数,Java 为每一个类自动提供缺省构造函数 缺省构造函数将成员变量的值初始化为缺省值 一旦创建了自己的构造函数,缺省的构造函数将不复存在。 重载构造函数提供了一组创建对象的方式,可以根据需要决定是否带初始参数。,pu

14、blic class constructOverload int x;constructOverload() x=0;System.out.println(“不带参数的构造函数“);constructOverload(int x)this.x=x;System.out.println(“带一个参数的构造函数“); ,37,extends关键字,extends关键字用于继承类。 声明一个继承父类的类的通常形式如下: class subclass-name extends superclass-name /类体 没有extends,默认父类为Object 只能有一个父类,即单继承 子类继承父类的全

15、部成员,注意,38,this关键字,public class PassTest int x;PassTest(int x) this.x=x;public void passingValue()System.out.println(“x 等于 “ +x); public static void main(String args) PassTest test = new PassTest(10);test.passingValue(); ,关键字 this 与对象关联 它用于指示当前对象,指明此对象的变量 x 应赋值为通过构造函数传递的自变量 x 的值。,39,super关键字,super关键字

16、用来解决如何直接访问或初始化从父类继承来的属性。 super有两种通用形式:调用父类的构造函数、用来访问被子类的成员覆盖的父类成员。 它用在对象的构造函数中,将构造细节通过继承链往上传递。 super()必须是在子类构造函数中的第一个执行语句。,40,类型转换,执行自动类型转换需要两个条件: 接受转换的两种类型是兼容的(所有数字类型) 目的类型数的范围比源类型的大(从int到float) 强制类型转换语句的通用格式如下: (目标类型)value,Undergraduate s1 = new Undergraduate(); Graduate s2=new Graduate(); Graduat

17、e s3=new Graduate(); Student x; x=s1; if (x instanceof Graduate)s3= (Graduate)x;,注意:从父类到子类的转换,建议在转换前判断父类是否指向子类的对象,41,知识点,类的定义 类是面向对象编程的基本要素。由类来定义对象的成员变量(又称为属性)和成员方法,并由类创建实例对象。 类的定义包括:类首的声明 和类体的定义 两部分组成。 类体的定义包括:属性声明 、成员方法定义和构造方法定义 构造方法 构造方法是类用来创建对象、初始化类的属性的一种特殊方法,有别于类的成员方法; 构造方法的特殊性; 构造方法通过new关键字在创建

18、对象时由系统自动调用,不允许用户直接调用; 构造方法与类同名、无返回值、无void、一般定义为public访问类型,可以重载和继承。 对象初始化; 继承; 方法重载;,42,知识点,对象的创建 对象是类的具体事例。由类创建对象的过程称为实例化类或类的实例化,即为对象分配内存空间并初始化对象; 创建对象包括:声明对象引用变量、建立对象实体、初始化。对象创建成功,就可通过对象引用变量来使用 对象初始化; 继承; 方法重载;,43,类的高级特性关键字,目标及知识点,掌握类的静态成员 掌握final关键字用法 掌握抽象类的定义和用法 掌握接口的定义和用法 掌握高级访问控制,45,类的静态成员,类中的静

19、态变量、方法或代码块属于类,而不属于某个特定的对象。 类的静态成员可以与类的名称一起使用,而无需创建类的对象。 静态变量或方法也称为类的变量或方法。,46,静态方法,与静态方法相关的几个要点: 类的静态方法只能访问其他的静态成员 静态方法没有this 非静态方法不能覆盖静态方法,class StaticFun static int i = 10;int j;static void setValue(int x) j=x;/出错System.out.println(“ “+ i); ,不能访问非静态变量j,可以访问静态变量i,class StaticTest static void test()

20、 class Staticex extends StaticTestvoid test() /出错 ,47,静态块,如果需要通过计算来初始化静态变量,可以声明一个静态块。 静态块仅在该类被加载时执行一次。 只能初始化类的静态数据成员。,class TryInitialization static int values = new int10; /静态数组成员static for(int i=0; ivalues.length; i+)valuesi = (int)(100.0*Math.random(); ,48,final 关键字,final 修饰符可应用于类、方法和变量。 final在应用

21、于类、方法和变量时意义是不同的,但本质是一样的:final表示不可改变。,49,抽象类 2-1,定义抽象类的目的是提供可由其子类共享的一般形式。 子类可以根据自身需要扩展抽象类。 抽象类不能实例化。 抽象方法没有函数体。 abstract void display(); 抽象方法必须在子类中给出具体实现。,50,抽象类2-2,在以下情况下,某个类将成为抽象类: 当一个类的一个或多个方法为抽象方法时。 当该类为一个抽象类的子类,并且没有为所有抽象方法提供实现细节或方法主体时。 当一个类实现一个接口,并且没有为所有抽象方法提供实现细节或方法主体时。,51,接口纯抽象类,public interfa

22、ce InterfaceName extends BaseInterfaces 在interface中所有的方法都是public的,即使你没有声明它是public的. 在interface中所有的数据成员都是public static final的,即使你没有声明。,52,实现interface,实现interface的类,其interface中所有的方法必须被“实现”,否则这个类成为一个抽象类。 所有实现interface中的方法必须被声明为public. Interface可以从多个interface得到继承,但是不能继承类. Interface Vampire extends Dange

23、rousMonster, Lethal void drinkBlood();,53,接口,Java 程序中,类一次只能继承一个类但可以实现多个接口。 接口也可用来定义可由类使用的一组常量。,54,interface 接口的多继承,不同的类可以实现(implement)同一个接口,同一个类可以实现多个接口,在implements子句中用逗号分隔。class A implements B,C,D ,55,高级访问控制,访问修饰符为: public protected private 如果一个类或类的成员前没有任何访问修饰符时,它们获得缺省的访问权限。,56,高级访问控制总结,57,内部类,在类中定

24、义的类称为内部类。 内部类之外的类称为外部类。 内部类可以访问其外部类的所有变量和方法,并能够以和外部类的其他非静态成员相同的方式直接引用它们。 内部类完全在其包围类的范围之内。 外部类可以通过创建内部类的实例来访问内部类的方法和属性。,58,对象的容纳,数组(array)集合(collection) Set List Map,60,数 组,所有容纳方式的基础 比其它的容纳方式有更高的效率,61,Arrays,为数组提供一系列静态方法。 equals(xx,xx) 相同类型的两个数组,值是否相同。如果数组元素为对象,那么将调用对象的equals()方法来判断是否相同。 sort(xx ) 按照

25、升序排列数组,如果数组元素为对象,那么将调用对象的compareTo()来得到结果。 fill(xx,value) 为当前所有数组元素赋参数2的值。 binarySearch (xx,value)在数组xx找寻值为value的元素,并且返回元素索引值。 asList( Object a ) 为数组生成一个List对象。,62,数组的特点,优势: 效率高 可以容纳主类型数据 缺点 不够灵活 长度确定 类型确定,63,集合,Collection 对象的集合 对于重复没有特殊规定 Set 无序的collection 不许重复 List 有序collection 允许重复 Map 多列的collect

26、ion 值与键的成对存储,64,Iterator,遍历对象的方式(对象) 所有collection都有Iterator属性,可以通过iterator() 获得。 Iterator本身只提供向下搜索功能(next()),扩展的ListIterator提供向上搜索(previous()。 Example-HamsterMaze,65,for-each循环,static void printAll(Collection c)/对于数组或集合c中每一个元素efor (Object e:c) System.out.println(e); ,66,泛型(Generics),泛型为java提供了类型安全.

27、类似于C+中的模板 泛型的声明 class 名称 class ArrayList /E是其中的泛型,是任何对象或接口(除基本数据类型外) 泛型的主要的用途和使用场合:涉及到暂存数据和读取数据的基本结构类及数组,字典对象时,都建议使用泛型,67,GUI编程,目标,掌握如何使用布局管理器构造复杂的布局,69,布局管理器,用户界面上的组件可以按不同方式排列。 Java使用布局管理器来管理这些排列方式。 每当需要重新调整屏幕大小或重新绘制屏幕上任一项目时,就要用到布局管理器。 AWT提供一组用来进行布局管理的类,称为布局管理器或布局。所有布局都实现 LayoutManager接口。,70,布局类型,J

28、ava中的布局类型包括以下几种: FlowLayout(流式布局) BorderLayout (边界布局) GridLayout(网格布局) GridBagLayout(网格包布局) CardLayout (卡片布局),71,FlowLayout 是 Applet 和 面板的缺省布局管理器。组件从左上角到右下角进行排列。 BorderLayout 按北、南、东、西、中的不同区域划分将组件排列于容器中。 GridLayout 将组件按行和列排列。所有组件大小相同。 GridBagLayout 能将组件放置在最精确的位置。各组件的大小可以不同。 CardLayout可存储几个不同的布局管理器,72

29、,GUI,AWT 事件模型,目标,事件控制的要点 AWT 事件结构 基本事件控制 使用多个监听器 匿名类,74,AWT采取的事件控制过程,监听器对象属于一个类的实例,这个类实现了一个特殊的接口,名为“监听者接口” 事件源是一个对象,它可以注册一个或多个监听器对象,并向其发送事件对象。 事件源将在发生事件时向所有注册的监听器发送事件对象。 监听器对象使用事件对象中的信息来确定它们对事件的响应。,75,总结2-1,事件是描述事件源状态变化的对象。用户与GUI组件交互就会生成事件。 事件源是一个生成(或触发)事件的对象。当这个对象的内部状态改变时,事件就会发生。 在Java事件处理中,所有的事件都派

30、生自类EventObject。此类是在 java.util包中定义。,76,总结2-2,java.awt.event 包中有四个语义事件:ActionEvent、AdjustmentEvent、ItemEvent、TextEvent。 在发生事件时,事件源将调用监听器定义的相应方法。 适配器类包括所有方法,但不包含功能。,77,GUI编程,Swing,目标,使用 Swing GUI 的容器使用 Swing 文本组件使用 Swing 中用于选择性输入的常用组件使用 Swing 菜单,79,AWT,Abstract Windows Toolkit 最原始的 Java GUI 工具包。 Java 技

31、术的每个版本上都成为了一种标准配置 AWT只拥有所有平台上都存在的组件的公有集合。所以你在AWT中无法获取如表或树等高级组件,因为它们在某些平台上不支持。AWT的组件特征同样遵循这一原则。它只提高平台上公有的特征。例如AWT按钮不能附着图片,因为在Motif平台上,按钮是不支持图片的。,80,Swing,Java1.2引入称为Swing的新的GUI组件库。 Swing包括javax.swing包及其子包。 Swing有一个与平台无关的实现,而且具有一个艺术状态的属性集。 尽管Swing独立于AWT,但它是依照基本的 AWT类实现的。,81,Swing 应用程序的容器层次,设计 GUI 时,都有

32、用于放置可视化组件的主窗口。 Container 对象可用于将组件组合在一起。 容器中的组件根据特定布局排列。 Swing 中的容器有两类:- 顶级容器- 中间容器,82,顶级容器,JFrame:用于框架窗口的类,此窗口带有边框、标题、用于关闭和最小化窗口的图标等。带 GUI 的应用程序通常至少使用一个框架窗口。 JDialog:用于对话框的类。 JApplet:用于使用 Swing 组件的 Java Applet 的类。,83,中间容器,JPanel:最灵活、最常用的中间容器。 JScrollPane:与 JPanel 类似,但还可在大的组件或可扩展组件周围提供滚动条。 JTabbedPan

33、e:包含多个组件,但一次只显示一个组件。用户可在组件之间方便地切换。 JToolBar:按行或列排列一组组件(通常是按钮)。,84,总结 2-1,Java 基本类是作为 AWT 的扩展而开发的 Swing 是 JFC 下的一组类,提供轻量级可视化组件,可用于创建美观的 GUI Swing 中的容器有两类:顶级容器、中间容器 通过 Swing标签既可以显示文本,也可以显示图像,85,总结 2-2,JTextComponent是Swing文本组件的根类 Swing中用于选择性输入的常用组件有:JCheckBox、JRadioButton、JList、JComboBox 菜单是 GUI 中非常有用的

34、一部分,86,异常处理,异常的概念 异常的分类 捕获异常 声明异常 抛出异常 创造自己的异常 总结,88,异常体系结构,所有异常类型都是 内置类Throwable的子类,用于Java运行时系统 来显示与运行时系 统本身有关的错误,用于用户程序可能捕获的异常,也是用来创建用户异常类型子类的类。,Error类对象由Java虚拟机生成并抛出; Exception类对象由应用程序处理或抛出。,89,异常的分类,异常是一个对象,它继承自Throwable类,所有的Throwable类的子孙类所产生的对象都是例外. Error:由Java虚拟机生成并抛出,Java程序不做处理. RuntimeExcept

35、ion(被0除等系统错误,数组下标超范围):由系统检测, 用户的Java 程序可不做处理,系统将它们交给缺省的异常处理程序. Exception(程序中的问题,可预知的): Java编译器要求Java程序必须捕获或声明所有的非运行时异常 throw:用户自己产生异常,90,Error 类,Error 类继承了Throwable 类 。 运行时系统将 Error 类用于不指望程序能从其恢复过来的灾难性故障 。,91,异常的生命周期,92,声明异常,一个方法不处理它产生的异常,而是沿着调用层次向上传递,由调用它的方法来处理这些异常,叫声明异常(throws)或抛出异常。 当重写父类的某个方法时,子

36、类方法声明的异常类型不能超出父类方法声明的异常类型。 在声明异常的方法名后面加上要抛出(throws)的异常的列表 returnType methodName(parameterlist) throws exceptionList,93,线程,主要内容,线程的概念 Java中建立线程的三种方法 线程的调度 线程的基本控制 线程的互斥与同步,95,主线程,在Java程序启动时,一个线程立刻运行,该线程通常称为程序的主线程。 主线程的重要性体现在两个方面: 它是产生其他子线程的线程。 通常它必须最后完成执行,因为它执行各种关闭动作。,96,声明一个 Thread 类的子类,并覆盖 run() 方法

37、。 class mythread extends Thread public void run( ) /* 覆盖该方法*/ 启动线程 public static void main(String arg) mythread mt=new mythread();mt.start(); ,创建线程 3-1,声明一个实现 Runnable 接口的类,并实现 run() 方法。class myRunnable implements Runnablepublic void run( ) /* 实现该方法*/ 启动线程 public static void main(String arg) Thread

38、t=new Thread(new myRunnable();t.start(); ,创建线程 3-2,要触发一个新线程,使用 start() 方法,如: Mythread t = new Mythread();/extends t.start(); Thread t = new Thread (new MyRunnable();/implements t.start(); 在调用 start() 方法时,将创建一个新的控制线程,接着它将调用 run() 方法。 run() 方法中的代码定义执行线程所需的功能。,启动线程2-1,class MyThread1 extends Thread pub

39、lic static void main(String args) Thread t= Thread.currentThread(); System.out.println(“主线程是: “+t);MyThread1 ex = new MyThread1();ex.start();public void run() System.out.println(“子线程是:“+this); ,或者使用 implements Runnable,创建线程示例,创建线程 3-3,1.5之后Java新增了Callable接口。 提供了一个call方法可以作为线程的执行体,它比run方法更加强大: call()

40、方法可以有返回值 call()方法可以抛出异常class myCallable implements Callable public String call( ) throws Exception/* 实现该方法*/ ,线程的结束,当一个线程执行完所有语句后就自动终止,调用线程的stop()方法,也可以强制终止线程。 如果希望线程正常终止,可采用标记来使线程中的run()方法退出。,102,Daemon threads,守护线程是为其它线程提供服务的线程 守护线程一般应该是一个独立的线程,它的run()方法是一个无限循环. 守护线程与其它线程的区别是,如果守护线程是唯一运行着的线程,程序会自动

41、退出 守护线程的设置方法 isDaemon( ) setDaemon( ) 例:Daemons.java,103,线程同步,有时两个或多个线程可能会试图同时访问一个资源例如,一个线程可能尝试从一个文件中读取数据,而另一个线程则尝试在同一文件中修改数据 在此情况下,数据可能会变得不一致 为了确保在任何时间点一个共享的资源只被一个线程使用,使用了“同步”,104,如何在 Java 中获得同步,同步基于“监视器”这一概念。“监视器”是用作互斥锁的对象。在给定时刻,只有一个线程可以拥有监视器。 Java中所有的对象都拥有自己的监视器 两种方式实现同步: 使用同步方法 synchronized void

42、 methodA() 使用同步块 synchronized(object) /要同步的语句 ,105,wait-notify 机制 2-1,为避免轮流检测,Java提供了一个精心设计的线程间通信机制,使用wait()、notify()和notifyAll()方法 。 这些方法是作为 Object 类中的 final 方法实现的。 这三个方法仅在 synchronized 方法中才能被调用。,106,wait-notify 机制 2-2,wait()方法告知被调用的线程退出监视器并进入等待状态,直到其他线程进入相同的监视器并调用 notify( ) 方法。 notify( ) 方法通知同一对象上

43、第一个调用 wait( )线程。 notifyAll() 方法通知调用 wait() 的所有线程,具有最高优先级的线程将先运行。,107,线程方法与锁,sleep(milliseconds) 不释放互斥锁 suspend( ) 不释放互斥锁 suspend( ) resume( ) wait( ) 释放互斥锁 wait( ) notify( )或 notifyAll( ) Object类的方法,108,线程优先级,某一时刻只有一个线程在执行,调度策略为固定优先级调度。级别相同时,由操作系统按时间片来分配。 自私的线程:有很高的优先权的线程,不主动睡眠或让出处理器控制权。,109,IO,主要内容

44、,Java的基本输入输出 字节流 字符流 对象的序列化,111,什么是数据流 ?,文件,程序,终端,文件,程序,网络端点,数据流,起点,终点,网络端点,文件,字符串 存储区,数据流是指所有的数据通信通道 在java中有关流的操作使用java.io.*,112,System类管理标准输入输出流和错误流 System.in:从标准输入获取输入(通常是键盘) System.out:把输出送到缺省的显示(通常是显示器) System.err:把错误信息送到缺省的显示 每当main方法被执行时,就自动生成上述三个对象 System.in属于BufferedInputStream类型 System.out

45、属于PrintStream类型 System.err属于PrintStream类型,113,Java I/O库的设计原则,两种流 原始流:原始流处理器接收一个Byte数组对象、String对象或文件对象,并声称一个InputSteam类型的流对象 例如:ByteArrayInputStream, FileInputStream, PipedInputStream, StringBufferInputStream。链接流(装饰流): 可以接收另一个(同种类)流对象作为流源,并对其进行功能扩展。同样类型的流用做链接流类的流源。 例如:FilterInputStream下的BufferedInput

46、Stream, DataInputStream, LineNumberInputStream, PushbackInputStream。 ObjectInputStream和SequenceInputStream,114,字节输入流继承结构,链接流处理器:就是可以接收另一个流对象作为流源,并对之进行功能扩展的流类 InputStream类型的链接流处理器包括以下7个,都接收另一个InputStream对象作为流源 FilterInputStream:过滤输入流,它将另一个输入流作为流源。它有4个子类: BufferedInputStream:用来从硬盘将数据读入到一个内存缓冲区中,并从该缓冲区

47、提供数据 DataInputStream:提供基于多字节的读取方法,可以读取基本数据类型的数据 LineNumberInputStream:提供带有行计数功能的过滤输入流 PushbackInputStream:提供特殊功能,可以将已经读取的字节“推回”到输入流中 ObjectInputStream:可以将使用ObjectOutputStream串行化的基本数据类型和对象重新并行化 SequenceInputStream:可将两个已有的输入流连接起来形成一个输入流,115,字节输入流继承结构,原始流处理器可以被链接流处理器所装饰:一方面,链接流对象接收一个原始流对象或者另一个链接流对象作为流源

48、(表现形式上就是把它们作为链接流类构造函数的参数);另一方面,它们都对流源对象的内部工作方法做了相应的改变。比如: BufferedInputStream:装饰了InputStream的内部工作方式,使得流的读入操作使用缓冲机制(即不会对每一次的流读入操作都产生一个物理的读盘动作) LineNumberInputStream和PushbackInputStream:使得流的读入操作带有行计数功能或者可以将已经读取的字节“推回”到输入流中。它们在实际工作中很少用到,它们是为了支持用java语言制作编译器而准备的。 DataInputStream:可以读取各种不同的基本数据类型以及String类型

49、的数据,这一点可以从它所提供的各个read方法可以看出来。使用这个流处理器以及它的搭档DataOutputStream ,可以将原始数据从一个地方通过流移到另一个地方,116,字节输出流继承结构,原始流处理器 ByteArrayOutputStream:输出流的汇集是一个byte数组 FileOutputStream:输出流的汇集是一个文件对象 PipedOutputStream:用于向一个数据管道输出数据,117,字节输出流继承结构,链接流处理器: FilterOutputStream:过滤输出流,它将另一个输出流作为流汇。其子类有: BufferedOutputStream:向一个内存缓冲区中写出数据,并将此中的数据输出到硬盘中 DataOutputStream:可以写出基本数据类型的数据 PrintStream:用于产生格式化输出 ObjectOutputStream:将基本数据类型和对象串行化与DataInputStream相对应的是DataOutputStream。后者负责将由基本数据类型和String对象组成的数据格式化,并输出到一个流中,使得任何机器上的任何DataInputStream类型的对象都可以读入这些数据。所有的写方法都以write开始,比如writeByte()等,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报