Java程序设计04面向对象的基本概念课件

PPT
  • 阅读 37 次
  • 下载 0 次
  • 页数 36 页
  • 大小 575.035 KB
  • 2022-11-24 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档25.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
Java程序设计04面向对象的基本概念课件
可在后台配置第一页与第二页中间广告代码
Java程序设计04面向对象的基本概念课件
可在后台配置第二页与第三页中间广告代码
Java程序设计04面向对象的基本概念课件
可在后台配置第三页与第四页中间广告代码
Java程序设计04面向对象的基本概念课件
Java程序设计04面向对象的基本概念课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 36
  • 收藏
  • 违规举报
  • © 版权认领
下载文档25.00 元 加入VIP免费下载
文本内容

【文档说明】Java程序设计04面向对象的基本概念课件.ppt,共(36)页,575.035 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-44828.html

以下为本文档部分文字说明:

计算机科学与技术学院赵志崑zhaozk@sdfi.edu.cn赵志崑面向对象的方法•面向对象的程序设计–程序的基本构件是类和对象,不是过程或函数•面向对象的分析–类和对象是名词,过程是动词•面向对象的方法更接近人的思

维方式–提高软件开发效率•面向对象的程序设计只是一个环节–分析、设计、编码、维护赵志崑Java的面向对象特性•初级特性:基本的概念,即类和对象。•中级特性:核心的机制,即封装、继承和多态。•高级特性:由初级特性和中级特性引出的一些问题,如构造函数的使用、覆盖的规则、静态

变量和函数等。赵志崑类和对象•面向对象技术最基本的概念是类和对象:–类是一个样板,以操作、表示和算法的形式完整地定义了一组对象的行为。它通常也是面向对象语言中的模块化、封装和数据抽象的基础。–对象是类的一个实例,是一个软件单元,它由一组结构化的数据

和在其上的一组操作构成。变量方法对象赵志崑抽象数据类型classCar{intcolorNumber;intdoorNumber;intspeed;voidbrake(){…}voidspeedUp(){…};voidslowDown(){…}}CarmyCar=

newCar();myCar.speedUp();计算机中对象的原型现实生活中的对象•类实际上为实际的物体在计算机中定义了一种抽象数据类型。–抽象数据类型是仅由数据类型和可能在这个数据类型上进行的操作定义的。–使用者只能通过操作方法来

访问其属性,不用知道这个数据类型内部各种操作是如何实现的。赵志崑变量、方法和消息•对象的三个基本要素:–变量:指对象的数据,用来保存对象的状态,又称为实例字段。–方法:指对象的功能单元。–消息:软件对象通过相互间传递消息来相互作用和通信。对象B对象

A消息一个消息由三部分组成:1.接受消息的对象2.要完成方法的名字3.方法需要的参数如myCar.speedUP();赵志崑面向对象的程序设计•所有东西都是对象。•程序是一大堆对象的组合;通过消息传递,各对象知道自己该

做些什么。(分而制之)•每个对象都有自己的存储空间,可容纳其他对象。(由小到大)•每个对象都有一种类型。(举一反三)•同一类所有对象都能接收相同的消息。赵志崑类•定义类采用下面的语句:class类名{成员定义}•说明:–类的成员包括变量和函数,而且可以有

多个。–成员函数可以使用成员变量。成员函数也可以调用其它成员函数。–对于成员函数来说,成员变量类似于C++中的全局变量,但其作用范围仅限于类内部。一个类就划定了一个范围,在此范围内有“全局变量”和一些函数。classStudent{longid;chargender;int

classID;voidchangeClass(intc){classID=c;}}赵志崑类和源代码文件•一个源文件中可以写多个类。•和源文件名字相同的类叫作主类,只有主类声明前面可以有public。•一个源文件

中可以没有主类。•将源文件编译后,每个类都会生成一个.class文件。赵志崑构造函数•构造函数是类的一个特殊的成员函数,用于初始化对象。–函数名和类名相同–不需要说明返回值类型(不是void)•规则:–每个类至少有一个构造函数,一个类可以有多个构造函数。–如果没有为类

定义构造函数,系统会自动为其定义一个缺省的构造函数,不带参数。–一旦为类定义了构造函数,则系统不会再为其定义缺省构造函数。classStudent{longid;chargender;intclassID;pub

licStudent(){id=0;gender='F';classID=0;}publicStudent(longaID,charaGender,intaClassID){id=aID;gender=aG

ender;classID=aClassID;}}赵志崑对象和引用•用类声明的变量不是对象,而是对象引用,简称引用。StudentxiaoZhang;//声明一个Student类型的引用–声明引用并不创

建对象,一个引用占4个字节,相当于对象指针•创建对象须使用new运算符,格式是:new类的构造函数;–例如:newStudent();//创建一个Student对象,无参构造函数newStudent(1,‘M’,2);//有参数的构

造函数•让引用指向对象xiaoZhang=newStudent();•通过引用访问对象,访问对象成员使用“.”运算符xiaoZhang.id=200328013203194L;xiaoZhang.changeClass(1);赵志崑类、对象和引用的声明•声明

一个类:class类名{变量声明,方法声明}classStudent{longid;//学号chargender;//性别intclassID;//班级号,注意不能用class作属性名voidchangeClass(intc){//更改班级classID=c;}}•声明一个对象引用:类

名引用名StudentxiaoZhang;•创建一个对象:new类构造函数xiaoZhang=newStudent();//如果缺少这一步编译器会报错•使用对象:引用名.变量名/方法名xiaoZhang.id=

200328013203194;赵志崑存储器分配•StudentxiaoZhang;//声明一个Student对象引用xiaoZhang•xiaoZhang=newStudent();//创建一个对象先执行newStudent(

)再执行xiaoZhang=xiaoZhangxiaoZhang•xiaoZhang.id=200328013203194;//使用对象xiaoZhang000000000000000000000000000000000000000000000x01abcdef00000

000000000000000000000000x01abcdef200328013203194000000000000赵志崑对象析构•Java不支持析构函数。因为Java能够自动收集垃圾,所以不需要人工的内存回收。•自动收集垃圾:当对象没有用处后,Java会自

动的释放其占用的内存。–好处:可靠性提高、使内存管理与类接口设计分离,减少了跟踪内存管理错误的时间。–代价:对性能的影响、暂停、配置复杂性和不确定的结束。•分代收集:1.2及以后的JDK使用了多种策略混合的垃圾收集

方式,称为分代收集,其中根据对象的年龄将堆分为几个部分,不同的代是用不同的收集算法收集的。–引用计数:每一个对象都有一个关联的引用计数——对该对象的活跃引用的数量。如果对象的引用计数是零,那么它就是垃圾。–跟踪收集器:从根集开始沿着引用跟踪,直到检查了所有可到达的对象。可以在程序

注册表中、每一个线程堆栈中的(基于堆栈的)局部变量中以及静态变量中找到根。赵志崑参数传递•Java语言在参数传递中只支持值传递方式–如果方法的参数是基本数据类型(8个),在方法内改变形参的值不影响方法外的实参的值。–如果方法的参数是对象引用,在方法内通过形参改变对象的内容

,方法退出后实参指向的对象的内容也改变,因为形参和实参指向的是同一个对象。voidinc(intn){n++;}intx=5;inc(x);//x=?classCount{intn;}voidinc(Countc){c.n++;}Countx=newCount();x.n=5;in

c(x);//x.n=?赵志崑引用与对象的内存分配StudentxiaoMing=newStudent();StudentxiaoFang=newStudent();xiaoMing.gender=‘M’;xiaoFang.gender=‘F’;说明:结果xiaoMi

ng.gender为‘M’,因为引用xiaoMing和xiaoFang指向不同的对象。(xiaoMing==xiaoFang)的结果为false。此时对象相等的判断应该用equals方法。0x01abcdef????????????????‘M’????????xi

aoMing0x01abcdf5xiaoFang????????????????‘F’????????两个引用指向不同的对象StudentxiaoMing=newStudent();StudentxiaoFang=xiaoMing;xiaoMing.gender

=‘M’;xiaoFang.gender=‘F’;说明:结果xiaoMing.gender为‘F’,因为引用xiaoMing和xiaoFang指向同一个对象。(xiaoMing==xiaoFang)的结果为true。xiaoMing.equals(xiaoFang)结果也为true。

两个引用指向同一个对象0x01abcdef????????????????‘F’????????xiaoMing0x01abcdefxiaoFang赵志崑原始数据类型的内存分配intxiaoMing=100;intxiaoFang=xiaoMing;xiaoFang=200;说明:结果

xiaoMing为100,因为原始数据类型不存在指向同一个对象的问题。(xiaoMing==xiaoFang)的结果为false。100xiaoMing200xiaoFang赵志崑参数传递的例子•方法的参数是引用时,形参是对象引用的复制品,通过形参访问的和实参访

问的是同一个对象。•方法的参数是基本数据类型时,形参是实参的一个复制品。classStudent{intjavaScore;};classJavaClass{score(StudentaStudent,intaScore){//aStudent为引用型aStudent.javaScore=aSc

ore;aScore=100;}}Students1=newStudent();JavaClassc1=newJavaClass();intx=90;c1.score(s1,x);//s1.javaScore

值为100,x的值还是90。赵志崑变量和作用域•局部(local)变量:在一个方法内定义的变量,也被称作自动(automatic)、临时(temporary)或栈(stack)变量。局部变量只在方法内部起作用。–当一个方法被执行时,局部变

量被创建;当一个方法被终止时,局部变量被清除。–局部变量必须使用之前初始化,否则编译时将出错。–方法(包括构造函数)的入口参数是局部变量。•实例变量:在方法外而类的内部定义的变量,在使用newXxxx()调用构造一个对象时被创建。–类的实例变量有默认的初始值,可以不用显式初始化。

•booleanfalseChar'\u0000'(null)float0.0fdouble0.0d•byte(byte)0short(short)0int0long0L•局部变量可以取消非局部变量的作用–方法内声明的局部变量与类变量或实例变量可以重名。–

此时缺省为局部变量。–若要使用类变量或实例变量,应使用this关键字。赵志崑变量作用域举例classStudent{longid;chargender;intclassID;voidchangeClass(intclassID){this.classID=classID;in

ty=0;for(intx=0;x<10;x++){y+=x;}for(intx=0;x<100;x++){y+=x;}}};实例变量局部变量赵志崑类的管理•当程序中的类非常多时,特别是由多人合作开发时,如何

管理类?–需要解决类名冲突的问题。•有没有类似的问题?赵志崑包•定义:Java允许把多个类收集在一起成为一组,称为包,用来管理类。•目的:便于组织类,使自己的类和他人提供的类分离,避免命名冲突,还可以提高编译速度

。•分级:包可以嵌套,从而分成层次。如java.util,类似于硬盘上的目录组织。一可以使每个包中的类不至于过多,二可以保证类名的唯一性。•Java库中的包:标准Java库被分成许多包,并且分层。所有的包都在jav

a和javax包层次中。赵志崑package—声明包•关键字package将源文件中的所有类添加到一个包中。•如果源文件中没有package语句,那么此文件的所有类将被放到默认的包中。默认的包没有包名。•类的完整名称:包层次+类名school.Stud

ent执行类的命令:javaschool.Student•JDK1.2以后的版本拒绝加载用户定义的以java.开始的类,以防止对java类库的恶意改写。//Student.javapackageschool;publicclassStudent{……}classCou

rse{……}•package语句必须放在源文件的头部,在所有的类定义代码之前。•包名称全部采用小写字符赵志崑类的可见性•将类组织到包中,那么类就有可见性的问题。•类声明时可以使用public说明可见性;或者不使用可见性说明,默认为fri

endly;不允许使用其他修饰符。–public可见的类对包外是可见的,可以被其他包中的类使用。–friendly可见的类是包内可见的,只能被本包中的类使用。•每个源文件中只有主类(与源文件同名的类)能够是public的。赵志崑import—引入包•使用包:一个类可以使

用自己所在包中的所有类,也可以使用来自其他包中的所有public类。使用其他包中的public类有两种方式:–类名前加上完整的包名,如:java.util.Datetoday=newjava.util.Date();–使用import关键字,import的作用是给出一个指向此包中的类的快

捷方式。•import可以引入某个特定的类importjava.util.Date;Datetoday=newDate();•import也可以引入包中的所有类importjava.util.*;Datetoday=newDate();•注意:–只能用*来引入一个包中的所有类,并不能嵌套引入下层

包。例如,不能使用importjava.*或者importjava.*.*引入所有包。–只能引入类,不能引入对象。如不能用importSystem.out。–Java缺省自动引入java.lang包中所有类,相当于importjava.lang.*;赵志崑同名类的问题•问题:两个不同包中

含有同名类,如java.util包和java.sql包中都有一个Date类。下面的程序会出现编译错误,因为编译器不知道使用哪个Date类:importjava.util.*;importjava.sql.*;Datetoday;//编译错

误•解决方法:用一条特定的import语句指明用哪个类。importjava.util.*;importjava.sql.*;importjava.util.Date;Datetoday;//编译错误•若两个Date类都要使用,则只能在每个类前面加上完整的包名。java.u

til.Datetoday=newjava.util.Date();java.sql.DatesqlDate=newjava.sql.Date();赵志崑类文件的管理•类(class)文件的存放位置要和类所在的包对应–将包层次对应到文件

目录层次–例如:zzk.school.Student类应存放到zzk\school目录下–执行命令:从当前目录开始查找相应的子目录和文件javazzk.school.Student命令,需要从当前目录能够找到zzk\school\Student.class文件,这是一种相对位置。•源代码文件的

存放位置–如果类A中用到了另一个类B,那么编译A时,编译器需要访问B的class文件;或者找到B的源文件也行,此时编译器会先编译B。–所以一般情况下,java源代码文件的存放位置也会和类的包层次对应。–编译命令:编译

zzk\school\Student.java文件,需要在zzk的上层目录执行命令javaczzk\school\Student.java赵志崑虚拟机如何定位类•虚拟机需要某个类时,需要找到该类文件(.c

lass文件)以及该类用到的其他的类。•类被存储在文件系统的子目录中,路径必须与所在包名相匹配。•例如:javahello.Hello调用虚拟机类所在的包类名packagehello;publicclassHello{……}调用Java虚拟机时命令行所在的目录类

文件的位置赵志崑classpath环境变量•可以使用java命令的-classpath选项设置类的查找路径,可以简写为-cp,多个路径之间用;隔开。如:java–classpath.;helloHello;•Java虚拟机在加

载类的时候以这样一种方式查找具体的类文件:classpath+包存储的目录+具体的类文件。–如classpath中有一个c:\java\classdir条目,–需要加载的类是hello.Hello.class,–在加载这个类的时候,虚拟机会查找c:\java\classdir\hello\目

录,如果Hello.class在这个目录中,虚拟机就可以找到。–如果这个类不在这个目录中,同时也不在任何一个其它classpath中,那么虚拟机会抛出一个ClassNotFoundException。•也可以将多个类

文件及其目录结构保存在一个jar文件中。赵志崑虚拟机查找类的路径顺序•虚拟机寻找类文件所使用路径的顺序:–首先自动搜索jre/lib和jre/lib/ext目录下的rt.jar和其他的jar文件。–然后依次搜索-classpath中说明

的路径。–注:查找文件时使用以包名为相对路径的文件名。例如importhello.Hello对于当前目录来说就是查找hello\Hello.class文件。•Classpath的顺序和类版本冲突–Java虚拟机在加

载类的时候查找classpath是有顺序的,如果在classpath中有多个条目都有同一个名称的类,那么在较前位置的类会被加载,后面的会被忽略。–这种按照顺序的类加载可能会导致类的版本冲突。很多时候如果不注意这一点,可能会导致奇怪的

异常。赵志崑编译器如何定位类•编译器在采用与虚拟机同样的查找文件方式之外,还要多做一些事情:–确定对象所属的确切类。如果源代码中使用了一个对象,而没有明确指出类所在的包,那么编译器要检查所有import语句确定类所在的包。如果发现两个包中都

有同名的类,则报告编译错误。–检查源文件是否有更改。编译器找到类(.class)文件后,还要找到源文件(.java),并比较两个文件的最后更新时间。若源文件比类文件新,则要重新编译源文件生成类文件。赵志崑编译器与虚拟机如何定位类•编译器查找路径与虚拟机查找路

径的区别:–编译器总是查找当前目录。而虚拟机只有在类路径中包含当前目录(.)的情况下才查找当前目录。•如果没有设置类路径,缺省的类路径中包含当前目录。这就是说,使用javac会搜索当前目录下是否有需要的文件;但是ja

va–cpdirHello则只搜索.\dir目录下是否有Hello.class文件,而不搜索当前目录。–编译器只从当前目录下的类开始编译。•如果Hello.java不放在当前目录而是放在classpath目录,那么javacHello.java将找不到文件。如果Hello.java在当前目录

下,而Hello类中用到的其他类放在classpath目录中,则编译可以通过。相反,java命令则可以执行不在当前目录下的类。赵志崑设置CLASSPATH变量•Java和javac命令都有-classpath选项,但是如果每次使用都需要设置类路径,会非常冗长麻烦。因此,Java提供了另外一

种选择,设置CLASSPATH环境变量。•Win95/98/ME下:编辑autoexec.bat文件,添加一行SETCLASSPATH=c:\java\classdir;.(注意不要落了分号后面表示当前目录的点号,=号两边不要有空格。)•WinNT/2000/XP

下:控制面板系统高级环境变量,在用户环境变量或者系统环境变量中添加一项,变量名称为CLASSPATH,值为c:\java\classdir;.。•UNIX/Linux下,编辑shell的启动文件。–若使用CShell,则向位于主目录

的.cshrc文件中添加一行:setenvCLASSPATH/home/user/classdir:.–若使用bash,则向位于主目录的.bash_profile文件中添加一行:exportCLASSPATH=/home/user/cla

ssdir:.赵志崑源文件与类文件的存放•目录结构:–开发时,源文件(.java)和类文件(.class)一般放在相同目录下,便于编译和执行。–发布时,如果源代码不需要保密,那么存放格式和开发时相同;如果源代码不希望给别人看到,或者程序不希望别人改动,那么按照相同的目

录结构只提供类文件即可。•单个类:–若只在某个特定程序中使用的类,把类放在当前目录下。–若需要在多个程序中共享使用的类,把类放在一个或多个特定目录下,并按包的层次组织文件和目录层次。例如,可以每个用户一个目录。–将这些保存共享

源文件和类文件的目录添加到CLASSPATH环境变量中。赵志崑作业(实验内容)•第一步:设计四个类–Student类•属性包括:姓名、分数、级别;–Teacher类•setScore(Studentstudent,Floatscore)

:设置student的分数,同时调用Rank类的rank方法评级;–Rank类•rank(Studentstudent):根据student的分数评级为A,B,C,D,E–Test类•main方法:创建一个Student对象、一个Teac

her对象,并用Teacher对象为Student对象设置分数•第二步:将四个类放入包中:–Student,Teacher和Rank类放入一个包,命名为:你的姓名拼音.school–Test类放入以你的姓名拼音命名的包中,即上面三个类的上一层赵志崑感谢!本课

程全部ppt和源代码可以从“网上课堂”下载

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?