第2章 Java面向对象编程基础.ppt_第1页
第2章 Java面向对象编程基础.ppt_第2页
第2章 Java面向对象编程基础.ppt_第3页
第2章 Java面向对象编程基础.ppt_第4页
第2章 Java面向对象编程基础.ppt_第5页
已阅读5页,还剩129页未读 继续免费阅读

下载本文档

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

文档简介

第2章Java面向对象编程基础 本章要点类及对象的概念 类的定义 创建类的实例对象 类的成员定义 类及其成员的访问控制 类及其成员的修饰 类的继承 多态技术 制作用户预定义类包接口的概念和应用 异常处理 2 1类的定义Java是一种纯面向对象的编程语言 面向对象程序设计的基本思想是将现实世界中的事物抽象为对象 抽象出来的对象被赋给相应的状态和行为 通过对消息的响应完成一定的任务 在现实生活中 任何事物都可以被认为是对象 Object 如 汽车 电视机 时钟 人等 对象都有两个共性 1 具有一定的状态和特性 如电视机有尺寸 外形 颜色等外部特性 2 每个对象对应一组特定的操作 如电视机有开 关 选择频道等操作 面向对象程序设计方法就是把现实世界中对象的状态和操作抽象为程序设计语言中的对象 达到二者的统一 对同一种对象的所有共性进行抽象 就得到了类的概念 面向对象程序设计中的对象是由描述状态的属性和对这些属性进行维护和操作的一系列方法组成的事务处理单位 类相当于创建对象实例的模板 通过对其实例化得到同一类的不同实例 2 1 1类的声明 任何一个Java程序都是由一个个类组成的 编写Java程序的过程就是从现实问题中抽象出Java可实现的类并用合适的语句定义它们的过程 这个定义过程包括对类内各种变量和方法的声明和定义 创建类的对象 也包括类间各种关系和接口的声明和定义 类声明的格式如下 public friendly abstract final class类名 extends父类名 implements接口名表 变量声明 方法声明 包含关键字class的一行称为类头 花括号内的部分称为类体 类声明使用关键词class 后跟类名 类名必须是合法的标识符 在class关键词前面可以使用修饰符 类的修饰符说明了类的属性 主要有访问控制修饰符符 抽象修饰符 最终修饰符等 public friendly 访问控制修饰符 在类中使用的访问控制修饰符有public或friendly 访问控制修饰符不仅针对于类 类的变量 方法的访问也有该项的限制 后面会专门介绍 abstract 抽象修饰符 声明该类不能被实例化 即抽象类不能创建类的实例 抽象类中主要包含一些静态属性和抽象方法 可以由非抽象子类继承 final 最终修饰符 声明该类不能被继承 即没有子类 class类名 关键字class表示类声明 类名必须是合法的标识符 extends父类名 关键词extends声明该类的父类 implements接口名表 关键词implements声明该类要实现的接口 如果实现多个接口 则各接口之间用逗号分隔 例2 1 类声明 程序名 Sample2 1 javaclassPrimitiveDefault 类声明booleanbl 成员变量声明charch byteb shortsh inti longl floatf doubled publicclassSample2 1 类声明publicstaticvoidmain String args 应用程序中的main 方法 PrimitiveDefaultpd 声明对象pdpd newPrimitiveDefault 为对象pd分配内存 使用new和类中的构造方法System out println boolean型变量的缺省值 pd bl System out println char型变量的缺省值 pd ch System out println byte型变量的缺省值 pd b System out println short型变量的缺省值 pd sh System out println int型变量的缺省值 pd i System out println long型变量的缺省值 pd l System out println float型变量的缺省值 pd f System out println double型变量的缺省值 pd d 运行结果如下 boolean型变量的缺省值 falsechar型变量的缺省值 byte型变量的缺省值 0short型变量的缺省值 0int型变量的缺省值 0long型变量的缺省值 0float型变量的缺省值 0 0double型变量的缺省值 0 0 本例中声明了2个类 由public修饰的类名要和文件名相同 类PrimitiveDefalse中声明的8个变量是基本数据类型的变量 Java对基本类型变量的大小事先进行了定义 都赋予了默认值 其大小不随着硬件平台和操作系统的改变而变化 这也正是Java程序具有很强移植能力的原因之一 类Sample2 1中声明的变量pd是引用数据类型的 必须要使用new和构造函数实例化之后才能引用 2 1 2类体 类头定义了类的性质 类体则定义了类的具体内容 类体中一般包括成员变量的声明和成员方法的定义 类成员变量可以存储反映类属性的数据 而类的成员方法则规定了类的行为 如对类属性数据的某种操作等 成员变量可以是基本数据类型的 也可以是引用数据类型的 成员变量的作用范围是整个类 即在类的所有方法中都有效 但对其它类是不可见的 在其它类中访问属性成员需要声明来源 具体地 是在程序中使用类名或对象名声明 可以在类体的方法定义中声明和初始化局部变量或对象 这些局部变量只在方法内有意义 在方法外是没有意义的 类体中的一个方法可以调用另一个方法 但Java不允许递归调用 也不允许交叉循环调用 Java也不允许嵌套定义方法 类的成员方法的作用范围也是整个类 即在定义它的类中是可见的 但对其它类是不可见的 在其它类中调用类的方法成员需要声明来源 具体地 是在程序中使用类名或对象名声明 例2 2类变量和方法声明 程序名 Sample2 2 javaclassRectangle 类声明floata b 成员变量声明Rectangle floatx floaty 构造方法a x b y floatarea 成员方法声明returna b publicclassSample2 2 类声明publicstaticvoidmain String args main 方法Rectanglerec 声明对象recrec newRectangle 10 8 为对象分配内存 使用new和类中的构造方法 System out println 矩形的长为 rec a 引用类成员变量aSystem out println 矩形的宽为 rec b 引用类成员变量bSystem out println 矩形的面积为 rec area 引用类成员方法area 运行结果如下 矩形的长为 10 0矩形的宽为 8 0矩形的面积为 80 0 2 1 3类的构造方法 构造方法用来初始化新创建的对象 类可以包含一个或者多个构造方法 不同的构造方法根据参数的不同来决定要初始化的新对象的状态 所有的Java类都有构造方法 用来对新的对象进行初始化 构造方法与类的名字是相同的 且不声明返回值类型 当一个类有多个构造方法时 所有的构造方法的名字都是相同的 只是所带参数的个数和类型不同而已 编译器会根据参数列表的数目以及类型来区分这些构造方法 所以 当创建对象的时候 要根据它的参数是否与初始化的新对象相匹配来选择构造方法 例2 3 构造方法 程序名 Sample2 3 javaclassCircle publicCircle 构造方法 无参数 r 0 publicCircle doubleR 构造方法 带参数 r R doubler 成员变量声明doublearea 成员方法声明return3 14 r r 计算圆面积 voidsetR doublenewR 设置圆半径r newR doublegetR 获取圆半径returnr publicclassSample2 3 publicstaticvoidmain String args Circlec0 c 引用变量声明c0 newCircle 用无参数的构造方法创建对象c0c newCircle 2 0 用带参数的构造方法创建对象cSystem out println 圆1的半径为 c getR System out println 圆1的面积为 c area c setR 5 0 System out println 圆2的半径为 c getR System out println 圆2的面积为 c area System out println 圆3的半径为 c0 getR System out println 圆3的面积为 c0 area 运行结果如下 圆1的半径为 2 0圆1的面积为 12 56圆2的半径为 5 0圆2的面积为 78 5圆2的半径为 0 0圆2的面积为 0 0当用无参数的构造方法创建对象时 半径为0 而用带参数的构造方法创建对象时 半径为参数的值2 0 2 1 4类的成员变量 类的成员变量用于存储反映类属性的数据 和在方法中声明的局部变量是不同的 成员变量的作用域是整个类 而局部变量的作用域只是方法内部 声明成员变量的语法如下 public protected private static final transient volatile 变量类型变量名 表达式 public protected private 访问控制符 在后面的章节中介绍 static 成员控制修饰符 说明该类型的变量为静态变量 或类变量 静态变量由该类的所有实例对象共享 在编译时 静态变量保存在为类声明的存储单元中 在访问静态变量时无须事先初始化它所在的类 没有用static修饰的变量称为实例变量 final 常量声明修饰符 用该符号声明后 在程序的运行过程中不能再改变它的值 实际使用中 final常与static结合使用 如 staticfinalintpi 3 14159 transient 存储控制临时变量修饰符 用来声明一个临时变量 在默认情况下 类中所有变量都是对象永久状态的一部分 当对象被存档时 这些变量必须同时被保存 但用transient限定的变量不属于对象的永久状态 如 transientinttemp volatile 异步控制修饰符 表示多个并发线程共享的变量 使各个线程对该变量的访问能保持一致 如 volatileintv 例2 4 类的成员变量和局部变量 程序名 Sample2 4 javaclassVariable 类声明intx 0 y 0 z 0 类的成员变量voidinit inta intb 类的成员方法x a y b intz 5 局部变量System out println 在init 方法中 System out println x x y y z z publicclassSample2 4 publicstaticvoidmain Stringargs Variablev newVariable 声明并创建类对象System out println 在init 方法之前 System out println x v x y v y z v z v init 20 30 调用init 方法System out println 在init 方法之后 System out println x v x y v y z v z 运行结果如下 在init 方法之前 x 0y 0z 0 在init 方法中 x 20y 30z 5 在init 方法之后 x 20y 30z 0从运行结果可以看到 方法init 中的局部变量z仅在方法内部有效 2 1 5类的成员方法 成员方法即类的方法成员 用于实现类的操作功能 是类行为的具体体现 Java中声明方法的语法如下 public protected private static final abstract native synchronized 返回值类型方法名 形式参数表 throws异常类表 局部变量声明 功能语句 public protected private 访问控制符 将在后面介绍 static 说明该方法为静态方法 也称为类方法 静态方法属于类 只要声明了类 就可以直接调用该类的方法 静态方法只能操作静态变量 不能访问定义在类中的实例变量 没有用static修饰的方法就称为实例方法 实例方法只能在类的实例或子类的实例中调用 final 说明该方法为最终方法 即不能被子类重载 子类的方法和父类方法同名 后面将会说明 说明为final的方法通常与关键字private一起使用 例如 privatefinalf meth abstract 说明该方法是抽象方法 即该方法只有方法说明 没有方法体 如果一个类包含一个或多个抽象方法 则该类必须为抽象类 抽象类不能被实例化 但抽象类中的成员方法并不都是抽象方法 且抽象类中不能有私有成员方法 也不能有静态成员方法 因为不能被实现 注意 抽象类必须被继承 抽象方法必须被重载 native 说明该方法是用与平台有关的开发语言编写的 即可以用该方法把Java代码和其他语言的代码集成在一起 synchronized 说明该方法是同步方法 用于控制多个并发线程对共享数据的访问 在后面多线程中会具体介绍同步方法 返回值类型 说明该方法的返回值类型 如果该方法无返回值 则返回值类型为void 形式参数列表 说明该方法中参数的数目和类型 异常类表 说明该方法可能产生的例外 例2 5 变量和方法的声明和使用 程序名 Sample2 5 javaclassA 声明类Aintx 声明变量xpublicintx 声明方法x 返回值为intreturnx publicvoidsetX intnewX 声明方法setX 无返回值x newX publicclassSample2 5 声明类Sample2 5publicstaticvoidmain String args Aa1 newA 声明并实例化A的对象a1Aa2 newA 声明并实例化A的对象a2Aa3 newA 声明并实例化A的对象a3a1 setX 1 调用对象a1的方法setX 给x赋值1a2 setX 2 调用对象a2的方法setX 给x赋值2a3 x 3 给对象a3的变量x赋值3System out println a1 x a1 x 打印a1的变量x的值System out println a2 x a2 x 打印a2的变量x的值System out println a3 x a3 x 打印a3的方法x 返回值 运行结果如下 a1 x 1a2 x 2a3 x 3本例中 类A的对象a1 a2和a3是互相独立的 所以各对象输出的值各不相同 2 2对象2 2 1创建对象 类是一个抽象的概念 而对象则是具体的 实实在在存在的东西 对象的使用就是某个类的实例化操作 类就象是某个产品的图纸 根据图纸生产出来的具体产品就是对象 在现实世界里 我们使用的是产品而不是产品的图纸 同样的道理 Java运行的是用类创建的实例化对象 一个典型的Java程序会创建很多对象 它们通过消息传递进行相互交流 共同完成程序的功能 一旦任务完成 对象就会被垃圾收集器收回 完成它从创建 使用到清除的生命三部曲 Java中创建新的对象必须使用new语句 该语句有三个组成部分 声明对象 实例化 初始化 格式为 类名对象名 new类名 实际参数表 声明对象由类名和对象名组成 如等号左边部分 实例化由new操作符实现 实例化就是为对象分配内存 new操作符需要一个参数 就是类的构造方法 初始化工作由构造方法完成 构造方法一方面提供了类名 由new操作符根据类名决定为新建对象分配多大的内存 另一方面 构造方法将新建对象初始化 创建对象相当于定义一个变量 既可采用上述方法 也可以把上述步骤分开进行 即先声明对象 以后再创建 2 2 2使用对象 对象被实例化后即可使用 对象的使用是通过引用对象变量或调用对象的方法来实现的 对象变量和方法都是通过运算符 来实现的 例2 6 创建和使用对象 程序名 Sample2 6 javaclassPoint intx y Point inta intb x a y b voidsetx intnewx x newx voidsety intnewy y newy publicclassSample2 6 publicstaticvoidmain String args Pointp 声明对象p p newPoint 10 20 使用new和类中的构造方法实例化对象 System out println x1 p x 引用对象中的变量System out println y1 p y p setx 5 调用对象中的方法p sety 10 System out println x2 p x System out println y2 p y 程序运行结果如下 x1 10y1 20 x2 5y2 10 2 2 3清除对象 使用new操作符创建对象后 Java虚拟机自动为该对象分配内存并保持跟踪 Java虚拟机能判断出对象是否还被引用 对不再被引用的对象释放其占用的内存 这种定期寻找不再使用的对象并自动释放对象占用内存的过程称为垃圾收集 Java虚拟机实际上是利用变量生存期来管理内存的 对象的引用被保存在变量中 如果当前的代码段不属于对象的作用域或把对象的引用赋值为null 该对象就成为一个无用对象 会被自动清除 Java的垃圾收集机制减轻了程序员的负担 使程序员不需要跟踪每个生成的对象 增强了Java程序的稳固性 2 3访问控制修饰符 2 3 1publicpublic是公共访问控制符 一个类被声明为公共类 表明它可以被所有的其它类所引用 即这个类作为整体是可见和可使用的 程序的其它部分可以创建这个类的对象 访问这个类内部可见的变量和调用其可见的方法 一个类作为整体对程序的其它部分可见 并不能代表类内的所有变量和方法也同时对程序的其它部分可见 前者只是后者的必要条件 类的变量和方法能否为所有其它类所访问 还要看这些变量和方法自己的访问控制符 如果这些变量和方法自己的访问控制符也被声明为public 那么程序中的所有其它部分都可访问或调用它们 假如一个类没有访问控制符 说明它具有缺省的访问控制特性 这种缺省的访问控制权规定该类只能被同一个包中的类引用 而不可以被其它包中的类引用 这种访问特性又称为包访问性 通过声明类的访问控制符可以使整个程序结构清晰 严谨 减少可能产生的类间干扰和错误 同样道理 类内的变量和方法如果没有访问控制符来限定 也说明它们具有包访问性 可以被同一个包中的其它类所访问和调用 包的具体概念和使用方法将在后面介绍 简单地说 定义在同一个程序中的所有类属于一个包 具有public 公共 访问控制修饰符的类成员可以被所有的类访问和调用 如果类成员没有访问控制修饰符 则该成员只能被同一个包中的类访问和调用 2 3 2private 用private修饰的变量或方法只能被该类自身所访问和调用 而不能被任何其它类 包括该类的子类访问和调用 private修饰符用来声明那些类的私有成员 它提供了最高的保护级别 具有private 私有 访问控制修饰符的类成员不能被其它的类访问和调用 2 3 3protected 用protected修饰的类成员允许类本身 在其他包中的子类以及在相同包中的类访问 通常 需要子类访问的成员 可以使用protected进行限制 被private修饰的类成员只能被该类自身所访问和调用 用protected修饰的类成员允许类本身 在其他包中的子类以及在相同包中的类访问 具有public访问控制修饰符的类成员可以被所有的类访问和调用 如果类成员没有访问控制修饰符 则该成员只能被同一个包中的类访问和调用 2 3 4静态变量 静态方法和静态初始化器 一 静态变量类的静态变量用static修饰 静态变量在类定义中已被系统唯一地创建 分配存储单元 因此使用类名声明 非静态变量是在创建类的实例对象时 才由系统创建 因此应使用对象名声明 由于静态变量的唯一性 所以Java也允许使用对象名声明类的静态变量 由于非静态变量的不一致性 即不同对象创建的非静态变量占用不同的存储单元 所以不能用类名来声明非静态变量 静态变量最本质的特点是 它们是类的变量 而不属于任何一个类的具体对象 换句话说 对于该类的任何一个具体对象而言 静态变量是一个公共的存储区域 任何一个类的对象访问它时 取到的都是相同的值 同样 任何一个类的对象去修改它时 也都是在对同一个存储区域操作 二 静态方法 类的静态方法用static修饰 static修饰符修饰的变量是属于类的公共变量 与之相仿 用static修饰符修饰的方法 是属于整个类的类方法 而不用static修饰符限定的方法 是属于某个具体类对象或实例的方法 声明一个方法为static至少有三重含义 1 调用这个方法时 应该使用类名做前缀 而不是某一个具体的对象名 2 非static的方法是属于某个对象的方法 在这个对象创建时对象的方法在内存中拥有自己专用的代码段 而static的方法是属于整个类的 它在内存中的代码段将随着类的定义而分配和装载 不被任何一个对象专有 3 由于static方法是属于整个类的 所以它不能操纵和处理属于某个对象的域 而只能处理属于整个类的域 也即 static方法只能处理static的数据 从本质上来说静态方法在类定义中已被系统唯一地创建 分配存储单元 因此使用类名声明 非静态方法是在创建类的实例对象时 才由系统创建 因此应使用对象名声明 虽然静态方法也具有唯一性 但Java不允许使用对象名声明类的静态方法 由于非静态方法的不一致性 即不同对象创建的非静态方法占用不同的存储单元 所以不能用类名来声明非静态方法 使用上 非静态方法的操作目标即声明调用它的对象 而静态方法需要用参数指出操作目标 所以 非静态方法常常没有参数 而静态方法至少有一个参数 三 静态初始化器 静态初始化器是由关键字static引导的一对大括号括起的语句组 它的作用与类的构造函数有些相似 都是用来完成初始化的工作 但是静态初始化器与构造函数有三点根本的不同 1 构造函数是对每个新创建的对象初始化 而静态初始化器是对每个类进行初始化 2 构造函数是在用new运算符产生新对象时由系统自动执行 而静态初始化器则是在它所属的类加载入内存时由系统调用运行的 3 不同于构造函数 静态初始化器不是方法 没有方法名 返回值和参数表 静态初始化器用于给类的静态域设置初值 该值在所有的对象中是一致的 可以将静态初始化器看成是一个static复合语句 2 3 5抽象类与抽象方法 一 抽象类在类定义头使用abstract修饰 声明不为其分配存储单元 即不能创建抽象类的实例 抽象类中主要包含一些静态变量和抽象方法 可以由非抽象子类继承 由于抽象类是它的所有子类的公共属性的集合 所以使用抽象类的一大优点就是可以充分利用这些公共属性来提高开发和维护程序的效率 因为把各类的公共属性从它们各自的类定义中抽取出来形成一个抽象类的组织方法显然比把公共属性保留在具体类中要方便得多 前面已经阐述过 面向对象技术是要用更接近于人类思维方式的方法来处理实际问题 抽象类的设立就是这种思想的具体体现之一 它是模仿人类的思维模式的产物 除了交通工具类 在交通工具的类树中还存在着其他的抽象类 读者可以自己试着找找看 二 抽象方法 抽象方法指的是只有方法头 没有方法体的方法 用abstract来修饰 作为类修饰符 abstract声明了一种没有具体对象的 出于组织概念的层次关系需要而存在的抽象类 作为类方法修饰符 abstract则声明了一种仅有方法头 而没有具体的方法体和操作实现的抽象方法 abstract方法用一个分号来代替方法体的定义 至于方法体的具体实现 那是由当前类的不同子类在它们各自的类定义中完成的 也就是说 各子类在继承了父类的抽象方法之后 再分别用具有不同的语句的方法体来覆盖它 形成若干个名字相同 返回值相同 参数列表也相同 但具体功能有一定差别的方法 需要特别注意的是 所有的抽象方法 都必须存在于抽象类之中 我们知道 抽象类中定义的是一组它所有子类所共有的公共域和方法 抽象方法就是其中的公共方法 它是所有子类都要使用的同类操作 定义abstract方法的主要目的也就在于此 事实上 为abstract方法书写方法体是没有意义的 因为abstract方法所依附的abstract类没有自己的对象 只有它的子类才存在具体的对象 而它的不同子类对这个abstract方法有互不相同的实现方法 除了参数列表和返回值之外 抽取不出其他的公共点 所以就只能把abstract方法作为一个共同的接口 表明当前抽象类的所有子类 都使用这个接口来完成某种功能 当然 定义abstract方法也有特别的优点 就是可以隐藏具体的细节信息 使调用该方法的程序不必过分关注类及其子类的内部状况 由于所有的子类使用的都是相同的方法头 而方法头里实际包含了调用该方法的程序语句所需要了解的全部信息 要注意区别抽象方法和空方法 抽象方法头最后有分号 空方法有方法体括号 方法头最后没有分号 抽象方法只能用于抽象类中 Java接口 特殊的抽象类 中的方法都是抽象方法 如ActionListener接口中的actionPerformed方法 ItemListener接口中的itemStateChanged方法等都是抽象方法 抽象类 接口 中的抽象方法能够统一方法名 提供方法的外部特性 在抽象类 接口 的子类中覆盖 实现 父类的抽象方法时 方法头保持不变 以便保留方法的外部特性 如与接口的对应关系等 方法体完全覆盖 以实现特定功能 2 3 6final和finalize 一 final修饰类用final修饰的类称为最终类 该类不能被继承 如果一个类被final修饰符所修饰和限定 说明这个类不可能有子类 如果把一个应用中有继承关系的类组织成一棵倒长的树 所有类的父类是树根 每一个子类是一个分支 那么声明为fmal的类就只能是这棵树上的叶结点 即它的下面不可能再有分支子类 注意 final类一定是叶结点 而叶结点却不一定是final类 被定义为final的类通常是一些有固定作用 用来完成某种标准功能的类 如Java系统定义用来实现网络功能的InetAddress Socket等类都是final类 在Java程序中 当通过类名引用一个类或其对象时 实际真正引用的既可能确是这个类或其对象本身 也可能是这个类的某个子类及子类的对象 即具有一定的不确定性 将一个类定义为final则可以将它的内容 属性和功能固定下来 与它的类名形成稳定的映射关系 从而保证引用这个类时所实现的功能正确无误 二 final修饰常量 程序中经常需要定义各种类型的常量 并为它们取一个类似于变量名的标识符名字 这样就可以在程序中用这个名字来使用常量 而不是直接使用数值 final就是用来修饰常量的修饰符 一个类的变量如果被声明为final 那么它的取值在程序的整个执行过程中都不会改变 也就是一个常量 用final修饰符说明常量时 需要注意以下几点 1 需要说明常量的数据类型 2 需要同时指出常量的具体取值 3 因为所有类对象的常量成员 其数值都固定一致 为static 为了节省空间 常量通常被声明为static 修饰符final也可用于修饰方法中的局部变量 使之成为方法中的常量 如 privatestaticfinaldoublepi 3 14159 三 final修饰方法 最终方法使用final修饰符 一经定义后不能再修改 即不能被子类覆盖 正如final修饰符所修饰的域成员是无法变更的常量一样 final修饰符所修饰的类方法 是功能和内部语句不能被更改的最终方法 即是不能被当前类的子类覆盖的方法 在面向对象的程序设计中 子类可以把从父类那里继承来的某个方法重新定义 形成同父类方法同名 解决的问题也相似 但具体实现和功能却不尽一致的新的类方法 这个过程称为覆盖 如果类的某个方法被final修饰符所限定 则该类的子类就不能再重新定义与此方法同名的自己的方法 而仅能使用从父类继承来的方法 这样 就固定了这个方法所对应的具体操作 可以防止子类对父类关键方法的错误的重定义 保证了程序的安全性和正确性 需要注意的是 所有已被private修饰符限定为私有的方法 以及所有包含在final类中的方法 都被缺省地认为是final的 因为这些方法要么不可能被子类所继承 要么根本没有子类 所以都不可能被覆盖 自然都是最终的方法 最终类不能被继承 最终方法不能被覆盖 最终变量不能被更改 四 finalize 名为finalize的方法称为终结器 在面向对象的程序设计中 对象与单纯的变量一样 有其产生和消亡的过程 当一个对象对程序不再有用时应该回收它 即释放它所占用的内存空间及其它资源 正如构造函数是创建新对象时执行的方法一样 终结器是回收对象时执行的方法 下面是一个类的终结器的例子 protectedvoidfinalize System out println AnObjectOf toString hasbeenfree collected 可见 终结器是名为finalize的方法 它没有参数列表和返回值 上例中 终结器的作用是在屏幕上输出信息表明当前对象被成功回收 在某些面向对象的语言 如C 中 对象的释放和回收是通过编程人员执行某种特殊操作来实现的 像利用new运算符创建对象一样 利用free运算符可以回收对象 但在Java语言中 为方便 简化编程并减少错误 对象的回收是由系统的垃圾回收机制自动完成的 Java的垃圾回收机制是一个系统后台线程 它与用户的程序共存 能够检测用户程序中的各对象的状态 当它发现一个对象已经不能继续被程序所利用时 就把这个对象记录下来 这种不能再使用的对象被称为内存垃圾 当垃圾达到一定数目且系统不是很忙时 垃圾回收线程会自动完成所有垃圾对象的内存释放工作 在这个过程中 在回收每个垃圾对象的同时 系统将自动调用执行它的终结器方法 所以 类似于构造函数 终结器方法不由编程人员显式调用执行 而是在特定的时刻一一对象被回收时刻由系统自动执行的 而且终结器的调用时刻对于编程人员来说也是未知的 它取决于系统的垃圾回收线程 2 3 7其它修饰符及修饰符的混合使用 变量的修饰符除了访问控制修饰符和静态 最终修饰符以外 还有volatile 易失修饰符 和transient 过渡修饰符 方法的修饰符除了访问控制修饰符和静态 抽象 最终修饰符以外 还有synchronized 同步修饰符 和native 本地修饰符 如果一个类的变量被volatile所修饰 说明这个变量可能同时被几个线程所控制和修改 即这个变量不仅仅被当前程序所掌握 在运行过程中可能存在其它的未知的程序的操作来影响和改变该变量的取值 所以在使用当中应该特别留意这些其它影响因素 通常 volatile用来修饰接受外部输入的变量 如表示当前时间的变量将由系统的后台线程随时修改 以保证程序中取到的总是最新的当前的系统时间 native修饰符一般用来声明用其它语言书写方法体并具体实现方法功能的特殊的方法 这里的其它语言包括C C FORTRAN 汇编等 由于native的方法的方法体使用其它语言在程序外部写成 所以所有的native方法都没有方法体 而用一个分号代替 在Java程序里使用其它语言编写的模块作为类方法 其目的主要有两个 充分利用存在的程序功能模块已经和避免重复工作 由于Java是解释型的语言 它的运行速度比较慢 在某些实时性比较强或执行效率要求比较高的场合 仅仅使用Java程序不能满足需要时 就可以利用native方法来求助于其它运行速度较高的语言 但是 在Java程序中使用native方法时应该特别注意 由于native方法对应其它语言书写的模块是以非Java字节码的二进制代码形式嵌入Java程序的 而这种二进制代码通常只能运行在编译生成它的平台之上 所以整个Java程序的跨平台性能将受到限制或破坏 除非保证native方法引入的代码也是跨不同平台的 可以通过特别设计在有限范围内实现 否则使用这类方法时应特别谨慎 synchronized修饰符修饰的类方法 如果是一个类的方法 即static的方法 那么在被调用执行前 将把系统类Class中对应当前类的对象加锁 如果synchronized修饰的是一个对象的方法 未用static修饰的方法 则这个方法在被调用执行前 将把当前对象加锁 synchronized修饰符主要用于多线程共存的程序中的协调和同步 大多数情况下 修饰符是可以混合使用的 例如类的三个修饰符public final和abstract之间并不互斥 一个公共类可以是抽象的 例如 publicabstractclasstransportmeans 一个公共类也可以是final的 例如 publicfinalclassSocket 但是需要注意的是一个抽象类却不能同时被final修饰符所限定 即abstract和final不能共存 因为抽象类没有自己的对象 其中的抽象方法也要到子类中才能具体实现 所以被定义为abstract的类通常都应该有子类 而final修饰符则规定当前类不能有子类 二者显然是矛盾的 下面是一些修饰符混用时需要注意的问题 1 abstract不能与final并列修饰同一个类 2 abstract不能与private static final或native并列修饰同一个方法 3 abstract类中不能有ptivate的成员 包括变量和方法 4 abstract方法必须在abstract类中 5 static方法中不能处理非static的变量 2 4继承与重载 2 4 1类的继承Java通过子类实现继承 继承指的是某个对象所属的类在层次结构中占一定的位置 具有上一层次对象的某些属性 在Java中 所有的类都是通过直接或间接地继承java lang Object类得到的 在类的继承过程中 被继承的类为父类或超类 继承得到的类为子类 父类包括所有直接或间接被继承的类 子类可以从父类那里继承所有非private的变量和方法作为自己的成员 也可以修改父类的变量或重写父类的方法 需要注意的是 Java不支持多重继承 继承可以简化子类的代码 并使父类的代码得到重用 Java中的继承是通过extends关键字来实现的 在声明类时使用extends关键字指明新声明类的父类 就在两个类之间建立了继承关系 新声明的类称为子类 例如 classAextendsB A是子类 B是父类 类A可以继承类B中非private的成员变量和方法 如果类声明时 并没有指明继承于某个父类 则隐含认为该类继承于类Object 通过继承 使得代码可以重用 提高了编程的效率 同时 由类封装而带来的数据隐藏 也可以提高程序的可维护性 面向对象的这种继承关系实际上很符合人们的日常思维模式 交通工具分为陆地 海上 空中三大类 而陆地交通工具又可以细分为汽车 自行车等 空中交通工具可分为喷气式飞机和气球 飞艇等 海上交通工具则可划分为轮船 赛艇等 其中 交通工具这个抽象概念对应的交通工具类是所有其它类的父类 它是所有交通工具的公共特性的集合 这些公共特性包括移动速度 承载人数 载货量 所处状态 正常 待修等 等静态的数据特性 以及启动 停止 加速 减速 维修等动态的行为特性 将交通工具具体化 特殊化 就分别派生出三个子类 陆地交通工具类 海上交通工具类和空中交通工具类 这三个子类一方面继承了父类交通工具的所有特性 包括数据与操作 即它们也拥有速度 载货量 启动 加速 减速等数据和操作 另一方面它们又根据自己对原有的父类概念的明确和限定 专门定义了适用于本类特殊需要的特殊特性 如对于所有的空中交通工具 应该有飞行高度的特性和升高 降低的行为 这些特性对非空中的其它交通工具是不适合的 从空中交通工具到喷气式飞机和气球 飞艇的继承遵循完全相同的原则 2 4 2类的多态 多态技术包括变量的隐藏 Hide 方法的覆盖 Override 和方法的重载 Overload 变量的隐藏指的是 在子类中 对从父类继承来的变量重新声明 用this和super或类名 对象名区别子类和父类的同名变量 方法的覆盖指的是 在子类中 对从父类继承来的方法重新定义 使用类名或对象名或this或super区分父类与子类的方法 方法头保持不变 方法体可以改写 以覆盖父类的同名方法 实现特定的功能 重载指的是 在同一个类中 定义多个同名的形式参数不同的方法 以增强方法对参数的适应性 重载的方法使用参数的个数或类型来区分 一 关键字this和super this表示的是当前对象本身 准确地说 this代表了当前对象的一个引用 利用this可以调用当前对象的方法或使用当前对象的变量 例如 this x 20 给当前对象的变量x赋值this test 调用当前对象的方法test returnthis 返回当前对象super表示的是当前对象的直接父类对象 是当前对象的直接父类对象的引用 this和super还可以用来调用当前对象或父类对象的构造方法 例如 super test 调用直接父类的方法test 二 变量的继承与隐藏 子类可以继承父类非私有的所有变量 子类中对从父类继承来的变量重新声明 即子类中的变量与父类中的变量同名 称为变量的隐藏 当子类需要引用父类的同名变量时 必须使用super关键字 例如 classfather intx classsonextendsfather intx 变量x隐藏了父类的同名变量 System out println 输出父类中的变量 super x 引用父类中的变量 三 方法的继承 重载与覆盖 父类的非私有方法可以被子类所继承 子类对从父类继承来的同名方法重新声明称为方法的覆盖 子类在重新声明父类已有的方法时 应保持与父类完全相同的方法头 即应与父类有完全相同的方法名 返回值和参数列表 调用时 使用类名或对象名或this或super来区分父类与子类的方法 重载是指在同一个类中 声明多个同名的方法 但形式参数不同 以增强方法对参数的适应性 重载的方法使用参数的个数或类型来区分 四 构造方法的继承与重载 构造方法的重载是指同一个类中存在着若干个具有不同参数列表的构造方法 构造方法的继承遵循以下的原则 1 子类无条件地继承父类的不含参数的构造方法 2 如果子类自己没有构造方法 则它将继承父类的无参数构造方法作为自己的构造方法 如果子类声明了构造方法 则在创建新对象时 它将先执行继承自父类的无参数构造方法 然后再执行自己的构造方法 3 对于父类的含参数构造方法 子类可以通过在自己构造方法中使用super关键字来调用它 但这个调用语句必须是子类构造方法的第一个可执行语句 2 5包 2 5 1包的声明包是Java用来存放类的文件夹 是一种松散类的集合 创建包即新建文件夹 Java中的包把各种类组织在一起 使得程序功能清楚 结构分明 包的声明格式如下 package包名 包的声明语句必须是 Java文件的第一行语句 创建包就是在当前文件夹下创建一个子文件夹 以便存放这个包中包含的所有类的 class文件 例如 packageuserpack 该语句就在当前文件夹下创建了一个名为userpack的子文件夹 例如 packageuserpack publicclassTestPackage publicstaticStrings Hello 编译后 将字节码文件TestPackage class放到userpack文件夹中 通常也将对应的源文件放到同一文件夹中 2 5 2包的引用 使用用户自定义类的方法与使用系统类相同 用import语句引入 例如 使用上节userpack包中TestPackage类的程序UseTestPackage java如下 importjava io importuserpack publicclassUseTestPackage publicstaticvoidmain Stringargs System out println MessagefromTestPackageis TestPackage s 2 5 3Java的系统程序包 Java提供了大量的类 为便于管理和使用 分为若干个程序包 程序包又称类库或APl包 所谓API ApplicationProgramInterface 即应用程序接口 APl包一方面提供丰富的类与方法供我们使用 如画图形 播放声音等 另一方面又负责和系统软硬件打交道 把用户程序的功能圆满实现 所有JavaAPl包都以 java 开头 以区别用户创建的包 表2 1列出了常用的程序包和所支持的功能 1 java 1ang程序包是Java语言的基础类库 包含基本数据类型 数学函数 字符串类等 这是唯一自动引入每个Java程序的类库 包含 数据类型类Integer Double Float Long等 基本数学函数类Math 字符串类String StringBuffer等 System Object类 线程Thread和ThreadDeath类 2 java util程序包包含一些低级的实用工具类 这些实用工具类使用方便 而且很重要 主要有 日期Date类 堆栈Stack类 随机数Random类 向量Vector类等 3 java io程序包是Java语言的输入输出类库 Java语言的文件操作都是由该类库中的输人输出类来实现的 此外该类库还提供了一些与其它外部设备交换信息的类 Java io程序包除了包含标准输入 输出类外 还有缓存流 过滤流 管道流和字符串类等 4 程序包含有访问网上资源的URL类 用于通信的Socket类和网络协议子类库等 Java语言是一门适合分布式计算环境的程序设计语言 网络类库正是为此设计的 其核心就是对Internet协议的支持 目前该类库支持多种Internet协议 包括HTTP Telnet FTP等等 5 java awt程序包提供了创建图形用户界面的全部工具 它包括许多我们熟悉的图形组件类如窗口 对话框 按钮 复选框 列表 菜单 滚动条和文本区等类 用于管理组件排列的布局管理器Layout类 以及常用的颜色Color类 字体Font类 Java awt event类库用来处理各种不同类型的事件 6 java applet程序包java applet是所有Applet程序的基础类库 它包含了一个Applet类 所有Applet程序都是从该类中派生的 7 java security程序包包括java security acl和java security interfaces子类库 利用这些类 可对Java程序进行加密 设定相应的安全权限等 2 6接口 2 6 1接口的声明接口是一种特殊的类 用来实现Java中的多重继承 接口中只具有公共静态最终变量和公共抽象方法 接口定义使用interface关键词 并使用public访问控制修饰符 接口定义的一般格式为 public interface接口名 implements父接口名表 public static final 数据类型变量名 表达

温馨提示

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

评论

0/150

提交评论