第3章+类与对象_第1页
第3章+类与对象_第2页
第3章+类与对象_第3页
第3章+类与对象_第4页
第3章+类与对象_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

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

文档简介

第3章类与对象,1,主要内容,3.1如何设计一个类3.2对象的创建与初始化3.3数据成员及方法3.4类的使用3.5基础类库,2,3.1如何设计一个类,类的定义格式如下:classclassname数据成员成员方法在类里,属性称为类的数据成员,方法称为类的成员方法。,3,现实生活中的钟表类具有一些特征:数据(属性)小时,分钟,秒方法(行为)显示时间;设置时间;,4,钟表类数据(属性)小时,分钟,秒方法(行为)显示时间;设置时间;,classClockinthour;intminute;intsecond;voidsetTime(inthh,intmm,intss)hour=hh;minute=mm;second=ss;voidshowTime()System.out.println(“currenttimeis:”+hour+”:”+minute+”:”+second);,5,数据成员,方法,Java程序中的钟表类定义为:classClockinthour;intminute;intsecond;voidsetTime(inthh,intmm,intss)hour=hh;minute=mm;second=ss;voidshowTime()System.out.println(“currenttimeis:”+hour+”:”+minute+”:”+second);,6,生成一个对象格式如下:classnameobjectname=newclassname();其作用是在内存里为对象分配内存空间。调用类的方法格式如下:对象名.方法名;,7,以下代码显示了创建对象,调用类的方法:/创建了一个对象mydogDogmydog=newDog();/创建了一个对象doudouDogdoudou=newDog();mydog.bark();/调用Dog的方法,8,9,/Dog.javaclassDogStringname;booleanisMale;Stringcolor;doubleweight;Stringbreed;intnumbbarks;voidbark()numbbarks+;System.out.println(Whatsup?+buddy);voidjump()System.out.println(Im+jumping!);publicstaticvoidmain(Stringargs)Dogmydog=newDog();mydog.bark();mydog.jump();,也可以把类的定义放在Dog.java里,对象的声明及main()方法放入DogDemo.java里,运行时,两个文件放在同一路径下。类的设计应遵循“单一责任原则”。,10,11,/Dog.java:类的定义classDogstringname;booleanisMale;Stringcolor;doubleweight;Stringbreed;intnumbbarks;voidbark()numbbarks+;System.out.println(“Whatsup?”+“buddy”);voidjump()System.out.println(“Im”+“jumping!”);,先写一个Dog.java来描述dog类的定义,再写一个包含对象的声明及main()方法的java文件DogDemo.java,12,/DogDemo.javapublicclassDogDemopublicstaticvoidmain(Stringargs)Dogmydog=newDog();mydog.bark();mydog.jump();,3.2对象的创建与初始化,DogmyDog=newDog();此语句创建了一个Dog对象myDog,然而,myDog的基本属性,名字,年龄,性别的具体值呢?这条语句没有体现出来。,构造方法(constructor),可用于对象的初始化,为每个属性指定初值。构造方法是一种以类名来命名的特殊方法,没有返回值,其定义格式如下:publicclassCLASSNAMECLASSNAME()CLASSNAME(ARGUMENTS),14,Dog类构造函数定义如下:,15,classDogStringname;booleanisMale;Stringcolor;doubleweight;Stringbreed;intnumbbarks;Dog(Stringdogname,booleanmaledog,Stringdogcolor,doubledogweight,Stringdogbreed,intdogbarks(/构造方法的定义name=dogname;/以参数dogname对name赋值isMale=maledog;/以参数maledog对isMale赋值color=dogcolor;/以参数dogcolor对color赋值weight=dogweight;/以参数dogweight对weight赋值breed=dogbreed;/以参数dogbreed对breed赋值numbbarks=dogbarks;/以参数dogbarks对numbbarks赋值,例3-1构造方法的特点:一种和类同名的特殊方法,可以有多个;用来完成对象的初始化工作;无返回类型,无修饰符void,通常被声明为公有的(public);,16,可以有任意多个参数;不能在程序中显式的调用,在生成一个对象时,系统会自动调用该类的构造方法;如果没有写构造方法,系统会自动提供一个默认构造方法CLASSNAME();但是如果有构造方法,系统就不会再提供默认构造方法。,17,3.3数据成员及方法,3.3.1访问数据成员及方法其格式如下:访问数据成员:对象.属性名访问方法:对象.方法名,18,3.3.2方法中参数传递的问题,参数的类型可以是基本数据类型,也可以是引用(类)类型。Java语言中,基本数据类型作为参数均采用传值(passingby-value)的方式完成。,19,引用类型变量作为参数传递时,采用的是引用传递(passing-by-reference)的方式,在方法体中对形参的改动将会影响到实参。例3-2,20,3.3.3toString()方法,Java可以把对象像基本数据类型一样,使用System.out.println直接输出到屏幕。,21,StringtoString(),StringtoString()是一个经常用到的方法,当需要把一个对象输出到屏幕,就要用到此方法。实际上,Java的所有类都有一个默认的toString(),22,例3-3System.out.println(ipad)语句就等价于System.out.println(ipad.toString()如果直接调用默认的toString(),返回结果形式为:对象类的名字对象的地址,23,例如编译后运行结果如下:Product19efb05重写toString()方法的实现部分,“覆盖”掉从Object继承来的toString(),将对象的内容转换为字符串。,24,声明toString时需要注意以下事项:toString()必须为public;返回类型为String;方法的名称必须为toString,且没有参数;在方法体中不要使用输出方法System.out.println();,25,3.4类的使用,Static:(静态)类数据和(静态)类方法Java类中有一种特殊的成员或方法,它不属于某个对象,不能通过某个对象来引用,在声明前加上static关键字。静态数据可直接通过类名访问。格式为:类名.staticVarible例3-4,26,静态数据可以被所有的对象共享,生命周期从创建开始到程序运行结束。,27,3.4.2static方法,类里可以定义一个static方法,该方法也属于类所有。与static数据的调用方法类似,使用类名调用static方法。static方法不属于类的某个对象,只能引用static变量或另外的static方法。非静态的方法可以调用静态的方法。反之则不可行。,28,static方法的应用,publicclassRectanglestaticintarea(inta,intb)returna*b;publicstaticvoidmain(Stringargs)intrectArea;rectArea=area(4,5);System.out.println(area=+rectArea);此例缺乏面向对象的特征。例3-5static方法的应用示例。,29,3.4.3final修饰符,final把相应的数据和方法设为常量,意味着一旦给定数值之后就不能再改变它们。finalstaticintmynumber=36;/定义一个final变量finalTimetoday=newTime(12,21,12);/定义一个final对象finalintdd=42;/定义一个final变量,30,final在类之前表示该类是最终类,不能再被继承。final在方法之前表示该方法是最终方法,该方法不能被任何派生的子类覆盖。final在变量之前表示变量的值在初始化之后就不能再改变;相当于定义了一个常量。,31,3.4.4方法重载,方法重载指多个方法可以享有相同的名字。这些方法的参数必须不同,或者是参数个数不同,或者是参数类型不同。,32,利用方法重载,只需要定义一个方法名:println(),接收不同的参数:println(int);println(float);println(String);例3-6,33,3.4.5this指针,每一个方法内都有一个特殊的指针,指向“调用该方法的当前对象”this关键字只能在方法内部使用,34,This指针的用法:代替对象,访问对象的数据。例3-7This指针的用法2:作为返回值使用,当需要返回一个对象时,就可以在return语句里使用this。例3-8This指针的用法3:调用构造方法。例3-9,35,3.4.6对象的回收,与C+不同,Java额外提供了垃圾回收器(garbagecollector)对于不再使用的内存资源,垃圾回收器能自动将其释放,无需使用delete无需再使用类似C+里的析构函数destructor。,36,Java运行时系统通过垃圾收集器周期性地释放无用对象所使用的内存。任何对象都可以在堆(Heap)中分配所需的存储区域,操作结束后释放掉这些空间,这些操作没有固定的顺序,因而容易导致内存产生很多碎片。导致内存泄露。,37,CLanguageMemoryAllocation,38,Dynamiclibraries,UnitializedData,Initializeddata,DATA,SEGMENT,Heap,Stack,grows,grows,TextSegment,char*p=malloc(1024);(inC+,Javanew),intiarray20;,intiarray2=1,2,3;,intmain().,intmyfunc(intx,floaty)intz;,堆(heap)是一种运行时的数据结构,是一个大的存储区域,用于支持动态的内存管理。Java里所有引用类型的对象都存储在堆里。栈(stack)也是一种运行时的数据结构,为方法(函数)调用和返回处理提供存储空间。,39,Java运行时系统会在对对象进行自动垃圾回收前,自动调用对象的finalize()方法。finalize()方法提供一个手动释放资源的机会,40,finalize()方法在类java.lang.Object中声明,因此Java中的每一个类都有该方法用于释放系统资源,如关闭打开的文件或socket等声明格式protectedvoidfinalize()throwsthrowable,41,3.4.7包,通俗来说“包”就是目录每一个类都属于一个包同一个包里的类可以相互调用不同包里的类调用时需要import,42,包的定义格式如下:packagepath.to.package.foo;classFoo.,43,包使用时,用import导入,导入语句必须放在文件首,格式如下:/importpackageimportpath.to.package.foo.Foo;importpath.to.package.foo.*;,44,包的使用,importpath.to.package.foo.Foo;Importpath.to.package.foo.*;,45,packageparenttools;publicclassBabyFoodpackageparenttools:publicclassBaby,46,packageadult;importparenttools.Baby;importparenttools.BabyFood;publicclassParentpublicstaticvoidmain(Stringargs)Babybaby=newBaby();baby.feed(newBabyFood();,47,Java2SE提供了一组打好的标准“包”,也就是相关类的集合,把它们一起放到一个组群中,形成一个程序库。Java程序包相当于其它语言中的库函数。(参看Javadoc),48,importjava.util.*这就把整个实用程序(utility)库都引入到程序中。J2SE里常用的程序库(包)有:java.lang,java.io,java.applet,java.awt,等,49,3.4.8类的访问控制,Java提供了访问权限修饰词,以供开发人员向客户端程序员指名哪些是可用的,哪些是不可用的。,50,访问权限控制的等级,从最大权限到最小权限依次为:publicprotected包访问权限(没有关键字)private.,51,公有(public):可以被其他任何对象访问(前提是对类成员所在的类有访问权限)保护(protected):只可被同一类及其子类的实例对象访问私有(private):只能被这个类本身访问,在类外不可见包访问权限:默认访问权限,仅允许同一个包内的访问,52,需要注意的是类的访问控制只有public(公共类)及包(默认类)两种,没有私有。,53,访问权限,54,3.5基础类库,Java提供了用于语言开发的类库,称为Java基础类库(JFC,JavaFoundationalClass),也称应用程序编程接口(API,ApplicationProgrammingInterface),分别放在不同的包中。,55,JDK7API的组成图,56,Java提供的部分常用包,57,3.5.1语言包java.lang,java.lang是Java语言最广泛使用的包。它所包括的类是其他包的基础,由系统自动引入。Object类数据类型包装类(theDataTypeWrapper)(前面已讲过)字符串类(String,StringBuffer)数学类(Math)系统和运行时类(System、Runtime)类操作类(Class,ClassLoader),58,1、Object类,Object类是Java程序中所有类的直接或间接父类,类库中所有类的父类,处在类层次最高点;包含了所有Java类的公共属性。,59,Object类的主要方法,60,2、字符串类(String),字符串声明及初始化直接用字符串常量来初始化字符串:Strings3=“Hello!Hello”;由字符数组创建字符串:charch=s,t,o,r,y;,61,创建一个String类对象并赋值:Strings2=newString(“Hello”);字符串数组形式:StringstrArray;strArray=newString8;strArray0=Hello;strArray1=“World”;例3-10,62,(2)字符串连接String类里提供方法concat用于把两个字符串连接在一起:string1.concat(string2);将返回一个String类型的新字符串,该字符串为string1末尾连接上string2。例3-11,63,String类的常用方法,64,3、变量字符串类StringBuffer,StringBuffer类也是用来处理字符串。String定义的常量字符串,一旦赋值或实例化后就不可更改,如果赋予新值将会重新开辟内存地址进行存储;而StringBuffer类在实例化StringBuffer之后,可以改动其中的字符。,65,StringBuffer类的常用方法,66,4、math类,Math类提供了用于几何学、三角学以及几种一般用途方法的浮点函数,来执行很多数学运算。Math类定义的所有变量和方法是静态的,是终结类(final)。,67,5、系统和运行时类System、Runtime,System类是一个公共最终类,不能被继承,也不能被实例化,即不能创建System类的对象。System类中所有的变量和方法都是静态的。使用形式:“System.变量名”和“System.方法名”,68,System类常用方法,访问标准输入输出流:System.in标准输入,表示键盘System.out标准输出,表示显示器System类用于访问系统资源的常用方法:arraycopy()复制一个数组exit()结束当前运行的程序currentTimeMillis()获得系统当前日期和时间等,69,6、类操作类(Class、ClassLoader),Class类提供运行时信息,如名字、类型以及父类。它的对象用于表示当前运行的Java应用程序中的类和接口。它的getClass方法返回当前对象所在的类,返回类型是Class。它的getName方法返回一个类的名称,返回值是String,它的getSuperclass方法可以获得当前对象的父类。,70,7、java.lang中的子包,Java.lang中还有一些常用的子包:1)java.lang.annotation:为java语言的注释工具提供库支持。2)java.lang.management:用于监管JVM及在其运行的操作系统。3)java.lang.ref:对垃圾回收处理提供更加灵活的控制。4)java.lang.reflect:提供获得一个类的构造方法,方法和限定符的能力,还可以动态创建和访问数组。,71,Java语言的反射机制(reflection),什么是反射:是指程序可以访问、检测和修改它本身状态或行为的一种能力。反射机制使java具有动态语言的特征。这个机制允许程序在运行时通过ReflectionAPIs取得任何一个已知名称的class的内部信息。,72,包括其modifiers(诸如public,private,static等等)superclas

温馨提示

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

评论

0/150

提交评论