java教程-类与对象.ppt_第1页
java教程-类与对象.ppt_第2页
java教程-类与对象.ppt_第3页
java教程-类与对象.ppt_第4页
java教程-类与对象.ppt_第5页
已阅读5页,还剩100页未读 继续免费阅读

下载本文档

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

文档简介

4 类与对象 主讲 王华彬 知识点 变量作用域构造方法方法重载参数传递实例成员和类成员packageimport访问权限可变参数 Java技术及其应用 面向对象的三个特性 封装 继承和多态本章学习封装性 类的封装性体现在 把一类事物所具有的相同的属性和方法封装在一起 然后通过定义该类的一个对象 进而对该对象的属性赋值 调用类的方法 从而完成一定的功能 封装性 汽车类 CLASScar 属性 颜色 灰色 红色 黄色品牌 法拉利 现代 马自达类型 赛车 轿跑车 SUV方法 启动前进倒车熄火car罗院长的车 newcar 罗院长的车 carColor gray 罗院长的车 carBrand 现代 罗院长的车 carStart 罗院长的车 carStop 封装性 手机类 CLASSphone 属性 颜色 灰色 红色 黄色品牌 苹果 谷歌 三星类型 触屏 直板 翻盖方法 开机拨号挂断关机phone王玮的手机 newphone 王玮的手机 phoneColor gray 王玮的手机 phoneBrand 诺基亚 王玮的手机 phonePoweron 王玮的手机 phonePoweroff 类定义的一般要求 classRect doublewidth doubleheight doublegetArea doublearea width height returnarea 要求 类名是合法标示符 且容易理解定义一个类包括三步 取类名定义属性定义方法 类定义的一般要求 classcar intcarBrand charcarColor intcarKind 属性一般写在方法前习惯先定义属性 再定义方法 一行只定义一个属性 不提倡intcarBrand carKind 变量首字母小写 第2个单词开始字母大写intstartCar intforward intreversing intstopCar 方法函数 类的属性或称为成员变量 类的属性初始值 classRect doublewidth doubleheight doublegetArea doublearea width height returnarea Java技术及其应用 class类名 成员变量 成员方法 width 0 0 height 0 0 类成员变量可以不赋初值 默认0 false 局部变量需要赋初值 类的属性初始值 classRect doublewidth 1 doubleheight doublegetArea doublearea width height returnarea classtest publicstaticvoidmain Stringargs Rectr newRect System out println r width System out println r height 思考 程序的输出 Java技术及其应用 doublewidth width 1 变量作用域 classRect doublewidth doubleheight doublearea doublegetArea doublearea width height returnarea voidsetHeight doubleheight this height height Java技术及其应用 成员变量 方法体内局部变量 方法的参数变量 成员变量 即属性的有效区是整个类 方法中的局部变量的有效区是该方法 方法的参数的有效区在该方法中 当成员变量和方法的局部变量或方法的参数变量相同时 成员变量被隐藏 即 成员变量在方法中暂时失效 Java技术及其应用 this关键字 当成员变量被同名的局部变量或方法的参数变量隐藏时 即成员变量在方法中暂时失效 为了表示成员变量 可以用this 成员变量为指代this指向调用该成员方法的对象 Rectr newRect this可以理解是r的引用 变量作用域例题 classVariable intx 10 成员变量inty voidinit intx 5 y x System out println y 思考 程序输出 此时y x 5 变量作用域例题 classVariable intx 10 成员变量inty voidinit intx 5 y this x System out println y 此时y x 10 classVariable intx 0 y 0 z 0 成员变量voidinit intx inty this x x this y y intz 5 方法中的局部变量System out println x y z Variablev newVariable System out println v x v y v z v init 20 30 System out println v x v y v z 20 30 v x 20 v y 30 再来一个例题 publicclassA voidf intm 10 sum 0 if m 9 intz 10 z 2 m z for inti 0 i m i sum sum i m sum z i sum Java技术及其应用 编译错 错在哪儿 Z的有效区在if i的有效区在for 课后习题4 8 classB intx 100 y 200 publicvoidsetX intx x x publicvoidsetY inty this y y publicintgetXYSum returnx y Java技术及其应用 Bb newB b setX 100 成员变量b x b setY 200 成员变量b y System out println b getXYSum 成员变量x 100 成员变量y 200 X y 100 变量作用域知识点小结 类的成员方法中定义的局部变量或成员方法的参数变量都会隐藏掉同名的类的成员变量 这时可以使用this关键字来表示同名的类的成员变量this关键字指向调用该成员方法的对象 Java技术及其应用 已经介绍了类的属性 接下来是 类的方法或称为成员函数1 构造方法2 成员方法 构造方法 publicclassExample publicstaticvoidmain Stringargs Rectr1 newRect 创建对象r1 width 128 使用对象r1 height 69 doublearea r1 getArea System out println rectangle的面积 area Java技术及其应用 分配空间 并初始化对象 调用构造方法 构造方法 classRect doublewidth doubleheight doublegetArea doublearea width height returnarea Java技术及其应用 Rect 构造方法是一种特殊的方法构造方法名和类名相同无返回类型构造方法在new创建对象时被调用若无构造方法 按照默认的构造方法仅分配空间构造方法可以重载 Rectr1 newRect 构造方法 是一个函数和类同名对类的属性进行赋值可以重载 构造方法的重载 classRect doublewidth doubleheight Rect width 10 0 height 20 0 Rect doublex doubley width x height y doublegetArea 构造方法名相同 而参数的个数或类型不同 Rect 构造方法的调用 publicclassExample publicstaticvoidmain Stringargs Rectr1 newRect 创建对象doublearea1 r1 getArea Rectr2 newRect 1 2 创建对象doublearea2 r2 getArea Java技术及其应用 一个类可以定义多个构造方法 根据参数个数或类型不同 使用不同的构造方法 构造函数作用是 为对象分配内存空间 为对象的属性赋初始值 方法重载 MethodOverloading 多个方法可以享有相同的名字方法的参数必须不同或者是参数个数不同 或者是参数类型不同 完成的功能相似返回类型不能作为区分函数重载的标准 方法重载的好处 要打印不同类型的数据 int float String 不需要定义不同名的方法名 printInt int printFloat float printString String 利用方法重载 只需要定义一个方法名print 接收不同的参数 print int print float print String classMethodOverloading voidreceive inti System out println Receiveoneintdata System out println i i voidreceive intx inty System out println Receivetwointdatas System out println x x y y 方法重载例题 voidreceive doubled System out println Receiveonedoubledata System out println d d voidreceive Strings System out println Receiveastring System out println s s 方法重载例题 publicclassMethodOverloadingTest publicstaticvoidmain Stringargs MethodOverloadingmo newMethodOverloading mo receive 1 mo receive 2 3 mo receive 12 56 mo receive veryinteresting isn tit 方法重载例题 多态性 发送消息给某个对象 让该对象自行决定响应何种行为 书上例题4 11 见 Java文件 Java技术及其应用 练习 课后习题4 10 Java技术及其应用 小结 构造方法构造方法是一种特殊的方法方法名和类名相同无返回类型构造方法在new创建对象时被调用若无构造方法 按照默认的构造方法仅分配空间构造方法可以重载 即可以有多个构造方法 Java技术及其应用 类的方法 与c语言的函数定义基本相同 只不过在类中称为方法 在此不再赘述 需要注意的是 在方法体内 成员变量和局部变量的区别 其实可以把成员变量当做全局变量理解即可 小结 方法重载多个方法可以享有相同的名字方法的参数必须不同或者是参数个数不同 或者是参数类型不同 完成的功能相似返回类型不能作为区分函数重载的标准体现面向对象的多态性 Java技术及其应用 类变量和简单数据类型变量的区别 Circlec1 inti Java技术及其应用 只声明 未分配空间 c1 null 声明的同时分配空间 简单数据类型变量 inti i 1 intj j 2 j i Java技术及其应用 i j 1 2 1 i和j分别指向两块不同的内存区域 j I 把i中的内容复制到j中 类变量 Java技术及其应用 Circlec1 c1 newCircle Circlec2 c2 newCircle c2 c1 c1 c2 c1和c2指向同一块内存区域 c2 c1 c2相当于c1的引用 此时 c2原来的内存空间被释放 几条注意事项 1 不要定义没有实体的类的空对象 必需通过new 构造函数创建对象 2 对象的名字 可以认为是该对象对应内存区域的一个引用 即 一个别名 如果对象直接进行赋值 则原先的内存被释放 3 在java语言中 类只有构造方法 没有析构方法 只是因为java语言有垃圾回收机制 这也正是java程序一般很少有内存泄露的原因 已经介绍了类的属性和方法 包括 成员变量的作用域构造函数及重载对象创建的原理接下来 介绍一下方法的参数传递中的注意事项 成员方法参数 参数的类型 简单数据类型 传值 不改变参数的值 引用数据类型 数组类型 类或接口 传地址 可改变参数的值 classMethod voidreceive inti i 6 在main函数中 执行如下代码 思考输出 Methodm newMethod inta 5 m receive a System out println a 此时 a为全局变量 通过参数i传到receive方法中 i相当于a的复制品 i的改变不改变a的值 classMethod voidreceive inti i 6 在main函数中 执行如下代码 思考输出 Methodm newMethod floata 5 m receive a System out println a 参数传递的值的级别不能高于该参数值 可以低于该参数值 参数传递 当传递的参数是简单类型的时候 传值 方法调用结束后原值不变 当传递的参数是引用类型的时候 传地址 方法调用结束后原值会变 inta 5 voidreceive inti i 6 Java技术及其应用 5 5 6 a i i 如果参数是引用的话 当传递的参数是引用类型的时候 传地址 方法调用结束后原值会变 注意 对象名是一种引用 5 a i 6 i 6 再看一个综合性的例子 传值和传地址举例 publicclassPassTest floatptValue publicvoidchangeInt intvalue value 55 publicvoidchangeObjValue PassTestref ref ptValue 99f publicstaticvoidmain Stringargs intval PassTestpt newPassTest val 11 pt changeInt val val pt ptValue 101f pt changeObjValue pt pt ptValue 练习 Java技术及其应用 课堂练习 请同学们思考结果 并解释publicclassSwap voidswapp intx inty inttemp System out println x y temp x x y y temp System out println x y publicstaticvoidmain Stringargs intu 30 v 50 System out println u v Swaps newSwap s swapp u v System out println u v 练习 Java技术及其应用 publicclassSwap1 intx y voidswapp Swap1s inttemp System out println s x s y temp s x s x s y s y temp System out println s x s y intu 30 v 50 Swap1s newSwap1 s x u s y v System out println s x s y s swapp s System out println s x s y 参数传递小结 当传递的参数是简单类型的时候 传值 方法调用结束后原值不变 当传递的参数是引用类型的时候 传地址 方法调用结束后原值会变 Java技术及其应用 在之前的学习中 我们知道 类的属性和方法 必须先创建对象 然后通过对象调用 为什么输出函数可以直接调用呢 System out println 请同学们思考 System是什么 Out是什么 println 是什么 类成员和实例成员static关键字静态成员 静态成员变量和静态成员函数 static关键字 class类名 成员变量 成员方法 class类名 成员变量 成员方法 static static 实例成员 类成员或静态成员 类变量和实例变量 类的组成部分是 属性和方法 及成员变量和成员函数成员变量的类型分为两种 classrect intweight 实例变量staticintheight 类变量或静态变量 由static修饰的成员变量 称为类变量 1 一个类的不同对象 分别分配空间 一个对象的实例变量改变 不影响其他类 2 但是对于类变量 在字节码文件加载到内存时 如果没有创建对象 实例变量就不分配内存 而类变量分配了内存 思考 意味着什么 而且 所有的对象的类变量都共享同一个内存 即 如果一个对象的类变量改变 其他对象的类变量也同时改变 类成员和实例成员 类成员 属性或方法 用static修饰的成员 属于类 所有对象共享一个类成员 只有一个 实例成员 属性或方法 无static修饰的成员 属于对象 每个对象都有各自的一个 相互独立 类成员和实例成员 类成员用类名或对象名来调用 对类成员的修改影响整个类的所有对象的类成员 类成员方法只能对类成员变量进行操纵 实例成员用对象名来调用 对某对象实例成员的修改不会影响其他对象的实例成员 classStudent Stringname staticStringschool 北京大学 classt publicstaticvoidmain Stringargs System out println Student school 正确System out println Student name 错误Studentstu1 newStudent System out println stu1 school System out println stu1 name 对于类变量 可以在主函数中 不创建该类对象 而直接使用类名进行调用 也可以通过创建对象 通过对象进行调用 共享内存 实例成员和类成员举例 举例memberTest java 类memberTest 类变量a实例变量b 方法 对象a 对象b 对象n 类变量a实例变量b 函数 类变量a实例变量b 函数 类变量a实例变量b 函数 类变量a 方法 实例成员方法在生成第一个对象时被分配了入口地址 类成员方法在类被装载内存时被分配了入口地址 Student java publicclassStudent Stringname staticStringschool 北京大学 publicstaticvoidmain Stringargs Studentstu1 newStudent Studentstu2 newStudent Studentstu3 newStudent stu1 name 1 stu2 name 2 stu3 name 3 System out println stu1 name stu1 school System out println stu2 name stu2 school System out println stu3 name stu3 school stu2 school 安徽大学 System out println stu1 name stu1 school System out println stu2 name stu2 school System out println stu3 name stu3 school 思考程序的输出结果 Java技术及其应用 对于方法 也分为 类方法和实例方法classrect intstart 实例方法staticintstop 类方法 1 对于实例方法 只有创建对象后 通过对象调用 2 对于类方法 可以不创建对象直接通过类名调用 也可以创建对象 通过对象调用 3 实例方法可以调用实例变量和类变量 而类方法不能调用实例变量 思考为什么 因为 类方法在对象创建之前就可以使用 而此时实例变量还没有分配内存 classStudent Stringname staticStringschool 北京大学 voidstart1 System out println name System out println school staticvoidstart System out println name System out println school 练习 classStudent Stringname staticStringschool 北京大学 voidstart1 System out println name System out println school staticvoidstart System out println school classt publicstaticvoidmain Stringargs Student start 类方法 可由类名直接调用 Java技术及其应用 main 方法 思考 为什么main 方法用static修饰 publicclassStudent publicstaticvoidmain Stringargs java类名 main Student main 一个类的main方法必须用static修饰 因为Java运行时系统在开始执行一个程序前 并没有生成类的一个实例 它只能通过类名来调用main方法作为程序的入口 static关键字小结 用static修饰的类中的成员变量或成员方法 都称为类的成员 类没有用static修饰的 称为实例成员 对象类的成员唯一 而对象的成员有多个 每个相互独立 类的成员由类或对象来调用 实例成员由对象来调用类的成员在类有了之后就存在了 而实例成员必须在生成对象之后才存在 Java技术及其应用 思考 this关键字能否在类方法中调用 为什么 classRect staticdoublewidth staticdoubleheight doublearea 0 staticdoublegetArea doublearea width height returnthis area 思考2 在Java编程中 我们常常用System out println 方法来输出字符串 也许我们都已经猜到println 是方法名 但System是什么 out又是什么呢 其实System是java lang包里面的一个类而out就是System类里面的一个静态成员变量 其类型是java io PrintStream类 被关键字static修饰的数据成员或方法可以直接通过 类名 数据成员 或 类名 方法 来引用 而无须先建立对象 所以System out是应用了out这个静态数据成 而out又是一个java io PrintStream类的对象 所以out必然可以调用java io PrintStream类里面的方法 println 就是java io PrintStream类里的一个方法 它的作用就是用来想控制台输出信息的 classSystem staticjava io PrintStreamout System outclassPrintStream println System out println 包 package 由于Java编译器为每个类生成一个字节码文件 且文件名与类名相同 因此 同名的类有可能发生冲突 为了解决这一问题 Java提供包来管理类名空间 比如 同一文件夹下 不能有相同名称的文件 而不同文件夹下的文件名可以相同 c 我的音乐 国歌 MP3c 我的音乐 好听 国歌 MP3 包 package Ex1 javapublicclassEx1 classA packagep1 publicclassEx1 classA p1 A Ex2 javapublicclassEx2 classA packagep2 publicclassEx2 classA p2 A package语句 package语句作为Java源文件的第一条语句 指明该文件中定义的类所在的包 若缺省该语句 则指定为无名包 它的格式为 packagepkg1 pkg2 pkg3 Java编译器把包对应于文件系统的目录管理 package语句中 用 来指明目录的层次 package语句 packagep1 publicclassEx1 classA p1 Ap1 A class packagep2 publicclassEx2 classA p2 Ap2 A class package的实际含义是指 定义当前java文件所在的文件夹路径 以及生成字节码文件的路径 命令行下编译和运行带包的Java程序 若无package语句 类都放入缺省的无名包中 对应于当前文件夹 若有packagep1 packagep1 publicclassEx1 Ex1类放入p1包内 对应于文件目录 当前目录下创建p1文件夹 下放Ex1 java文件编译方式 javacp1 Ex1 java运行方式 javap1 Ex1 练习 packages1 s2 s3 s4 publicclassHello 如何存放Hello java文件 如何编译和运行 当前文件夹下创建s1 再创建s2 再创建s3 再创建s4 在s4里面放Hello java在当前文件夹下javacs1 s2 s3 s4 Hello java在当前文件夹下javas1 s2 s3 s4 Hello Java技术及其应用 JCreator处理带包的Java程序 packagep1 publicclassEx1 classA Jcreator不需把源文件放入p1中 自动在当前文件夹下创建子目录p1 并将生成的字节码文件Ex1 class和A class存入其中 Java技术及其应用 同一个包 即同一个文件夹下的类可以互相调用 如果属于不同包的类 怎么处理 import命令 import语句 为了能使用不在同一个包中的其他类 我们需要用import语句来引入所需要的类 importpackage1 package2 classname 例如 importjava awt importjava util Date Java编译器为所有程序自动引入包java lang 因此不必用import语句引入它所包含的所有类 import语句 importjava util Date java util Date class当前目录下没有java文件夹 包的根目录由classPath决定 classPath c Programfiles java jdk1 6 jre lib rt jar 思考 如何引入自定义包 Java技术及其应用 之前 我们做的所有实验 都没有定义包 如果一个源文件没有使用包语句 则得到的类没有包名 该类如果被使用 必须放在需使用工程的目录下 但是 如果有其他包中的类名和该无包类的类名相同 就可能产生混淆 比如 现有工程下有一个无名包中的类A 通过import又引入了一个类 tom A 则默认情况下 A类认为是tom A 正确的使用方法是 tom Aa newtom A tom A类Aa newA 无名包A类 import语句 importjava util Date classmyDate Datedate newDate ClassmyDate java util Datedate newjava util Date 小结 packagep1 即指明当前java文件的包路径 方面进行工程管理 Import 引入其他包中的类 如果引入自定义包中的类 需要在环境变量中设置CLASSPATH Import其他包中的类时 一般情况下 最好把类和包的全名都写上 即 importa b c 引入a b下的c类a b ctest newa b c 而不要写成ctest newc 小结 Java程序结构 packagep import import class class publicclass Java技术及其应用 0 1个 0 多个 0 多个 1个 访问权限 class类名 成员变量 成员方法 类名对象名 new类名 对象名 成员变量 Java技术及其应用 成员的访问权限 对类的成员施以一定的访问权限限定 实现类中成员在一定范围内的信息隐藏同一个类中同一个包中不同包中的子类不同包中的非子类private default protected public 成员的访问权限 private 同类 default 同类 同包 默认情况下都是default protected 同类 同包 子类 不一定要同包 处在不同包中的子类可以访问父类中限定为protected的成员 但这时访问这些成员的对象必须具有子类的类型或是子类的子类类型 而不能是父类类型 public 所有 private classTom privatefloatweight privatefloatf floata floatb returna b classJerry voidg Tomcat newTom cat weight 23f floatsum cat f 3 4 Java技术及其应用 public classTom publicfloatweight publicfloatf floata floatb returna b classJerry voidg Tomcat newTom cat weight 23f floatsum cat f 3 4 Java技术及其应用 default classTom floatweight floatf floata floatb returna b classJerry voidg Tomcat newTom cat weight 23f floatsum cat f 3 4 Java技术及其应用 protected classTom protectedfloatweight protectedfloatf floata floatb returna b classJerry voidg Tomcat newTom cat weight 23f floatsum cat f 3 4 Java技术及其应用 成员的访问权限 对类的成员施以一定的访问权限限定 实现类中成员在一定范围内的信息隐藏同一个类中同一个包中不同包中的子类不同包中的非子类private default protected public 练习 课后习题4 7 Java技术及其应用 访问权限一般做法 class类名 privatefolatheight privatefolatwidth publicvoidsetHeight floatheight this height height publicvoidsetWidth floatwidth this width width publicfloatgetHeight returnheight publicfloatgetWidth returnwidth public成员方法 Java技术及其应用 类的访问权限 pu

温馨提示

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

评论

0/150

提交评论