




已阅读5页,还剩161页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 第二章类与对象的基本概念 Java2实用教程 4 2 4 7 JAVA语言程序设计 2 目录 2 1面向对象的程序设计方法概述2 2类与对象2 3对象初始化和回收2 4应用举例2 6本章小节 3 2 1面向对象的程序设计方法概述 面向对象的程序设计与结构化程序设计方法相比 更符合人类认识现实世界的思维方式已成为程序设计的主流方向涉及的主要概念抽象封装继承多态 4 2 1面向对象的程序设计方法概述 面向对象的程序设计结构化程序设计结构化方法的本质是功能分解 从代表目标系统整体功能的单个处理着手 自顶向下不断把复杂的处理分解为子处理结构化方法是围绕实现处理功能的 过程 来构造系统用户的需求往往基于功能面向对象的方法学认为世界由各种对象 数据和对数据操作 组成 任何事物都是对象 是某个类的实例 复杂的对象可由较简单的对象的某种方式组成对象具有与现实世界的某种对应关系 正是利用这种关系对问题进行分解 与结构化程序设计方法相比 更符合人类认识现实世界的思维方式 5 对象现实世界中万物皆对象都具有各自的属性 对外界都呈现各自的行为程序中一切都是对象都具有标识 identity 属性和行为 方法 通过一个或多个变量来保存其状态通过方法 method 实现他的行为 2 1面向对象的程序设计方法概述 续 6 类将属性及行为相同或相似的对象归为一类类可以看成是对象的抽象 代表了此类对象所具有的共有属性和行为在面向对象的程序设计中 每一个对象都属于某个特定的类类是面向对象程序设计的基本单位 程序运行时由类生产对象 对象之间通过发送消息进行通信类的四大特点 抽象 封装 继承 多态 2 1面向对象的程序设计方法概述 续 7 2 1 1抽象 抽象忽略问题中与当前目标无关的方面 以便更充分地注意与当前目标有关的方面如 驾驶员更关心汽车的属性 行为 而汽车的内部构造则不用去关心计算机软件开发中所使用的抽象有过程抽象 将系统的功能划分为若干部分 按照 自顶向下方式逐步求精 强调功能完成的过程和步骤 隐藏具体实现数据抽象 将系统中需要处理的数据和对数据的操作结合在一起 抽象成不同数据类型 面向对象程序设计主要特点就是采用了数据抽象的方法来构建程序的类及对象 classXiyoujiRenwu floatheight weight Stringhead ear hand foot mouth voidspeak Strings System out println s publicclassClock inthour minute second publicvoidsetTime intnewH intnewM intnewS hour newH minute newM second newS publicshowTime System out print hour minute second 8 例 钟表数据 属性 intHour intMinute intSecond 方法 行为 SetTime ShowTime 2 1 1抽象 续 9 例 人数据 属性 char name char gender intage intid 方法 行为 生物行为Eat Step 社会行为Work Study 2 1 1抽象 续 10 2 1 2封装 封装是一种信息隐蔽技术 与数据抽象密切相关利用抽象数据类型将数据和基于数据的操作封装在一起用户只能看到对象的封装界面信息 对象的内部细节对用户是隐蔽的外界需要访问类里的数据需要通过接口进行封装的目的在于将对象的使用者和设计者分开 使用者不必知道行为实现的细节 只需使用设计者提供的消息来访问对象 11 封装的定义清楚的边界所有对象的内部信息被限定在某个边界内接口对象向外界提供的方法 外界可以通过这些方法与对象进行交互受保护的内部实现功能的实现细节不能从类外访问 2 1 2封装 续 12 封装的意义在面向对象的程序设计中 类封装了数据及对数据的操作 是程序中的最小模块禁止了外界直接操作类中的数据 模块与模块之间只能通过严格控制的接口进行交互 这使得模块之间的偶合度大大降低 保证了模块具有较好的独立性防止程序员接触不该接触的内容 设计思想允许设计人员对库内部结构进行修改 而不会对用户程序造成影响程序维护和修改较为容易 2 1 2封装 续 13 2 1 3继承 继承是指新的类可以获得已有类 称为超类 基类或父类 的属性和行为 称新类为已有类的派生类 也称为子类 体现了面向对象设计方法的共享机制在继承过程中派生类继承了基类的特性 包括方法和实例变量派生类也可修改继承的方法或增加新的方法 使之更适合特殊的需要有助于解决软件的可重用性问题 使程序结构清晰 降低了编码和维护的工作量 14 单继承任何一个派生类都只有单一的直接父类类层次结构为树状结构多继承一个类可以有一个以上的直接父类类层次结构为网状结构 设计及实现比较复杂Java语言仅支持单继承 2 1 3继承 续 15 2 1 4多态 多态相同的操作可作用于多种类型的对象上 并获得不同的结果操作名的多态 即多个操作具有相同的名字 但接收消息的类型不同 如 对字符和数值型数据的排序 不同形状面积的计算 与继承有关的多态 同一操作被不同对象调用时可能产生不同的行为 如 drive car motorcycle 很好地解决了应用程序方法同名问题 具有行为共享 代码共享的优势 17 2 2类 类与对象在程序中 对象是通过一种抽象数据类型来描述的 这种抽象数据类型称为类 Class 一个类是对一类对象的描述 封装了一类对象的状态和方法 类是组成Java程序的基本要素 是用来定义对象的模板 对象是类的具体实例 如 篮球是球类的一个实例 计科学生是学生的一个实例总结 类向用户提供的是一种服务 18 对象是类的具体实例 是类的属性和功能的封装体对象 数据 作用于数据的操作对象有两个层次的含义现实世界中对象是客观世界的实体程序设计中对象是一组变量和相关方法的集合 其中变量表示对象的特征 方法表示对象的行为 19 2 2 1类声明 类的实现包括两部分 类声明和类体 classPeople classPeople 叫做类声明 People 是类名 习惯上类名的第一个字母大写 但这不是必须的 20 2 2 2 类体 写类的目的是为了描述一类事物共有的属性和功能 描述过程由类体来实现 类声明之后的一对大括号 以及它们之间的内容称做类体 大括号之间的内容称做类体的内容 类体的内容由两部分构 一部分是变量的定义 用来刻画属性 另一部分是方法的定义 用来刻画功能 21 classLander floatupper lower hight laderArea 变量定义部分floatCompArea 方法定义 laderArea upper lower hight 2 0 returnladerArea voidModifyHight floath 方法定义 hight h 22 2 3对象 类是创建对象的模板 当使用一个类创建了一个对象时 我们给出了这个类的一个实例 类 对象或实例 属性和行为 23 2 3 1 创建对象 创建一个对象包括对象的声明和为对象分配内存两个步骤 1 对象的声明 一般格式为 类的名字对象名字 如 PeoplezhangSang 24 2 为声明的对象分配内存使用new运算符和类的构造方法为声明的对象分配内存 如果类中没有构造方法 系统会调用默认的构造方法 默认的构造方法是无参数的 构造方法的名字必须和类名相同 如 zhangSang newPeople 25 classXiyoujiRenwu 类XiyoujiRenwu 蓝图 floatheight weight Stringhead ear hand foot mouth 属性voidspeak Strings 方法System out println s classA 测试类中创造实例对象 publicstaticvoidmain Stringargs XiyoujiRenwuzhubajie 声明对象zhubajie newXiyoujiRenwu 为对象分配内存 使用new运算符和默认的构造方法 26 声明对象时的内存模型 当用XiyoujiRenwu类声明一个变量 即对象zhubajie时 如例子1中的对象zhubajie XiyoujiRenwuzhubajie 内存模型如左图所示 此时的对象称为空对象 27 对象分配内存后的内存模型 当系统见到 zhubajie newXiyoujiRenwu 时 就会做两件事 为height weight head ear mouth hand foot各个变量分配内存 即XiyoujiRenwu类的成员变量被分配内存空间 然后执行构造方法中的语句 确定成员变量的初始值 new运算符在为变量height weight head ear mouth hand foot分配内存后 将返回一个引用给对象变量zhubajie 因此 这些被分配了内存的变量便由对象zhubajie进行管理 28 2 3 2 使用对象 对象不仅可以操作自己的变量改变状态 而且还拥有了使用创建它的那个类中的方法的能力 对象通过使用这些方法可以产生一定的行为 对象可以创建多个 通过使用运算符 对象可以实现对自己的变量访问和方法的调用 当对象调用方法时 方法中出现的成员变量就是指该对象的成员变量 29 classPeople intheight Stringear Stringeye voidspeak Strings System out println s classA publicstaticvoidmain Stringargs Peoplezhubajie zhubajie newPeople zhubajie height 170 zhubajie ear 两只大耳朵 System out println 身高 zhubajie height System out println zhubajie ear zhubajie speak 师傅 咱们别去西天了 改去月宫吧 30 classB publicstaticvoidmain Stringargs Peoplezhoujielun zhoujielun newPeople zhoujielun height 175 zhoujielun eye 眼睛不太大 System out println 身高 zhoujielun height System out println zhoujielun eye zhoujielun speak 嗨 大家好 例子1 f workspace People例子2 f workspace Area 31 2 3 3 对象的引用和实体 当用类创建一个对象时 类中的成员变量被分配内存空间 这些内存空间称做该对象的实体 而对象中存放着引用 以确保实体由该对象操作使用 如前图所示 一个类创建的两个对象 如果具有相同的引用 那么就具有完全相同的实体 PeopleA newPeople 170 黑色 PeopleB newPeople 175 棕色 A B 32 没有实体的对象称作空对象 空对象不能使用 即不能让一个空对象去调用方法产生行为 内存回收技术Java的垃圾收集器自动扫描对象的动态内存区 对不使用的做上标记以进行垃圾回收垃圾回收器作为一个线程运行 当系统内存耗尽或程序调用System gc 进行垃圾收集时 线程与系统同步运行Java的每一个类都有一个finalize 方法用于释放资源 33 2 3 4 参数传值基本数据类型参数的传值 对于基本数据类型的参数 向该参数传递的值的级别不可以高于该参数的级别 比如 不可以向int型参数传递一个float值 但可以向double型参数传递一个float值 在Java中 方法的所有参数都是 传值 的 也就是说 方法中参数变量的值是调用者指定的值的拷贝 例如 如果向方法的int型参数x传递一个int值 那么参数x得到的值是传递值的拷贝 方法如果改变参数的值 不会影响向参数 传值 的变量的值 参见1 5 4passArray java 34 引用类型参数的传值 Java的引用型数据包括对象 数组和接口 当参数是引用类型时 传值 传递的是变量的引用 如果改变参数变量所引用的实体 就会导致原变量的实体发生同样的变化 但是 改变参数的引用不会影响向其传值的变量的引用 35 总结基本数据类型参数传值不会修改原参数值引用类型参数传值 对象 数组 接口 会修改原参数值例子 f workspace Example4 5 36 publicclassPeople intmoney voidsetMoney intn money n publicclassComp voidf doubley Peoplep y y 1 p setMoney 100 System out println 参数y的值是 y System out println 参数对象p的money是 p money 37 publicclassExample4 5 publicstaticvoidmain String args doubley 0 8 Peoplezhang newPeople zhang setMoney 8888 System out println 在方法f被调用之前对象zhang的 money是 zhang money y的值是 y Compa newComp a f y zhang System out println 在方法f被调用之后main方法中y的值是 y 传值System out println 在方法f被调用之后main方法中对象zhang的 money是 zhang money 传引用 在方法f被调用之前对象zhang的money是 8888y的值是 0 8参数y的值是 1 8参数对象p的money是 100在方法f被调用之后main方法中y的值是 0 8在方法f被调用之后main方法中对象zhang的money是 100 例 例 38 2 2 3数据成员 数据成员表示Java类的状态声明数据成员必须给出变量名及其所属的类型 同时还可以指定其他特性在一个类中成员变量名是唯一的数据成员的类型可以是Java中任意的数据类型 简单类型 类 接口 数组 分为实例变量 实例成员变量 和类变量 静态变量 类与对象 39 声明格式 public protected private static final transient volatile 变量数据类型变量名1 变量初值 变量名2 变量初值 格式说明public protected private为访问控制符static指明这是一个静态成员变量final指明变量的值不能被修改transient指明变量是临时状态volatile指明变量是一个共享变量 2 2 3数据成员 续 类与对象 40 1 成员变量和局部变量 类体分为两部分 变量定义部分所定义的变量被称为类的成员变量 在方法体中定义的变量和方法的参数被称为局部变量 classPeople intboy floata voidf intgirl 成员变量与局部变量的区别成员变量在整个类内都有效 局部变量只在定义它的方法内有效 41 如果局部变量的名字与成员变量的名字相同 则成员变量被隐藏 即这个成员变量在这个方法内暂时失效 classA intx 9 y y x voidf intx 3 y x 42 如果局部变量的名字与成员变量的名字相同 则成员变量被隐藏 这时如果想在该方法内使用成员变量 必须使用关键字this classA intx 9 y y xvoidf inty 3 y this x 43 成员变量又分为实例成员变量 简称实例变量 和类变量 也称静态变量 如果成员变量的类型前面加上关键字static 这样的成员变量称做是类变量或静态变量 classPeople floatx instancemembervariablestaticinty classvariable 44 2 实例变量与类变量的区别 Java执行时 类的字节码被加载到内存 如果该类未创建对象 实例变量则不会被分配内存 但类中的类变量被加载到内存时 就已经被分配相应内存空间 不同对象的实例变量分配不同的内存空间所有对象的类变量分配相同的内存空间改变其中一个对象的这个类变量将会影响其它对象的这个类变量 即对象共享类变量什么变量可声明为类变量 类中所有对象都具有相同的属性 可声明为类变量例子 StaticTest java 问题 A1 x 18则A2 x 45 类变量是和该类创建的所有对象相关联的变量 改变其中一个对象的这个类变量就同时改变了其它对象的这个类变量 因此 类变量不仅可以通过某个对象访问也可以直接通过类名访问 实例变量仅仅是和相应的对象关联的变量 也就是说 不同对象的实例变量互不相同 即分配不同的内存空间 改变其中一个对象的实例变量不会影响其它对象的这个实例变量 实例变量可以通过对象访问 不能使用类名访问 当类中的类变量被加载到内存时 就被分配了相应的入口地址 即使没有创建对象也可以通过类名来进行访问 46 实例变量和类变量都可被声明为finalfinal实例变量必须在每个构造方法结束之前赋初值 以保证使用之前会被初始化 一旦初始化便不可改变不可改变的意思 对基本类型来说是其值不可变 而对于对象变量来说其引用不可再变 其初始化可以在两个地方 一是在final变量定义时直接给其赋值 二是在构造方法中 这两个地方只能选其一 4 数据成员 续 final修饰符 类与对象 47 2 2 4方法成员 方法成员定义类的行为一个对象能够做的事情我们能够从一个对象取得的信息可以没有 也可以有多个 一旦在类中声明了方法 它就成为了类声明的一部分分为实例方法和类方法 类与对象 48 声明格式 public protected private static final abstract native synchronized 返回类型方法名 参数列表 throwsexceptionList 方法体 2 2 4方法成员 续 声明格式 类与对象 49 格式说明方法修饰public protected private为存取控制符static指明方法是一个类方法final指明方法是一个终结方法abstract指明方法是一个抽象方法native用来集成java代码和其它语言的代码synchronized用来控制多个并发线程对共享数据的访问 2 2 4方法成员 续 格式说明 类与对象 50 格式说明 续 返回类型方法返回值的类型 可以是任意的Java数据类型当不需要返回值时 返回类型为void参数类型简单数据类型 引用类型 数组 类或接口 可以有多个参数 也可以没有参数 方法声明时的参数称为形式参数方法体方法的实现包括局部变量的声明以及所有合法的Java指令局部变量的作用域只在该方法内部throwsexceptionList用来处理异常 2 2 4方法成员 续 格式说明 类与对象 51 方法调用给对象发消息意味着调用对象的某个方法从对象中取得信息修改对象的状态或进行某种操作进行计算及取得结果等调用格式 参数列表 称点操作符 前面的为消息的接收者 receiver 参数传递值传递 参数类型为基本数据类型时引用传递 参数类型为对象类型或数组时 2 2 4方法成员 续 方法调用 类与对象 52 实例方法表示特定对象的行为声明时前面不加static修饰符使用时需要发送给一个类实例 2 2 4方法成员 续 实例方法 类与对象 53 在Circle类中声明计算周长的方法publicclassCircle staticdoublePI 3 14159265 intradius publicdoublecircumference return2 PI radius 由于radius是实例变量 在程序运行时 Java会自动取其接收者对象的属性值 2 2 4方法成员 续 例2 6 类与对象 54 方法调用测试publicclassCircumferenceTester publicstaticvoidmain Stringargs Circlec1 newCircle c1 radius 50 Circlec2 newCircle c2 radius 10 doublecircum1 c1 circumference doublecircum2 c2 circumference System out println Circle1hascircumference circum1 System out println Circle2hascircumference circum2 2 2 4方法成员 续 例2 6 类与对象 55 运行结果Circle1hascircumference314 159265Circle2hascircumference62 831853说明在使用实例方法时 需要将其发送给一个实例对象 也称给对象发送一条消息 radius的值即是接收者对象的值在执行c1 circumference 时 radius的值为c1的radius属性值 在执行c2 circumference 时 radius的值为c2的radius属性值 类与对象 2 2 4方法成员 续 例2 6运行结果 56 在Circle类及Rectangle类中声明计算面积的方法area 2 2 4方法成员 续 例2 7 publicclassCircle staticdoublePI 3 14159265 intradius publicdoublecircumference return2 PI radius publicdoublearea returnPI radius radius publicclassRectangle doublewidth doubleheight publicdoublearea returnwidth height 类与对象 57 声明测试类 对Circle类及Rectangle类的area 方法进行测试publicclassAreaTester publicstaticvoidmain Stringargs Circlec newCircle c radius 50 Rectangler newRectangle r width 20 r height 30 System out println Circlehasarea c area System out println Rectanglehasarea r area 类与对象 2 2 4方法成员 续 例2 7 58 运行结果Circlehasarea7853 981625Rectanglehasarea600 0说明不同的类中可以声明相同方法名的方法使用时 系统会根据接收者对象的类型找到相应类的方法 2 2 4方法成员 续 例2 7运行结果 类与对象 59 带参数的方法举例 在Circle类中增加方法改变圆的半径publicclassCircle staticdoublePI 3 14159265 intradius publicdoublecircumference return2 PI radius publicdoublearea returnPI radius radius publicvoidenlarge intfactor radius radius factor 2 2 4方法成员 续 例2 8 类与对象 60 测试类publicclassEnlargeTester publicstaticvoidmain Stringargs Circlec1 newCircle c1 radius 50 Circlec2 newCircle c2 radius 10 System out println Circle1的周长 c1 circumference System out println Circle2的周长 c2 circumference c2 enlarge 4 System out println Circle2扩大后的周长 c2 circumference 2 2 4方法成员 续 例2 8 类与对象 61 运行结果Circle1的周长 314 159265Circle2的周长 62 831853Circle2扩大后的周长 251 327412 2 2 4方法成员 续 例2 8运行结果 类与对象 62 以对象作为参数的方法举例 在Circle类中增加fitsInside方法判断一个圆是否在一个长方形内 需要以Rectangle类的对象作为参数publicclassCircle staticdoublePI 3 14159265 intradius publicdoublecircumference return2 PI radius publicvoidenlarge intfactor radius radius factor publicbooleanfitsInside Rectangler return 2 radius r width 2 2 4方法成员 续 例2 9 类与对象 publicclassRectangle doublewidth doubleheight publicdoublearea returnwidth height 63 测试类publicclassInsideTester publicstaticvoidmain Stringargs Circlec1 newCircle c1 radius 8 Circlec2 newCircle c2 radius 15 Rectangler newRectangle r width 20 r height 30 System out println Circle1fitsinsideRectangle c1 fitsInside r System out println Circle2fitsinsideRectangle c2 fitsInside r 2 2 4方法成员 续 例2 9 类与对象 64 运行结果Circle1fitsinsideRectangle trueCircle2fitsinsideRectangle false 2 2 4方法成员 续 例2 9运行结果 类与对象 65 类方法也称为静态方法 表示类中对象的共有行为 不依赖于具体的实例和子类声明时前面需加static修饰符类方法可以在不建立对象的情况下用类名直接调用 也可用类实例调用 2 2 4方法成员 续 类方法 类与对象 问题 1 静态方法能不能被声明为抽象方法 为什么 即 staticabstractvoidmethod 一个静态方法不能被定义为抽象方法 方法必须提供实现 66 将摄氏温度 centigrade 转换成华氏温度 fahrenheit 转换公式为fahrenheit centigrade 9 5 32除了摄氏温度值及公式中需要的常量值 此功能不依赖于具体的类实例的属性值 因此可声明为类方法转换方法centigradeToFahrenheit放在类Converter中publicclassConverter publicstaticintcentigradeToFahrenheit intcent return cent 9 5 32 方法调用Converter centigradeToFahrenheit 40 2 2 4方法成员 续 例2 10 类与对象 67 实例方法和类方法的区别 在形式上类方法多一个static 在用法上 不必创建对象就可直接调用类方法 而实例方法却一定要先创建对象 再通过对象调用 当字节码被加载到内存时 类的实例方法未被分配入口地址 当该类创建对象后 类中的实例方法才被分配入口地址 类方法不仅可以通过某个对象调用也可以直接通过类名访问 68 值得注意的问题对成员变量的操作只能放在方法中 方法可以对成员变量和方法中自己定义的局部变量同时赋予初值实例方法既可以操作实例变量也可以操作类变量 而类方法只能对类变量进行操作 不能操作实例变量 为什么 一个类中的方法可以相互调用 实例方法可以调用该类中的其它方法 类中的类方法只能调用该类的方法 不能调用实例方法 类创建对象之前 实例方法没有分配入口地址 classA inta 12 classA inta voidf intx x 34 a 12 x classA floata voidsetA floatx floaty a get x y staticfloatget floatx floatty floatc max x y returnc staticfloatmax floatx floaty returnx y x y staticfloatmin floatx floaty floatd setA x y returnd 69 包 package 是一组类的集合一个包可以包含若干个类文件 还可包含若干个包包的作用将相关的源代码文件组织在一起类名的空间管理 利用包来划分名字空间 便可以避免类名冲突提供包一级的封装及存取权限 2 2 5类的组织 包的概念 70 包的命名每个包的名称必须是 独一无二 的Java中包名使用小写字母表示命名方式建议将机构的Internet域名反序 作为包名的前导 71 编译单元与类空间一个Java源代码文件称为一个编译单元 由三部分组成所属包的声明 省略 则属于默认包 Import 引入 包的声明 用于导入外部的类类和接口的声明一个编译单元中只能有一个public类 该类名与文件名相同 编译单元中的其他类往往是public类的辅助类 经过编译 每个类都会产一个class文件利用包来划分名字空间 便可以避免类名冲突 classXiyoujiRenwu floatheight weight Stringhead ear hand foot mouth voidspeak Strings System out print s classA publicstaticvoidmain Stringargs XiyoujiRenwuzhubajie zhubajie newXiyoujiRenwu classPoint intx y Point inta intb x a y b PublicclassA publicstaticvoidmain Stringargs Pointp1 p2 p1 newPoint 10 10 p2 newPoint 23 35 73 包与目录Java使用文件系统来存储包和类包名就是文件夹名 即目录名目录名并不一定是包名 74 包的声明 package语句作为Java源文件的第一条语句 指明该源文件定义的类所在的包 命名的包 NamedPackages 例如 packagemypackage 如果源程序中省略了package语句 源文件中定义命名的类被隐含地认为是无名包的一部分 即源文件中定义命名的类在同一个包中 但该包没有名字 包名可以是一个合法的标识符 也可以是若干个标识符加 分割而成 75 语法 spack PrimNumber javaspack PrimNumbet java将类打包packagepackage name 76 引入包为了使用其它包中所提供的类 需要使用import语句引入所需要的类Java编译器为所有程序自动引入包java langimport语句的格式importpackage1 package2 classname 其中package1 package2 表明包的层次 它对应于文件目录classname则指明所要引入的类名如果要引入一个包中的所有类 则可以使用星号 来代替类名 77 importsPack publicclasscallPrimNumber publicstaticvoidmain Stringargs PrimNumberp newPrimNumber p getPrimnumber 5 注 callPrimNumber通过importsPack包调用PrimNumber类 packagesPack publicclassPrimNumber publicvoidgetPrimnumber intn intsum 0 i j for i 1 ii 2 System out println Number i 注 该类单独放于sPack包中 78 Eclipse中包的创建与使用 79 80 包创建好后 在该包中创建class类例子 workspace basic sPack PrimNumber javaworkspace basic callPrimNumber java 81 Java包 Total130packages8packagesforAPIjava applet forcreatingapplet interactionofappletswiththebrowserjava awt forcreatingGUIjava awt event handleeventforGUIcomponents 82 java io enableprogramtoinputandoutputjava lang basiclanguage enableprogramtocommunicateviainternetjava text manipulatenumbers dates characters andstringjava util containsutilityclasses basicdatatype andinterface 83 2 2 6类的访问控制 Java2实用教程4 2 4 7 类创建了一个对象之后 该对象可以通过 运算符操作自己的变量 使用类中的方法 但对象操作自己的变量和使用类中的方法是有一定限制的 所谓访问权限是指对象是否可以通过 运算符操作自己的变量或通过 运算符使用类中的方法 访问限制修饰符有private protected和public 都是Java的关键字 用来修饰成员变量或方法 84 类的访问控制类的访问控制只有public 公共类 及无修饰符 缺省类 两种访问权限符与访问能力之间的关系如表 1 类的访问控制 将sPack PrimNumber java中的public去掉 运行workspace basic callPrimNumber java 观察结果 85 类成员的访问控制共有 public 可以被其他任何对象访问 前提是对类成员所在的类有访问权限 私有 private 只能被这个类本身访问 在类外不可见保护 protected 只可被同一类及其子类的实例对象访问默认 default 仅允许同一个包内的访问 又被称为 包 package 访问权限 2类成员的访问控制 86 3 私有变量和私有方法 private 一个类在另外一个类中创建一个对象后 该对象不能访问自己的私有变量和私有方法对于一个类的私有类变量 静态成员变量 那么在另外一个类中 也不能通过类名来操作这个私有类变量 总结1 私有方法 私有变量 以及私有类变量只能在本类中创建该类对象时才能访问 87 classExample4 14 privateintmoney Example4 14 money 2000 privateintgetMoney returnmoney publicstaticvoidmain Stringargs Example4 14exa newExample4 14 exa money 3000 intm exa getMoney System out println money m classExample4 14 privateintmoney Example4 14 money 2000 privateintgetMoney returnmoney publicclassTester publicstaticvoidmain Stringargs Example4 14exa newExample4 14 exa money 3000 intm exa getMoney System out println money m 非法 非法 88 4 公有变量和公有方法 public 一个类在另外一个类中创建一个对象后 该对象能访问自己的public变量和public方法对于一个类的public类变量 静态成员变量 那么在另外一个类中 也能通过类名来操作这个public类变量 总结2 public变量 方法和类变量可以通过对象进行访问 89 classTom publicfloatweight publicfloatf floata floatb classJerry voidg Tomcat newTom cat weight 23f cat f 3 4 90 5 受保护的成员变量和方法 protected 一个类在另外一个类中创建一个对象后 如果两个类在同一包中 该对象能访问自己的protected变量和protected方法对于一个类的protected类变量 静态成员变量 如果两个类在同一包中 那么在另外一个类中 也能通过类名来操作这个protected类变量和类方法如果子类 父类不在同一包中 子类可以访问父类的protectedb变量和方法 总结3 protected变量或方法 能被同一包中的对象访问 子类可以访问不在同一包中父类的protected变量和方法 91 6 友好变量和友好方法 不用private public protected修饰符的成员变量和方法被称为友好变量和友好方法 一个类在另外一个类中创建一个对象后 如果两个类在同一包中 该对象能访问自己的友好变量和友好方法对于一个类的友好类变量 静态成员变量 如果两个类在同一包中 那么在另外一个类中 也能通过类名来操作这个友好类变量 总结4 在同一个包中的友好变量或方法能互访 92 classTom floatweight floatf floata floatb classJerry voidg Tomcat newTom cat weight 23f cat f 3 4 93 返回 类成员的访问控制总结 94 好的编程方法一般不允许其它类进行直接存取和修改一个对象的实例变量 通常会使用private修饰例 对例Circle类声明进行修改 给实例变量加上private修饰符publicclassCircle staticdoublePI 3 14159265 privateintradius publicdoublecircumference return2 PI radius 类成员的访问控制 续 例8 95 编译CircumferenceTester javapublicclassCircumferenceTester publicstaticvoidmain Stringargs Circlec1 newCircle c1 radius 50 Circlec2 newCircle c2 radius 10 doublecircum1 c1 circumference doublecircum2 c2 circumference System out println Circle1hascircumference circum1 System out println Circle2hascircumference circum2 类成员的访问控制 续 例8 96 编译时会提示出错在编译语句 c1 radius 50 及 c2 radius 10 时会提示存在语法错误 radiushasprivateaccessinCircle 说明由于在Circle类声明中变量radius被声明为private 因此在其它类中不能直接对radius进行存取 类成员的访问控制 续 例8编译 如果要允许其它类访问radius的值 该怎么办 需要在Circle类中声明相应的公有方法 通常有两类典型的方法用于访问属性值 publicget 和publicset 构造方法部分详讲 97 关键字this的使用如果形式参数名与实例变量名相同 则需要在实例变量名之前加this关键字 否则系统会将实例变量当成形式参数 在上面的set方法中 如果形式参数为radius 则需要在成员变量radius之前加上关键字this 代码如下 publicvoidsetRadius intradius this radius radius 2 2 6类成员的访问控制 续 类与对象 98 2 3 1构造方法 this关键字的使用 this是Java的一个关键字 表示某个对象如果局部变量的名字与成员变量的名字相同 则成员变量被隐藏 这时如果想在该方法内使用成员变量 必须使用关键字this A java this出现在构造方法中表示使用该构造方法所创建的对象 this出现在类的实例方法中时 表示引用当前正被操作的对象 this可以出现在实例方法和构造方法中 但不能出现在类方法中 为什么 例子 This SimpleTest java 类方法可以通过类名调用 不依赖于对象 而this本身表示对象 需要进行实例化 99 PublicclassCircle staticdoublePI 3 14159265 intradius publicdoublecircumference return2 PI radius PublicclassCircumferenceTester publicstaticvoidmain Stringargs Circlec1 newCircle cl radius 50 Circlec2 newCircle c2 radius 10 doublecircum1 c1 circumference doublecircum2 c2 circumference System out println Circle1 circum1 System out println Circle2 circum2 radius的值从何而来 return2 PI this radius this代表方法circumferenc 的调用对 象 其值则为调用对象的属性值 100 2 3 1构造方法 构造方法一种和类同名的特殊方法用来初始化对象 初始化对象是否可以有区别 Java中的每个类都有构造方法 用来初始化该类的一个新的对象没有定义构造方法的类 系统自动提供默认的构造方法 对象初始化和回收 101 构造方法的特点方法名与类名相同没有返回类型 修饰符void也不能有通常被声明为公有的 public 可以有任意多个参数主要作用是完成对象的初始化工作不能在程序中显式的调用在生成一个对象时 系统会自动调用该类的构造方法为新生成的对象初始化 2 3 1构造方法 续 对象初始化和回收 102 构造方法的创建当用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安全方面培训课件
- 吊顶音响工程方案(3篇)
- 电力拆除改造工程方案(3篇)
- 安全教育防火培训课件
- 灯塔冷库改造工程方案(3篇)
- 猫咪线描绘画课件
- 基于真实情境的初中语文学习任务设计探究
- 农业无人机租赁服务在2025年市场拓展与渠道建设分析
- 防汛工程治理方案范本(3篇)
- 工程爆破施工方案(3篇)
- 软件行业基础知识培训课件
- 教案2025秋形势与政策纪念抗战胜利坚定民族信念抗战胜利80周年
- 卷烟零售户培训课件
- 2025年学法减分试题及答案
- 2025年中小学教师师德师风考试题库及答案
- DGTJ08-2090-2020 绿色建筑评价标准
- 2025年商业店铺出租合同(标准版)(可修改可打印)
- 设备采购质保金管理制度
- 互助友爱班级大家庭主题班会课件
- 中国目前各行业的现状
- 小学生情绪调适心理课件
评论
0/150
提交评论