Java面向对象程序设计 .docx
精品名师归纳总结第三章 Java 面对对象程序设计3.1 明白面对对象程序设计的基本概念3.2 把握类的使用方法3.3 熟识对象的创建与使用方法3.4 明白包的创建与使用方法3.1 明白面对对象程序设计的基本概念一、对象现实世界中,对象(Object)就是客观存在的某一事物。一辆自行车,一台运算机,它们都可以视为对象。对象普遍具有两个特点:状态(属性)和行为。比如,小鸟出名称、体 重、颜色等状态和飞行、觅食等行为。同样,自行车也有品牌、外观、重量等状态和刹车、加速、减速等行为。在面对对象程序设计中,对象是一组数据和相关方法的集合。程序中可通过变量向其传递或猎取数据,而通过调用其中的方法执行某些操作。在Java 中,对象必需基于类来创建。类是用来描述一组具有共同状态和行为的对象的原型,是对这组对象的概括、归纳与抽象表达。在面对对象程序设计中,可以让具有共同特点的对象形成类,它定义了同类对象共有的变量和方法。通过类可以生成具有特定状态和行为的实例,这便是对象。从某种程度上讲, Java 编程就是设计类,在编程中可以接受自定义方法或继承方法设计一个类。此外,仍可在编程时利用类来创建对象,然后转变对象变量值和调用对象方法 来实现程序的某些功能。二、类 三、封 装封装( Encapsulation )是将代码及其处理的数据绑定在一起的一种编程机制,该机制保证了程序和数据都不受外部干扰且不被误用。懂得封装性的一个方法就是把它想成一个黑匣 子,它可以阻挡在外部定义的代码任凭拜望内部代码和数据。对黑匣子内代码和数据的访 问通过一个适当定义的接口严格把握。封装的目的在于使对象的设计者和使用者分开,使用者不必知道对象行为实现的细节,只需要使用设计者供应的接口来拜望对象。封装是 OOP 设计者追求的理想境域,它可以为开发员带来两个好处:模块化和数据隐匿。模块化意味着对象代码的编写和爱惜可以独立进行,不会影响到其他模块,而且有很 好的重用性。数据隐匿就使对象有才能爱惜自己,它可以自行爱惜自身的数据和方法。因 此,封装机制提高了程序的安全性和可爱惜性。四、继承继承是面对对象程序设计中两个类之间的一种关系,是一个类可以继承另一个类(即它的父类)的状态和行为。被继承的类称为超类或父类,继承父类的类称为子类。一个父类可以同时拥有多个子类,这时这个父类实际上是全部子类的公共变量和方法的集合 ,每 一 个 子 类 从 父 类 中 继 承 了 这 些 变 量 和 方 法 。然而,子类也可以不受父类供应的状态和行为的限制。子类除了具有从父类继承而来的变量和方法外,仍可以增加自己的变量和方法。子类也可以转变从父类继承来的方法,即可以掩盖继承的方法。继承使父类的代码得到重用,在继承父类供应的共同特性的基础上增加新的代码,从而使编程不必一切从头开头,进而有效提高了编程效率。五、多态可编辑资料 - - - 欢迎下载精品名师归纳总结多态性可以用“一个对外接口,多个内在实现方法”来表示。也就是说,我们可以在一个类中定义多个同名方法,程序在调用某个方法时,系统会自动依据参数类型和个数的不同调用不同的方法,这种机制被称为方法重载。此外,当我们利用继承由父类创建子类时,假如父类中的某些方法不适合子类,我们无法删除它们,但可以重新定义它们,这被称为掩盖。如此一来,当我们利用子类创建对象 时,假如调用对象的某个方法,系统会第一在子类中查找此方法。假如找到,就调用子类的方法。否就,将向上查找,即在父类中查找此方法。这种情形被称为父类与子类之间方法的多态性。3.2 把握类的使用方法下面我们结合Java 程序的格式来详细介绍类的声明方法: package 包名/ 声明程序所在包import 包名 .*/ 导入外部包,可包含多条import 语句,以导入多个外部包中的类import 包名 .类名/ 声明和定义类 类修饰符 class 类名 extends 父类名称 implements 接口名称列表 / 声明成员变量或常量 拜望把握修饰符 staticfinal<数据类型 > 变量名或常量名。/ 定义其他成员变量或常量/ 声明和定义成员方法 拜望把握修饰符 abstractstaticfinalnativesynchronized返回类型 方法名 参数列表 throws 反常类型列表 / 方法体/ 定义其他方法/ 定义其他类说明说明:( 1 ) 在 一 个 Java文 档 中 可 以 包 含 多 个 类 , 但 最 多 只 能 有 一 个 为 公共类(即publicclass,也可以没有)。(2)假如存在 public class 的话,该类的类名必需与文档名相同。( 3 ) main方 法 是Java应 用 程 序 的 入 口 , 如 果 文 档 中 存 在 public class 和 main 方法,就 main 方法必需位于public class 中。main 方法的格式如下:public class 类名 / 成员变量列表public static void mainString args / 局部变量声明/ 方法体一、类声明类声明定义了类的名字及其他属性。类声明的一般格式如下:可编辑资料 - - - 欢迎下载精品名师归纳总结 类修饰符 class 类名 extends 父类名称 implements 接口名称列表 其中, class 关键字和类名是必需的, 表示可选项。类名是要声明的类的名字,它必须是一个合法的 Java标识符,习惯上首字母要大写。1类修饰符类修饰符有public 、 abstract 和 final 。假如没有声明这些类修饰符,Java 编译器默认该类为friendly 类,对于这些类,只有同一包中的类可以拜望。public ( 公 共 的 ) : 带 有 public 修 饰 符 的 类 称 为 公 共 类 , 公 共 类 可 以 被任 何 包 中 的 类 访 问 。 不 过 , 要 在 一 个 类 中 使 用 其 他 包 中 的 类 , 必 须 在程序中增加 import 语句 。abstract ( 抽 象 的 ) : 带 有 abstract 修 饰 符 的 类 称 为 抽 象 类 , 相 当 于 类的 抽 象 。 一 个 抽 象 类 可 以 包 含 抽 象 方 法 , 而 抽 象 方 法 是 没 有 方 法 体 的方 法 , 所 以 抽 象 类 不 具 备 具 体 功 能 , 只 用 于 衍 生 出 子 类 。 因 此 , 抽 象类不能被实例化。final ( 最 终 的 ) : 带 有 final 修 饰 符 的 类 称 为 最 终 类 。 不 能 通 过 扩 展 最终类来创建新类。也就是说,它不能被继承,或者说它不能派生子类。2. 说明一个类的父类extends 关键字用来告知编译器创建的类是从父类继承来的子类,父类必需是Java系统的预定义类或用户已经定义好的类。一个类只能有一个父类,但一个父类可以有多个子类。3. 说明一个类所实现的接口implements 关键字用来告知编译器类实现的接口,一个类可以实现多个接口,多个接口之间用逗号分隔,其形式为:implements interface1,interface2,。使用接口的主要目的是为了使程序的功能描述和功能的详细实现相分别,从而使程序结构更清晰。4. 类体类体是类功能实现的主体,是Java 语句的集合。类体中一般定义三类要素:成员变量和常量、构造方法和方法。其中,成员变量和常量用来刻画对象的状态,方法用来描述对象的行为,而构造方法一般用来初始化成员变量。1. 拜望把握修饰符使用拜望把握修饰符可以限制拜望成员变量或常量的权限。拜望把握修饰符有4 个等级:private、 protected、public 以及默认(即不指定修饰符)。二、成员变量与常量成员变量或常量声明必需放在类体中,其一般形式为: 拜望把握修饰符 static< 数据类型 > 变量名。类型所属类同一个包中的其他类privateprotectedpublic默认同一个包中的不行拜望可拜望可拜望可拜望 拜望把握修饰符 staticfinal<数据类型 > 常量名。可拜望可拜望可拜望可拜望不行拜望可拜望可拜望可拜望可编辑资料 - - - 欢迎下载精品名师归纳总结子类不同包中的子类不同包中的非子类不行拜望 可拜望 可拜望不行拜望不行拜望 不 可 访可拜望不行拜望问可编辑资料 - - - 欢迎下载精品名师归纳总结2. static 变量(类变量或静态变量)Java 中包括两种类型的成员变量:实例成员变量和类成员变量,简称实例变量和类变量。假如用 static 关键字修饰成员变量,就该变量是一个类变量(又称静态变量)。不加static修饰的成员变量称为实例变量。package Chapter3 class ConcentCirclepublic static int x=100,y=100 。 /定义圆心坐标变量public int r 。/定义半径变量public static void mainString argsConcentCircle t1=new ConcentCircle 。 /创建对象ConcentCircle t2=new ConcentCircle 。t1.x+=100 。/设置圆心的横坐标t1.r=50 。/初始化半径变量t2.x+=200 。t2.r=150 。System.out.println"Circle1:x="+t1.x+",y="+t1.y+",r="+t1.r。System.out.println"Circle2:x="+t2.x+",y="+t2.y+",r="+t2.r。三、方法的声明与实现1. 方法定义的一般形式在 Java 中,方法在类体中定义。与类一样,方法的定义也包括两个部分:方法声明和方法体。方法声明的一般形式为: 拜望把握修 abstractstaticfinalnativesynchronized返回类型 方法名 参数列表 throws 反常类型 /方法体2. 方法的修饰符方法的修饰符分为拜望把握修饰符和非拜望把握修饰符。方法的拜望把握修饰符与成员变量的拜望把握修饰符的用法是一样的。(1) abstract 方法(抽象方法)带有 abstract 修饰的方法称为抽象方法,是指没有方法体的方法。不过,抽象方法只能显现在抽象类中。(2) static 方法(类方法或静态方法)方法与成员变量类似,也分为实例方法和类方法(又称静态方法)。带有static 修饰符的方法称为类方法,不加static 修饰的方法称为实例方法。可编辑资料 - - - 欢迎下载精品名师归纳总结实例方法是属于某个对象的方法,即每个对象的实例方法都有自己专用的内存空间。类方法是属于整个类的,它被该类的全部对象共享。类方法与实例方法请参考【例5】。(3) final 方法(最终方法)带有 final 修饰的方法称为最终方法。在面对对象程序设计中,子类可以掩盖父类的方法。但是,假如父类的某个方法被final 修饰,就其子类就不能掩盖这个方法,只能继承这个方法。因此,这样可以防止子类对父类的关键方法进行修改,保证了程序的安全性。(4) native 方法(本的方法)用其他语言编写的方法在Java 程序中称为本的( native)方法。由于native 方法的方法体是使用其他语言在程序外部编写的,所以native 方法没有方法体。(5) synchronized 方法(同步方法)同步方法用于多线程编程。多线程在运行时,可能会同时存取一个数据。为了防止数据的不一样性,可以将方法声明为同步方法,进而对数据加锁,以保证线程的安全。(6) throws 反常类型列表程序在运行时可能会发生反常现象。每一个反常都对应着一个反常类。假如期望方法忽视某种反常,可将其抛出,让它的“上级”(如调用它的对象等)来处理,从而使程序得以连续运行。3. 方法的返回类型一个方法必需声明其返回类型,方法的返回类型可以是Java 中的任意数据类型。当一个方法不需要返回数据时,返回类型必需是void(空)。假如一个方法具有返回值,就在方法体中使用return 语句把一个确定的值返回给调用该方法的语句。4. 方法的参数传递当编写一个方法时,一般会在方法名之后给出一个参数列表(称为方法的形参)来声明该方法所需要的参数类型和参数。参数列表由参数类型和参数名称组成,各参数之间用逗号分隔。在 Java 中,可传递的参数(称为方法的实参)可以是任何数据类型,包括基本数据类型、数组或对象,它必需与方法的形参完全对应。其中,传递基本类型的参数时,编译器会将 参数的值传递到方法中。在方法中修改传递过来的参数的值,并不会影响原参数的值。请 参考【例 6】与【例 7】。5. 重载方法Java 支持重载方法,即多个方法可以共享一个名字。但是,各方法之间必需在参数个数、次序或类型方面有所区分。public static String doubleItString data /参数类型为 String System.out.printlndata+data 。return data+data。public static int doubleItint data/ 参数类型为 int System.out.println2*data 。return 2*data 。6. 方法体中局部变量的特点在方法体中声明的变量称为局部变量,它只能在方法体内使用。另外,我们也可以利用 “ ”方式来声明代码块,从而限制局部变量的作用域(即变量可被使用的代码块范畴)。因此,局部变量的作用域开头于它的声明处,终止于当前代码块终止处。假如没有可编辑资料 - - - 欢迎下载精品名师归纳总结声明代码块,就其开头于声明处,终止于方法体终止处。void funcint z。 /局部变量 z 作用域开头于它的声明处/ 程序代码块,声明变量作用域仅限于当前代码块int x=75 。/x 的作用域到此终止int y=23 。/局部变量 y 的作用域开头于此处z=x+y 。/非法,由于当前位置x 变量已经消亡/局部变量 y 和 z 的作用域到此终止。7在方法体中使用this 关键字this 用来表示当前类,它主要有以下几种用法:当 成 员 变 量 的 名 字 和 局 部 变 量 的 名 字 相 同 时 , 如 果 要 在 方 法 中 访 问成员变量,可以使用this 关键字。在方法体中,通过this 关键字可拜望当前类的成员变量和方法。帮忙调用类的构造方法,特殊是当构造方法有多个时。class Point3D extends Point2D protected int x, y, z 。public Point3Dint x, int y / 第一个构造方法/ 调用类的另一个构造方法,调用该构造方法时,传来的实参x/和 y 被赐予成员变量 x 和 y,而成员变量z 被赐予了 0 thisx, y, 0 。public Point3Dint x, int y, int z / 其次个构造方法this.x = x 。this.y = y 。this.z = z。四、类的构造方法为了便于在基于类创建对象时向对象传递参数,以及对类的成员变量进行初始化。我们经 常会为类编写一个或多个特殊的方法构造方法。类的构造方法有如下几个特点:( 1)每个类都有一个默认的构造方法,它既无参数又无返回值,其作用是使用new 操作符创建新对象后初始化新建对象。( 2)一旦为类编写了构造方法,默认的构造方法将被掩盖。( 3)构造方法仅在使用new 操作符创建新对象时执行一次,而且一般不能用“对象名.方法名”形式来显式调用。( 4)编写构造方法的目的通常是为了向对象传递参数,以及对类的成员变量进行初始化 。( 5)构造方法同样支持方法重载。( 6)构造方法的名称必需与类名完全相同,并且不返回任何值。( 7)构造方法不能被static、final 、abstract、synchronized 和 native 等修饰符修饰,并且带参数的构造方法不能被子类继承。实例 3-1 运算斐波纳契数列【实例描述】可编辑资料 - - - 欢迎下载精品名师归纳总结意大利著名数学家斐波纳契曾经提出了“著名的兔子问题”:有一对兔子,从产生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子不死,问每个月的兔子总数为多少?答案是一组特殊特殊的数字,即 1、1、2、3、5、8、 13、21以上这些数字就是著名的“斐波纳契数列”。package Chapter3。public class Fibonacci public static long fib_1int n / 定义实现递归算法的方法long f1, f2 。if n = 0 | n = 1 / 假如 n=0 或 n=1 返回 n return n。可编辑资料 - - - 欢迎下载精品名师归纳总结 else f1 = fib_1n - 1 。f2 = fib_1n - 2 。return f1 + f2 。/ 否就返回 fib ( n-1)+fib (n-2)可编辑资料 - - - 欢迎下载精品名师归纳总结public static long fib_2int n / 定义实现循环算法的方法long f1 = 0, f2 = 1 。 long sum = 0 。if n = 0 | n = 1 return n。for int i = 1 。 i < n 。 i+ sum = f1 + f2 。f1 = f2 。f2 = sum 。 return sum。public static void mainString args System.out.println" 递归实现: "。for int i = 1 。 i < 11 。 i+ System.out.printfib_1i + ","。System.out.println"n循环实现: " 。for int i = 1 。 i < 11 。 i+ System.out.printfib_2i + ","。3.3 熟识对象的创建与使用方法一、对象的创建创建一个对象包括声明对象引用变量(即声明对象)和为对象支配内存空间(即创建对象)两个步骤。类是创建对象的模板,即利用一个已存在的类可以创建多个对象,被创建的对象称为类的实例对象,简称类的实例(或对象)。我们把创建实例对象的过程称为类的实例化。 1声明对象引用变量声明对象引用变量即为对象指定所属类及命名该对象引用变量名称。对象引用变量简称对象变量。声明对象的一般格式为:可编辑资料 - - - 欢迎下载精品名师归纳总结类名 对象名。2为声明的对象支配内存在 Java 中,使用 new 运算符和类的构造方法为声明的对象支配内存。new 称为操作符或运算符,它的任务是实例化对象,同时负责调用类的构造方法完成新对象的初始化任务。创建对象的语法格式如下:<对象名 >=new < 构造方法名 > 参数列表 。其中,参数列表是可选的,它取决于构造方法自身的情形。提示:对象声明和支配内存两个步骤也可以用一个等价的步骤完成,例如:PaintRectangle b2 = new PaintRectangle170, 40, 60, 60 。二、对象的使用创建对象后,一般可通过如下格式来拜望对象的变量和调用对象的方法:<对象名 >.< 变量名 ><对象名 >.< 方法名 >三、 Java的垃圾回收机制对象的清除Java 平台答应创建任意个对象(当然会受到系统资源的限制),Java 虚拟机会自动判定创建的对象是否仍被引用,假如不再被引用,它会自动释放其占用的内存空间。这种定期检测不再使用的对象并自动释放内存空间的过程称为垃圾回收机制。Java 有一个垃圾回收器,它周期性扫描对象的内存区,并将没有被引用的对象作为垃圾收集起来,定期的释放不再被使用的内存空间。1垃圾回收器 2撤销方法 finalize在一个对象被垃圾回收器收集之前,垃圾回收器将给对象一个机会来调用自己的finalize方法,将对象从内存中清除。 实例 3-2 运算一元二次方程的根【实例描述】编写一个一元二次方程的求解程序,实现功能:当判别式大于等于0 时,输出两个实数根。当判别式小于0 时,输出两个虚数根。package Chapter3。public class YYECFC double x1, x2 。 private double a, b, c 。public YYECFCdouble a, double b, double c /带参数构造方法初始化成员变量this.a = a。this.b = b。this.c = c。可编辑资料 - - - 欢迎下载精品名师归纳总结* a 。的实根void real_rootdouble delt /运算方程实根的方法x1 = -b + Math.sqrtdelt / 2 * a。x2 = -b - Math.sqrtdelt / 2 System.out.println"delt>=0 ,方程的实根为 nx1=" + x1 。/ 输 出 方 程System.out.println"x2=" + x2。可编辑资料 - - - 欢迎下载精品名师归纳总结void imag_rootdouble delt /运算方程虚根的方法double real, imag 。real = -b / 2 * a 。imag = Math.sqrt-delt / 2 * a。可编辑资料 - - - 欢迎下载精品名师归纳总结System.out.println"delt<0 ,方程的虚根为 nx1=" + real + "+" + imag + "i"。System.out.println"x2=" + real + "-" + imag + "i"。void showRoot /依据判别式 delt 的值,选择调用的方法double delt = b * b - 4 * a * c。 if delt >= 0real_rootdelt 。elseimag_rootdelt 。public static void mainString args YYECFC y1, y2 。/声明对象y1 = new YYECFC1, 5, 10 。/使用带参数的构造方法创建对象y1.showRoot 。/调用对象方法y2 = new YYECFC1, 10, 9 。y2.showRoot 。3.4 明白包的创建与使用方法一、包的创建、声明与使用包( package)的组织方式同操作系统中文件夹的组织方式类似,是Java 语言中有效治理类的一个机制。包实际上就是一个存放.class 的文件夹,因此,创建包就是创建文件夹。在要放入包的程序中加入package 语句,并且该语句确定要作为程序的第一条语句(程序注释除外),也是唯独的一条语句,其作用是声明该程序位于某个包中,例如:package .chapter1 。假如我们不在程序中利用package 语句声明其所属包,就该程序属于无名包。由于无名包没出名字,因此,它将不能被其他程序引用。1. 在期望放入某个包的程序中声明其所属包2. 在期望使用外部包中类的程序中导入类假如某个程序要使用某个包中的类,应在该程序中加入import 语句,以便将外部类导入, 从而在程序中使用该类。import 语句有如下两种使用方法:( 1 ) import包 名 . 公共 类 名 ( 实 际 上 就 是 java 字 节 码 文 件 名 ) , 例 如 , import .chapter1.file1, 表 示 导 入 chapter1包 中 的 file1类 , file1为 类 文 件 名(file1.class )。这种导入方式被称为单类导入。( 2) import 包名 .* ,例如, import java.io.* ,表示依据程序需要导入当前程序中使用的java.io 包中的类(而不是包中的全部类)。因此,这种导入方式又称按需导入。3新建或修改 CLASSPATH 变量CLASSPATH类 似 于 DOS操 作 系 统 中 的PATH , 它 指 明 了 包 的 前 导 路 径 。例 如 , 如 果 我 们 在 程 序 中 使 用 了 import.chapter1.myjava 。 语 句 , 而CLASSPATH的 内 容 为 “ . 。 c:test 。 ” , 就 系 统 会 首 先 在 当 前 文 件 夹 内 查 找jinqiecomchapter1文件夹和 myjava.class 文件。假如无法找到,就会在c:test 文件夹内查找jinqiecomchapter1文件夹和myjava.class 文件。假如照旧无法找到,系统会提示程序错误。换句话说,真正的包路径实际上是CLASSPATH 变量值和 import 语句中指明的包路径的组可编辑资料 - - - 欢迎下载精品名师归纳总结合。 CLASSPATH 的设置方法与环境变量Path 类似。二、 Java的常用包( 1) java.lang 包:它是Java 的核心类库,包含运行Java 程序必不行少的系统类。( 2) java.util 包:它包括了Java 中的一些低级的有用工具,如处理时间的Date 类。( 3) java.awt 包:它是Java 语言用来构建图形用户界面GUl 的类库,它包括了许多界面元素和资源。( 4 ) java.awt.datatransfer包 : 它 提 供 了 处 理 数 据 传 输 的 工 具 类。( 5) java.awt.event 包:它是对JDK1.0 版本中原有的 Event 类的一个扩充,它使得程序可以用不同的方式来处理不同类型的大事。( 6) java.awt.image 包:它是用来处理和操纵来自于网上图片的Java 工具类库。( 7) java.io 包:它包含了实现Java程序与操作系统、用户界面以及其他Java 程序进行数据交换所使用的类。( 8) java.sql 包:它是实现 JDBCJava database connection的类库。( 9) java.applet 包:它用来实现运行于Internet 浏览器中 Java Applet 的工具类库。( 10) 包:它是 Java语言用来实现网络功能的类库。( 11) java.rmi 包、 java.rmi.registry 包和 java.rmi.server 包:它们用来实现(远程方法调用 功能。( 12) java.security 包、 java.security.acl 包和 java.security.interfaces 包:它们更完善的Java 程序安全性把握和治理。本章小结本章主要介绍了Java 面对对象程序设计的基本概念和基本方法,其中包括类的定义方法, 对象的创建和使用方法,包的创建和使用方法等。大家应着重把握如下一些内容:明白公共类和主类的概念。明白成员变量和成员方法各种拜望把握修饰符的意义。 明白成员变量和实例变量的区分。明白使用方法参数进行数据传递时传值和传的址的区分。 明白 this 关键字的意义和用法。明白构造方法的作用与创建和使用方法。 明白对象的创建与使用方法。明白包的创建、声明和使用方法。可编辑资料 - - - 欢迎下载