资源预览内容
第1页 / 共40页
第2页 / 共40页
第3页 / 共40页
第4页 / 共40页
第5页 / 共40页
第6页 / 共40页
第7页 / 共40页
第8页 / 共40页
第9页 / 共40页
第10页 / 共40页
亲,该文档总共40页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
2020 5 19 1 第四章 Java面向对象高级特性 2020 5 19 2 本章要点 Static final关键字抽象类接口包内部类访问控制其它 2020 5 19 3 4 1static关键字 用static 静态的 修饰的变量或方法又称为类变量和类方法 类变量 静态变量 在成员变量声明时使用static关键字 注意点 类变量只在系统加载其所在类时分配空间并初始化 实例化对象时不再分配空间 所有实例对象将共享类的静态变量 用途可以用来在实例对象之间进行通信 复习变量 描述对象的属性成员变量 类的变量定义部分所定义的变量 2020 5 19 6 类似于其他语言中的全局变量 可以用类名直接调用 如 Count counter例1doubled Math PI 类名 Static变量 2020 5 19 7 注意点 见Hello static java 静态方法只能访问方法体内定义的局部变量 自己的参数和静态变量 因静态方法不是通过调用对象实例 故在静态方法中没有this指针 子类不重写 覆盖 父类的静态方法 而是隐藏不能将非静态方法重写为静态的方法 反之亦然 main 是一个静态方法 是程序的入口点 可以使JVM不创建实例对象就可以运行方法 2020 5 19 8 静态初始化程序类中不属于任何方法体中 并以static关键字修饰的语句块 如 static I 5 System out println Staticcode I I 注意静态语句块只在加载类时执行一次 通常用来进行类成员变量的初始化 2020 5 19 9 4 2final关键字 在Java中 可以用final关键字声明类 成员方法 成员变量 被定义成final的类不能再派生子类如 Java lang String为一个final类 被定义为final的方法不能重写 优点是在运行时进行效率优化 举例 被定义为final的变量只能被赋值一次 常用来定义常量 变量名一般大写 2020 5 19 10 4 3abstract关键字 abstract方法只有定义而没有方法体的方法 abstract类包含一个或多个抽象方法的类 定义抽象类的格式为 abstractclass抽象类名 注意点抽象类不能实例化 可派生子类 在子类中具体定义方法的功能 抽象类可以没有抽象方法 这样是为了禁止创建实例 2020 5 19 11 目的是为一类对象建立抽象的模型 在同类对象所对应的体系中抽象类往往位距顶层 使类的设计变的清晰 支持多态 为类的体系提供通用的接口 2020 5 19 12 Employeee newManager 正确Employeee newEmployee 错误 abstractclassEmployee abstractvoidraiseSallory inti 没有 直接以分号结尾 ClassManagerextendsEmployee 若子类没有实现抽象方法 voidraiseSallory inti 那么子类也必须是抽象的 接口用关键字interface来定义的Java中的接口是一系列方法的声明 是一些方法特征的集合 一个接口只有方法的特征没有方法的实现 因此这些方法可以在不同的地方被不同的类实现 而这些实现可以具有不同的行为 功能 接口是客户端代码与提供服务的类之间的 规约 接口是抽象类的变体 接口中的所有方法都是抽象的 没有一个有程序体 4 4接口 2020 5 19 14 接口定义格式 public abstract interface接口名 extends父接口1 父接口2 publicstaticfinal 常量定义 publicabstract 方法定义 接口的成员变量默认具有final属性 即常量 接口的方法为abstract 仅有声明 没有实现 2020 5 19 15 接口的实现与使用implements关键字用来表示某类实现某个接口 在类体中可以使用接口中定义的常量 且须实现接口中定义的所有方法 一个类可以实现多个接口 在implements中用 分隔 例如 PublicinterfaceFlyer publicvoidtakeoff publicvoidland publicvoidfly 2020 5 19 16 PublicclassAirplaneimplementsFlyer publicvoidtakeoff 实现起飞的操作 publicvoidland 下落 publicvoidfly 起飞 2020 5 19 17 接口的多态接口的引用比类更灵活 一个接口的引用 可以指向任意不相关的 实现了这个接口的类对象 对比 继承中 父类的引用只能指向它的子类对象 example Hello interface java注意 接口的引用 只能调用该类实现这个接口的方法 而不能调用这个类对象自身的成员方法 什么时候使用接口 1 多重继承 2 声明方法 期望一个或更多的类来实现该方法 3 揭示一个对象的编程接口 而不揭示类的实际程序体 4 捕获无关类之间的相似性 而不强迫类关系 5 描述 似函数 对象 它可以作为参数被传递到在其它对象上调用的方法中 2020 5 19 19 多重继承 Java中规定一个类只能继承一个父类 但可以实现多个接口 Java是利用接口实现多重继承的 父类方法interface 1interface2 interface n 抽象或具体父类 Interface 1 Interface 2 Interface n 子类 2020 5 19 20 接口的扩展 通过继承 通过创建接口的子接口来增加新的方法 如 InterfaceShape voiddraw voiderase interfaceShapeAreaextendsShape doublearea 2020 5 19 21 接口与抽象类 两者有一定的相似 又有区别接口中方法都是抽象的 而抽象类中可以定义带有方法体的不同方法一个类可以实现多个接口 而只可继承一个抽象父类接口不是类体系的一部分 即与实现它的类不构成继承体系 抽象类通常位于类体系顶层 接口可用于多重继承 2020 5 19 22 4 5包 包的概念Java中包是相关类与接口的一个集合 它提供了命名空间的管理和访问 包具有特定的访问控制权限 Java中编译器把包对应于文件系统的目录和文件管理 还可以使用压缩文件的格式存储 zip或jar 一个包就是一个文件夹 包还可以包含子包 子目录 2020 5 19 23 JDK中提供的包有Java appletJava awt Java event等 例如 名为Java applet的包中 所有类文件都存储在目录classpath java applet下 这里classpath由环境变量来设定 2020 5 19 24 包机制的优点 易根据包中类的功能找到所需要的类 包中的类是相关的 每个包都是命名空间 不同包中类的名字不冲突 同一个包中的类之间有比较宽松的访问机制 包的定义与使用定义用关键字package如 packagegraphics 说明 package语句指定某类加入graphics包 并存放路径为classpath graphics 2020 5 19 25 如原文件中没有package语句 则指定为无名包 通常放在源文件的目录下 package只能有一条 并在源程序的第一行 一个类只能属于一个包 包名以 为分隔符 2020 5 19 26 使用包成员 import语句放在源程序的前面如 importgraphics circle 引入包中的Circle类importgraphics 引入包中所有的类如果没有用import语句引入包的类 则可用长名引用格式 包名 类名如 graphics circlemycircle newgraphics circle 通常没有必要这样做 一般只有在两个包有同名类时 使用长名引用方式 2020 5 19 27 4 6访问权限控制 Java中有四中不同的访问权限private 私有的protected 受保护的public 公开的缺省 default 1 类成员的访问控制 2020 5 19 28 2 类的访问控制 4 7内部类 定义在类中的类 称为内部类 也称为嵌套类 内部类本身是一个类 但它同时又是外部类的一个成员 内部类根据放置的位置和修饰符又可细分为 成员内部类 局部内部类 静态内部类 匿名内部类 内部类的主要优点之一 内部类的实例与外部类的实例共享一种 特殊关系 内部类中的代码可以访问外部类的所有成员 甚至是那些标识为private的成员 Java程序设计与应用开发 第2版 30 成员内部类作为外部类的一个成员存在 与外部类的属性 方法并列 publicclassGroup2 privateintcount publicclassStudent Stringname publicStudent Stringn1 name n1 count publicvoidoutput System out print this name publicvoidoutput Students1 newStudent 李明 s1 output System out println count this count publicstaticvoidmain Stringargs Group2g2 newGroup2 g2 output Group2 Students newGroup2 Student 李四 s output 声明成员内部类 访问其外部类的成员变量 内部类的成员 name output 不能为static 编译出错 因在静态方法main中 不能访问非静态成员类Student的构造方法 创建内部类对象 并通过内部类对象访问内部类成员 外部类方法 可以与内部类方法同名 问题 该语句能否正确执行 31 局部内部类在方法中定义的内部类 只能访问方法中常量 和外部内所有成员 PublicclassOuter privateintout i 1 publicvoidf finalintk finalintj 10 classInner Inner intk System out println out i System out println j newInner k publicstaticvoidmain String args Outerout newOuter out f 3 定义在方法内部 可以直接访问外部类的实例变量 可以访问外部类的局部变量 即方法内的变量 但是变量必须是final的 访问局部内部类须先有外部类对象 32 静态内部类 classOuter staticclassInner 静态内部类可以直接生成 而不需要通过外部类对象生成 Outer Inneri newOuter Inner 静态内部类只能访问外部类的静态成员 只有静态内部类才可以声明静态成员 内部类被声明为静态后 无法正常访问外部类非静态成员 受到很大的限制 只能通过new一个外部类对象来访问 33 使用静态内部类的原因 需要在内部类定义静态成员 希望隐藏内部类 避免类名重复在开发大型应用程序时需要设计大量的类 类存在重名的可能为了避免这种情况 可以把可能重名的类设置为static public的内部类其他类在引用时要使用完成的内部类名标识 外部类名 内部类明 这样就避免了类名重复 34 publicclassGroup6 publicstaticclassStudent staticintcount Stringname intnumber publicStudent Stringn1 name n1 count number count publicvoidoutput System out println this name number this number publicstaticvoidmain Str
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号