Java面向对象特性_new_第1页
Java面向对象特性_new_第2页
Java面向对象特性_new_第3页
Java面向对象特性_new_第4页
Java面向对象特性_new_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

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

文档简介

1、Java面向对象特性孙聪课程内容 Java概述 面向对象程序设计概念 Java语言基础 Java高级特征 常用预定义类的使用 异常处理 I/O 线程 GUI程序设计 Java网络程序设计 高级专题面向对象程序语言三个关键特点 封装 (Encapsulation) 将对象的数据与操作数据的方法相结合,通过方法来保护对象的数据与实现细节 继承 (Inheritance) 子类是父类的特例,继承父类的状态和行为 Java只支持单继承,多继承须通过接口实现 多态(Polymorphism) 编译时多态:overloading 运行时多态:“对外一个接口,内部多种实现” overriding+upcas

2、ting+dynamic binding 对象与类 访问权限控制 对象生命周期 类的继承与多态 访问权限控制 对象生命周期 类的继承与多态类和对象 类:将同一类对象都具有的数据和行为进行封装所形成的复合数据类型 定义和描述了一类对象的共同特征 类是创建对象的一种模板 对象是在其类模型基础上构造出的,是具体的实例类和对象举例(ClassAndObject.java) 类定义class EmpInfoString name;String designation;String department;void print( ) System.out.println(name+“is”+ designa

3、tion+“at”+department); 对象的生成与使用EmpInfo employee = new EmpInfo(); = “Robert Java”;employee.designation = “Manager”;employee.department = “Coffee shop”;employee.print( ); 类定义 类的组成 成员变量:基本类型/类实例 成员方法 类的成员方法与C语言函数的区别 方法只能在类中定义 调用一个类的成员方法,实际上是进行对象间或用户与对象间的消息传递 类定义 = 类声明 + 类体 类体 = 成员变量声明 + 构造

4、方法声明与定义 + 成员方法声明与定义类定义 = 类声明 + 类体 类声明publicabstract|final class ClassName extends SuperClassName implements InterfaceNameList 类定义 = 类声明 + 类体 类声明abstract|final class ClassName extends SuperClassName implements InterfaceNameList public:用来声明任意类均可访问该类 缺省(非public):只有与该类在同一包中的类可访问该类 一个Java源文件中只能有一个public类

5、,该类的类名与该源文件的文件名相同类定义 = 类声明 + 类体 类声明public class ClassName extends SuperClassName implements InterfaceNameList abstract:抽象类 final:不能被继承类定义 = 类声明 + 类体 类声明publicabstract|final class ClassName implements InterfaceNameList extends:表示类继承的关键字 SuperClassName为父类名,可以是用户自定义的类,也可以是系统类类定义 = 类声明 + 类体 类声明publicabs

6、tract|final class ClassName extends SuperClassName 表示类实现了InterfaceNameList列表中的所有接口类定义 = 类声明 + 类体 类声明publicabstract|final class ClassName extends SuperClassName implements InterfaceNameList 例: public class HelloApplet extends Applet 权限修饰符为public,类名HelloApplet,父类为JDK包自带的java.applet.Applet类 由于是public的类

7、,故所在文件名须为HelloApplet.java,同类名保持一致类体=成员变量声明+构造方法声明与定义+成员方法声明与定义 成员变量声明public|protected|privatestaticfinaltransientvolatile type variableName; public|protected|private:成员变量的访问权限 static:限制该成员变量为类变量(无static:该成员变量为实例变量) final:用于声明一个常量,该常量的值在程序中不能修改 transient:声明一个暂时性变量 volatile:在被多个线程共享时提高执行效率类体=成员变量声明+构造

8、方法声明与定义+成员方法声明与定义 方法定义=方法声明+方法体 方法声明public|protected|privatestaticfinal|abstractnativesynchronized ()throws public|protected|private,static: 与成员变量类似 final指明方法不能被重写 abstract:方法是抽象方法,没有实现体 throws:抛出异常列表(第六章)类体=成员变量声明+构造方法声明与定义+成员方法声明与定义 方法定义=方法声明+方法体 方法体 对方法的实现 若局部变量名与类的成员变量名相同,则类的成员变量被隐藏,需使用this将该成员变

9、量显露出来,例:VarTest.java的changeVar类体=成员变量声明+构造方法声明与定义+成员方法声明与定义 方法定义=方法声明+方法体 方法调用中的参数传递 基本类型参数传值 对象或数组等引用类型的参数传引用 在方法中对该引用所指向的对象的内容进行修改,则修改是永久性的 例:PassTest.java类体=成员变量声明+构造方法声明与定义+成员方法声明与定义 方法定义=方法声明+方法体 方法调用中的参数传递str=new String(“Hello”);pt.changeStr(str);void ChangeStr(String value) value=new String(“

10、different”);HellostrvalueHellodifferentstrvalueHellostr类体=成员变量声明+构造方法声明与定义+成员方法声明与定义 方法定义=方法声明+方法体 方法调用中的参数传递pt.ptValue=101.0f;pt.changeObjValue(pt);void ChangeObjValue(PassTest ref) ref.ptValue=99.0f;101.0fptrefPassTestptValue99.0fptrefPassTestptValue99.0fptPassTestptValue类体=成员变量声明+构造方法声明与定义+成员方法声明

11、与定义 方法定义=方法声明+方法体 方法调用中的参数传递 可变参数列表 类型参数名 可变参数只能作为方法参数列表中的最后一个参数 例:Calculation.java21类体=成员变量声明+构造方法声明与定义+成员方法声明与定义 构造方法的定义格式public|protected|private ( ) 构造方法的特点 构造方法的名称必须与类名相同 构造方法不能有返回值 用户不能直接调用构造方法,必须通过关键字new自动调用它 例:UseDog.java类体=成员变量声明+构造方法声明与定义+成员方法声明与定义 缺省构造方法:对于没有定义构造方法的类, 在编译时自动加入的特殊构造方法 缺省构造

12、方法不带参数且方法体为空 用缺省构造方法初始化对象时,对象的成员变量初始化为默认值 若类中已定义了构造方法,则编译器不再向类中加入缺省构造方法 例:DefaultConstructor.java 对象与类 对象生命周期 类的继承与多态访问权限控制 基本问题 “如何把变动的事物与保持不变的事物区分开” 对于类库 类库开发者需要有权限进行修改和改进 客户代码不会因为类库的改动而受到影响 解决方法 权限修饰符:类库开发者向客户程序员指定哪些可用,哪些不可用 权限修饰符 public|protected|private|(default/package)访问权限控制 前提:包类库单元 包:相关类与接口

13、的一个集合,提供了类的命名空间的管理和访问保护 Java平台中的类与接口均根据功能以包组织的,每个包中汇集了功能相关的类和接口 包机制的好处: 程序员易根据所需的功能找到相应的类 每个包都创建一个新的命名空间,因此不同包中的类名不会冲突 同一个包中的类之间有比较宽松的访问权限控制访问权限控制 前提:包类库单元 包的定义package pkg1.pkg2.pkg3.pkgn; 源文件的类应放在包存储路径中,包分隔符”.”相当于目录分隔符 包存储路径:”包的根路径pkg1.pkgn” 包的根路径由CLASSPATH环境变量指出 包定义语句在每个源程序中只能有一条,即一个类只能属于一个包 包定义语句

14、必须在程序代码的第一行访问权限控制 前提:包类库单元 包成员:包中的类和接口 只有public的包成员才能被包外的类访问 包成员的访问方法:Step1: import pkg1.pkg2.pkg3 .(classname|*); pkg1.pkg2.pkg3 表示包层次,对应于文件目录 classname指明所要import的类 通配符*表示import包中的多个类访问权限控制 前提:包类库单元 包成员:包中的类和接口 只有public的包成员才能被包外的类访问 包成员的访问方法:Step1: import pkg1.pkg2.pkg3 .(classname|*); import语句须在源程

15、序所有类声明之前,package语句之后:package /默认是package .;import /默认是import java.lang.*;类声明访问权限控制 前提:包类库单元 包成员:包中的类和接口 只有public的包成员才能被包外的类访问 包成员的访问方法:Step2: 使用包成员 使用短名(类名)引用包成员 使用长名(“包名.类名”)引用包成员(过于繁琐,一般仅当两个包中含有同名类时,为区分同名类才使用) 例:TestPackage.java访问权限控制 权限修饰符:public|protected|private|(default)同一个类同一个包子类全局privatedefa

16、ultprotectedpublic成员变量方法类privatedefaultprotectedpublic访问权限控制 权限修饰符:public|protected|(default) 用于成员变量,成员方法:除包含该成员的类之外,其他类都无法访问该成员 用于构造方法:其他类不能生成该类的实例对象 同一个类的对象之间可访问私有成员 例:TestPrivate.java同一个类同一个包子类全局privatedefaultprotectedpublic成员变量方法类privatedefaultprotectedpublic访问权限控制 权限修饰符:public|protected|private

17、|() 可以被该成员所在的包中的所有类访问 例:Greek包中的Alpha.java, Beta.java同一个类同一个包子类全局privatedefaultprotectedpublic成员变量方法类privatedefaultprotectedpublic访问权限控制 权限修饰符:public|private|(default) 可以被该成员所在的包中的所有类、以及该成员所属类的子类(不论子类是否在同一包中)访问: 同一包中: Greek包中的Theta.java, Gamma.java 子类:Theta.java与NotGreak包中的NewTheta.java 第二中情况对包权限成员不

18、成立,即其他包中的子类不能访问当前类中的包权限成员,例:NotGreek包中的NewAlpha.java同一个类同一个包子类全局privatedefaultprotectedpublic成员变量方法类privatedefaultprotectedpublic访问权限控制 权限修饰符:|protected|private|(default) 该成员可以被任何类访问同一个类同一个包子类全局privatedefaultprotectedpublic成员变量方法类privatedefaultprotectedpublic访问权限控制 包相关的其他问题:引入其他类的静态成员 程序在使用其他类中stati

19、c final的常量或static的方法时,每次引用这些常量或方法都用它们所属的类名凌乱 例:java.lang.Math类定义了常数PI以及静态方法cos(),需用double r=Math.cos (Math.PI * theta); 简化方法:import static 静态常量名|静态方法名|*; 例:import static java.lang.Math.PI;或import static java.lang.Math.*;然后直接使用:double r = cos (PI*theta );访问权限控制 源文件(.java)与类文件(.class)的管理 源文件可以按照包名指明的路

20、径放置。如 类文件也将放在反映包名的一系列目录下访问权限控制 源文件(.java)与类文件(.class)的管理 可将源文件与类文件分别存放,采用如下方式 对象与类 访问权限控制 类的继承与多态对象生命周期 对象的创建 对象的使用 对象的清除对象的创建 步骤 声明对象变量:SomeClass objectVar 对象的实例化:new SomeClass() 对象实例化的过程 为对象分配存储空间,并用默认值对成员变量初始化 执行显式初始化,即执行类成员声明时的赋值 执行构造方法的主体,完成对象初始化 返回该对象的引用例:Point.java OrderOfInit.java00 xyPoint2

21、0 xyPoint222xyPoint对象的使用 通过圆点运算符(.) 注意成员变量和方法的访问权限对象的清除 垃圾收集机制(garbage collection):当Java运行环境确定某个对象不再被使用时,将其删除 一个对象在没有引用指向它时,可作为垃圾收集 Java运行环境中的垃圾收集器周期性地释放不用的对象占用的空间 垃圾收集器在对象被收集前调用对象的finalize()方法 某些情况下可通过调用System.gc()建议JVM执行垃圾收集 对象与类 访问权限控制 对象生命周期类的继承 继承:类之间的“is a”关系 反映出一个类(子类)是另一个类(父类)的特例 继承是从已有的类创建新

22、类的一种方法public class Employee String name ;Date hireDate ;Date dateofBirth ;String jobTitle ;int grade ;public class Manager String name ;Date hireDate ;Date dateofBirth ;String jobTitle ;int grade ;String department ;Employee subordinates;类的继承 Java中用extends关键字定义子类class SubClass extends SuperClass pub

23、lic class Employee String name ;Date hireDate ;Date dateofBirth ;String jobTitle ;int grade ;public class Manager extends EmployeeString department ;Employee subordinates; 类的继承 如何从父类得到子类 子类继承父类的属性、方法,子类中只需声明特有的东西 子类并不能继承父类的所有变量和方法 带private修饰符的属性和方法不能被继承 构造方法不能被继承 在讨论权限时,“继承”与“访问”区别: “继承”反映子类的特征及父子类之

24、间关系 “访问”反映任意两个类之间的关系,这两个类可以是父类与子类,也可以不是类的继承 单继承 单继承:子类从单个父类继承 多重继承:子类从多个父类继承 Java不支持多重继承,只支持单继承(extends后的类名只能有一个) Java中继承关系形成树型层次结构 Java提供接口机制(interface),类可以通过实现多个接口达到多重继承的效果类的继承 super关键字:指向该关键字所在类的父类,用来引用父类中的成员变量或方法 例:TestSuper.java 调用当前类的构造方法:this(paramlist); 调用父类的构造方法super(paramlist); 该语句要出现在子类构造

25、方法的第一行类的继承 子类对象的创建与初始化都要经过以下步骤 分配对象所需的全部内存空间,并初始化为缺省值 按继承关系,自顶向下执行如下两步: 显式初始化 执行构造方法的主体 例:Manager2.java, Sandwich.java 注:由于任何自定义类都是Object的子类,因此以上过程实际上细化了前述对象实例化过程多态 多态 编译时多态 overloading 运行时多态 overriding upcasting dynamic binding多态 多态 编译时多态 运行时多态 overriding upcasting dynamic binding多态 编译时多态重载(overloa

26、ding) 在同一个类中一个方法名被用来定义多个方法class Screen public void print( int i) public void print( float i) public void print( String str ) 重载必须遵循的原则: 方法的参数表(包括参数的类型或个数)必须不同 方法的返回类型、修饰符可以相同也可以不同 例:TestOverloading.java多态 构造方法重载 在一个构造方法中可以利用另一个构造方法 使用this调用当前类的构造方法 目的:使对象具有不同的初始值 例:TestOverloading2.java多态 多态 编译时多态 o

27、verloading 运行时多态 upcasting dynamic binding多态 运行时多态重写(overriding) “隐藏”与“重写”: 隐藏:子类成员变量与父类成员变量同名同类型,称子类成员变量隐藏父类成员变量 重写:子类方法与父类方法具有相同的名字、参数列表、返回值类型,称子类方法重写父类方法 隐藏的含义:调用子类中与父类同名的变量和方法时,操作的是这些变量和方法在子类中的定义 例:TestOverriding.java中getDetails()多态 运行时多态重写(overriding) 方法重写的前提:存在继承关系 方法重写的规则: 子类中重写方法与父类中被重写方法返回值

28、类型相同 子类中重写方法的访问权限不能缩小 子类中重写方法不能抛出新的异常 父类中的private方法不能被重写:PrivOverride.java 方法重写是实现运行时多态的基础多态 多态 编译时多态 overloading 运行时多态 overriding dynamic binding多态 运行时多态Upcasting 子类对象既可以作为该子类的类型对待,也可以作为其父类的类型对待 将子类对象的引用转换成父类对象的引用,称为Upcasting 如:Employee e=new Manager(); 通过该变量(如e)只能访问父类的方法,子类特有的部分被隐藏多态 运行时多态Upcastin

29、g Upcasting使得数组可以包含不同类型的对象Employee staff = new Employee3;staff0 = new Manager();staff1 = new Secretary();staff2 = new Employee();多态 运行时多态:通过父类变量发出的方法调用,可能执行该方法在父类中的实现,也可能执行该方法在某子类中的实现,这只能在运行时根据该父类变量指向的具体对象类型决定Employee e;/内部多种实现:继承、重写、upcastinge.getDetails();/对外一个接口多态 多态 编译时多态 overloading 运行时多态 overriding upcas

温馨提示

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

评论

0/150

提交评论