Java面向对象高级特性.ppt_第1页
Java面向对象高级特性.ppt_第2页
Java面向对象高级特性.ppt_第3页
Java面向对象高级特性.ppt_第4页
Java面向对象高级特性.ppt_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2019/5/30,1,第五章,Java面向对象高级特性,2019/5/30,2,本章要点,Static 、final关键字 抽象类 接口 包 内部类 访问控制 其它,2019/5/30,3,5.1 static关键字,用static(静态的)修饰的变量或方法又称为类变量和类方法。 类变量(静态变量) 在成员变量声明时使用static关键字。 注意点: 类变量只在系统加载其所在类时分配空间并 初始化,实例化对象时不再分配空间,所有 实例对象将共享类的静态变量。 用途 可以用来在实例对象之间进行通信,2019/5/30,4,类似于其他语言中的全局变量,可以用类 名直接调用。 如: Count.counter 例题5-1 static成员变量举例(P115) 类方法(静态方法) 在类的成员方法声明中带有static关键字, 访问时可通过类名访问 例题5-2 static方法举例(P117),类名,Static变量,2019/5/30,5,注意点 静态方法只能访问方法体内定义的局部变量、自己的参数和静态变量。(因静态方法不是通过调用对象实例,故在静态方法中没有this指针) 子类不能重写父类的静态方法,不能将非静态方法重写为静态的方法。 main() 是一个静态方法,是程序的入口点可以使JVM不创建实例对象就可以运行方法。,2019/5/30,6,静态初始化程序 类中不属于任何方法体中,并以static关键字修饰的语句块。 如: static I=5; System.out.println(“Static code:I=”+I+) ; 注意 静态语句块只在加载类时执行一次,通常用来 进行类成员变量的初始化。 例题5-3:静态语句块与静态变量的访问。,2019/5/30,7,5.2 final关键字,在Java中,可以用final关键字声明类、成员 方法、成员变量。 被定义成final的类不能再派生子类如: Java.lang.String为一个final类。 被定义为final的方法不能重写,优点是在运行时进行效率优化。 被定义为final的变量只能被赋值一次,常 用来定义常量,变量名一般大写。 例题5-4 final 变量在构造方法中赋值,2019/5/30,8,5.3抽象类,抽象方法 只有定义而没有方法体的方法。 抽象类 包含一个或多个抽象方法的类。 定义抽象类的格式为: abstract class 抽象类名 注意点 抽象类不能实例化。可派生子类,在子类中 具体定义方法的功能。,2019/5/30,9,目的是为一类对象建立抽象的模型,在同类对象所对应的体系中抽象类往往位距顶层。 使类的设计变的清晰、支持多态、为类的体 系提供通用的接口。,2019/5/30,10,Employee e=new Manager(); /正确 Employee e=new Employee(); /错误,abstract class Employee abstract void raiseSallory(int i); Class Manager extends Employee void raiseSallory(int i); ,2019/5/30,11,5.4 接口,接口定义格式: 修饰符interface接口名extends 父接 接口体; 修饰符为public时,指明任何类均可以使 用这个接口。 修饰符缺省时,只有与该接口定义在同一 个包中的类才可以访问该接口,2019/5/30,12,接口的实现与使用 implements 关键字用来表示实现某个接口, 在类体中可以使用接口中定义的常量,且须 实现接口中定义的所有方法。 一个类可以实现多个接口,在implements中 用“,” 分隔。例如:,Public interface Flyer public void takeoff(); public void land(); public void fly(); ,2019/5/30,13,Public class Airplane implements Flyer public void takeoff ( ) / 实现起飞的操作 public void land ( ) /下落 public void fly( ) /起飞 ,例题5-5:通过接口实现多态示例.,2019/5/30,14,多重继承,Java中规定一个类只能继承一个父类,但可以实现多个接口, Java是利用接口实现多重继承的。,父类方法 interface_1 interface2 interface_n,抽象或具体父类,Interface_1,Interface_2,Interface_n,子类,2019/5/30,15,通过继承扩展接口,通过创建接口的子接口来增加新的方法。 如:,Interface Shape void draw(); void erase(); interface ShapeArea extends Shape double area(); ,2019/5/30,16,接口与抽象类,两者有一定的相似,又有区别 接口中方法都是抽象的,而抽象类中可以定义带有方法体的不同方法 一个类可以实现多个接口,而只可继承一个抽象父类 接口不是类体系的一部分,即与实现它的类不构成继承体系。抽象类通常位于类体系顶层。 接口可用于多重继承。,2019/5/30,17,5.5 包,包的概念 Java中包是相关类与接口的一个集合,它提供了命名空间的管理和访问。包具有特定的访问控制权限。 Java中编译器把包对应于文件系统的目录和文件管理,还可以使用压宿文件的格式存储。 JDK中提供的包有 Java.applet Java.awt Java.event等。 例如:名为 Java.applet的包中,所有类文件都存储在目录 classpathjavaapplet 下,这里classpath由环境变量来设定。,2019/5/30,18,包机制的优点,易根据包中类的功能找到所需要的类,包中的类是相关的。 每个包都是命名空间,不同包中类的名字不冲突。 同一个包中的类之间有比较宽松的访问机制。 包的定义与使用 定义用关键字 package 如:package graphics; 说明: .package语句指定某类加入graphics包,并存放路径 为 classpathgraphics,2019/5/30,19,.如原文件中没有package语句,则指定为无名包,通常放在源文件的目录下。 .package只能有一条,并在源程序的第一行。 .一个类只能属于一个包 .包名以“.”为分隔符,2019/5/30,20,使用包成员,import 语句放在源程序的前面 如:import graphics .circle /引入包中的Circle类 import graphics.* /引入包中所有的类 如果没有用import语句引入包的类,则可用长名 引用类 格式: 包名.类名 如:graphics.circle mycircle=new graphics.circle() 通常没有必要这样做。,2019/5/30,21,包使用示例,例5.6定义二维几何图形的包并使用,2019/5/30,22,5.6访问控制,Java中有四中不同的访问权限 private-私有的 protected-受保护的 public - 公开的 缺省(default),2019/5/30,23,5.7 内部类,内部类是在一个类的定义中定义的类,也称为嵌套类。 内部类可作为外包类(包容类)的一个成员使用,可以访问外包类的所有成员(包括带有static、private的成员变量和方法)。 例题5-8 内部类访问外包类成员(P139) 例题5-9 内部类通过修饰符访问同名外包类成员(P140),2019/5/30,24,在外包类的语句块中定义内部类,内部类可以定义在一个方法体的语句块中定义,这时内部类可以访问语句块中的局部变量,但只限于在该语句块运行期内,当该方法运行结束后内部类对象将不能访问所在语句块中的局部变量。 例题5-10,2019/5/30,25,在外包类以外的其他类中访问内部类,对于可在外包类之外访问的内部类,引用内部类时必须使用完整的标识: 外包名.内部类名 假设B 是A的内部类则有 A a=new A( ) A.B b=a.new B( ) 例题5-11 在外包类之外访问内部类,2019/5/30,26,内部类的特点: 内部类可以使用它所在类的静态成员变量、实例成员变量和方法中的局部变量。 内部类的修饰符有abstract,private或protected。 内部类可作为其他类的成员。,2019/5/30,27,5.8 其它 基本数据类型的包装类 集合类,2019/5/30,28,5.8.1 基本数据包装类,基本数据类型在java.lang包中都有一个wrapper类。,2019/5/30,29,每个包装类中提供了有用的方法和常量,MIN_VALUE MAX_VALUE 数据类型的转换 Integer wint=new Integer(18); int p=Value(); int x=Integer.valueof(“123”).intValue(); int y=Integer.parseInt(“123”); String s= (new Integer(125).toString();,2019/5/30,30,8.2集合类,集合包含一组对象。在这个对象中存放指向其他对象的引用,Java Collection API的核心接口,2019/5/30,31,Collection,Collection Collection接口是集合接口的根,它定义了集合的通用API。JDK中没有提供该接口的实现类,而是提供了它的子接口。例如:SET和LIST Set set中的元素不能重复,是数学中集合的抽象 List List是一个有序的集合,称为列表或序列。可以包含重复的元素,矢量Vector就是一种常用的List。,2019/5/30,32,Map Map实现键值到值的映射。Map中不能包含重复的键值,每个键值最多只能映射到一个值。Hashtable就是一个常用的Map。 SortedSet 和SortedMap SortedSet 和SortedMap分别是具有排序性能的Set和Map。,2019/5/30,33,几种常用的集合,Set Set继承了接口Collection接口,包含的方法都是从Collection接口继承而来。包含方法见P145 在JDK中实现了Set接口的实用类有:HashSet类TreeSet类LinkedHashset类。 HashSet类是采用Hash表实现了Set接口。其中元素存储在一个Hash表中,并且这些元素没有固定的顺序。由于采用Hash表,当集合中元素数量较大时其访问效率比线性表要快。,2019/5/30,34,实现Set的示例,例题5-12 Set的示例,import java.util.*; public class FindDups public static void main(String args) Set s = new HashSet();/创建一个HashSet对象,缺省的初始容量是16。 for (int i=0; iargs.length; i+) /将命令行中的每个字符串加入到集合s中,其中重复的字符串将不能加入,并被打印输出。 if (!s.add(argsi) System.out.println(“Duplicate detected: “+argsi); System.out.println(s.size()+“ distinct words detected: “+s);/输出集合s的元素个数以及集合中的所有元素。 ,2019/5/30,35,TreeSet TreeSet 类实现了SortedSet接口,采用树型结构存储集合中的元素, TreeSet对象中元素按照升序排序。 LinkedHashSet LinkedHashSet类实现了Set接口,采用Hash表和链表相结合的结构存储元素。它结合了HashSet和 TreeSet的优点,既能保证集合中元素的顺序又能保证有较高的存取效率。,2019/5/30,36,List List是一种有序的集合,它继承了Collection接口同时又增加了操作 按位置存取元素 查找 遍历 子List的截取 List接口的定义P147,2019/5/30,37,JDK中提供了实现List接口的三个类: ArrayList类、LinkList类和Vector类。 ArrayList类 ArrayList类采用可变大小的数组实现List接口。 增加了访问数组大小的方法。ArrayList对象会随着元 素的增加而容积自动扩大。 ArrayList是三种类中效率 最高的也是最常用的。 例题:5-13 List使用的示例,2019/5/30,38,LinkList类 LinkList类采用链表结构实现List接口。除了实现List接口中的方法外还提供了在链表的头和尾进行get、remove和insert等操作。利用这些操作可以用来实现象数据结构中的堆栈、队列等数据结构。 Vector类 采用可变体积的数组实现List接口。该类同数组一样可以通过索引序号对所包含的元素进行访问。,2019/5/30,39,Map,Map包含了一系列键值和值之间的映射关系。一个Map对象可以看成是 一个键值和值对的集合,可以在该集合中通过一个键找到对应的值。键和值可以是任意的对象。 Map接口独立于Collection接口体系的, Map 接口的定义如P149。,2019/5/30,40,实现的5个Map接口的实用类 HashMap类、HashTable类、TreeMap类、WeekHashMap类、IdentityHashMap类 HashMap类和HashTable类 都使用Hash表实现Map接口,两者基本等价。 TreeMap类 采用有序树的结构实现Map接口,同TreeMap相类似。该类按照键的升序的次序排列元素。 WeekHashMap类 与HashMap类相类似,但WeekHashMap类中的键值在不被使用时会自动删除,由垃圾收集器回收。,2019/5/30,41,IdentityHashMap类 其特殊之处是在比较两个键值是否相同是,比较的是键的引用,而不是键对象自身。 上述Map类中,HashMap(无序的Map) TreeMap (有序的Map) 例题5-14:利用Map进行单词词频的统计。,2019/5/30,42,集合元素的遍历,Java CollectionsAPI为集合提供了Iterator(重复器)用来遍历集合中的元素。其中的方法可以使我们向前遍历所有类型的集合。 对一个Set对象的遍历次序是不确定的。 对List对象的遍历次序是从前向后。而其子接口ListIterator支持从后向前的反向遍历。,2019/5/30,43,Iterator接口包含两个接口,Iterator 和ListIterator public interface Iterator boolean hasNext(); Object next(); Void remove(); /删除当前遍历到的元素,即删除最近一次next()或Previous()调用返回的元素。 ,2019/5/30,44,ListIterator public interface ListIterator extends Iterator boolean hasNext(); Object next(); boolean hasPrevious(); object previous(); int nextIndex(); int previousIndex(); remove(); void set(object o);/ 可以改变当前遍历到的元素 void add(object o);/在下一个将要取得的元素之前插入新的元素。 ,2019/5/30,45,例题5-15: ListIterator的使用示例,2019/5/30,46,枚举、自动装箱和静态导入,枚举 枚举enumeration是许多编程语言都有的,但早期的版本并没有提供枚举。其原因就是枚举不是必需的。 但是在日常生活中非常常见,在J2SE5(2004年发布)添加了枚举类型。,2019/5/30,47,enum Transport CAR,TRUCK,AIRPLANE,TRAIN,BOAT Transport tp; tp=Transport. AIRPLANE; 可以使用的场合 if(tp=Transport. TRAIN) switch(tp) case CAR: case TRUCK: 注意:在case中,枚举常量没有使用枚举类型名来限定。,2019/5/30,48,例题:,enum Transport CAR,TRUCK,AIRPLANE,TRAIN,BOAT class EnumDemo public static void main(String args) Transport tp; tp= Transport. AIRPLANE; System.out.println(“value of tp”+tp); tp= Transport. TRAIN ; if(tp= Transport. TRAIN ) System.out.println(“tp contains Train.”);,2019/5/30,49,switch(tp) case CAR System.out.println(“A car carries people.”);break; case TRUCK : System.out.println(“A truck carries freight.”);break; case AIRPLANE: System.out.println(“A airplane flies.”);break; case TRAIN: System.out.println(“A train runs on rails.”);break; case BOAT: System.out.println(“A boat sails on water.”);break; ,Value of tp: AIRPLANE Tp contains TRAIN. A tarin runs on rails.,2019/5/30,50,Java的枚举类型是类类型,从前面的例题可见,枚举类型为类类型。但不使用new实例化enum。如: Transport tp; tp= Transport. AIRPLANE; 例题5-16 :,2019/5/30,51,values()和valueof()方法,所有的枚举类型自动地拥有方法: values() valueof()方法。其形式如下: public static enum-type values( ) 返回一个包含枚举常量列表的数组 public static enum-type valueof(String str ) 返回一个枚举常量,其值对应于传递给Str的字符串。 例题5-17:,2019/5/30,52,构造方法、方法、实例变量和枚举,每个枚举常量是一个枚举型的对象; 枚举类型可以定义构造函数,添加方法。 例题5-18:,2019/5/30,53,自动装箱和自动拆箱,包装类 Integer

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论