zJava面向对象程序设计第4章_类与对象.ppt
Java是面向是面向对对象的象的语语言言所有所有Java程序都以类程序都以类class为组织单元为组织单元关键字关键字class定义自定义的数据类型定义自定义的数据类型publicclassHelloWorldpublicstaticvoidmain(Stringargs)System.out.println(HelloWorld!);Java类模板类模板l类将现实世界中的概念模拟到计算机程序中publicclass类名类名/定义属性部分定义属性部分属性属性1的类型的类型属性属性1;属性属性2的类型的类型属性属性2;属性属性n的类型的类型属性属性n;/定义方法部分定义方法部分方法方法1;方法方法2;方法方法m;如何定义类如何定义类l定义一个类的步骤1、定义类名2、编写类的属性3、编写类的方法类示例类示例2-1 School类类属性:属性:学校全称学校全称学校教室数目学校教室数目学校机房数目学校机房数目方法:方法:展示学校信息展示学校信息3、在不同的学校,会感受到相同的环境和教、在不同的学校,会感受到相同的环境和教学氛围,用类的思想输出中心信息学氛围,用类的思想输出中心信息类示例类示例2-2publicclassSchoolStringschoolName;/学校名称学校名称intclassNumber;/教室数目教室数目intlabNumber;/机房数目机房数目/定义学校的方法定义学校的方法publicvoidshowCenter()System.out.println(schoolName+“学生学生n+配备:配备:+classNumber+教教+labNumber+机机);定义类的定义类的showCenter()方法,方法,用于输出类相关的信息用于输出类相关的信息演示示例演示示例1:用类的思想输出学校信息:用类的思想输出学校信息方法方法成员变量成员变量如何创建和使用对象如何创建和使用对象l使用对象的步骤:创建对象l类名 对象名=new 类名();引用对象成员:使用“.”进行以下操作l引用类的属性:对象名.属性l引用类的方法:对象名.方法名()Schoolcenter=newSchool();center.name=“黄山学院黄山学院;/给给name属性赋值属性赋值center.showCenter();/调用调用showCenter()方法方法publicclassInitialSchoolpublicstaticvoidmain(Stringargs)Schoolcenter=newSchool();System.out.println(*初始化成员变量前初始化成员变量前*);center.showCenter();center.schoolName=“黄山学院黄山学院;center.classNumber=100;center.labNumber=10;System.out.println(n*初始化成员变量后初始化成员变量后*);center.showCenter()创建和使用对象示例创建和使用对象示例5-1创建创建“黄山学院黄山学院”对象对象说一说看到说一说看到什么效果?什么效果?演示示例演示示例2:创建和使用对象:创建和使用对象1说一说又看到什说一说又看到什么效果?么效果?创建和使用对象示例创建和使用对象示例5-2 4、编写学生类,输出学生相关信息;编写教、编写学生类,输出学生相关信息;编写教员类,输出教员相关信息员类,输出教员相关信息学生类学生类姓名姓名年龄年龄班级班级爱好爱好显示学员个人信息显示学员个人信息教员类教员类姓名姓名专业方向专业方向教授课程教授课程教龄教龄显示教员个人信息显示教员个人信息publicclassStudentStringname;/姓名姓名intage;/年龄年龄StringclassNo;/班级班级Stringhobby;/爱好爱好/输出信息方法输出信息方法publicvoidshow()System.out.println(name+n年龄:年龄:+age+n就读于:就读于:+classNo+n爱好:爱好:+hobby);创建和使用对象示例创建和使用对象示例5-3成员变量成员变量演示示例演示示例3:创建和使用对象:创建和使用对象2成员方法成员方法publicclassInitialStudentpublicstaticvoidmain(Stringargs)Studentstudent=newStudent();student.name=张浩张浩;student.age=10;student.classNo=S1班班;student.hobby=篮球篮球;student.show();创建对象创建对象给每个属性赋值给每个属性赋值调用方法调用方法创建和使用对象示例创建和使用对象示例5-4 5、一个景区根据游人的年龄收取不同价格的、一个景区根据游人的年龄收取不同价格的门票。请编写游人类,根据年龄段决定能够购门票。请编写游人类,根据年龄段决定能够购买的门票价格并输出买的门票价格并输出游人类游人类姓名姓名年龄年龄显示姓名及门票价格显示姓名及门票价格publicclassVisitorStringname;/姓名姓名intage;/年龄年龄/显示信息方法显示信息方法publicvoidshow()Scannerinput=newScanner(System.in);while(!n.equals(name)if(age=18&age=60)/判断年龄判断年龄System.out.println(name+“年龄为年龄为+age+“,价格为价格为20元元);elseSystem.out.println(name+的年龄为:的年龄为:+age+,免费,免费);创建和使用对象示例创建和使用对象示例5-5成员方法成员方法成员变量成员变量importjava.util.Scanner;publicclassInitialVistorpublicstaticvoidmain(Stringargs)Scannerinput=newScanner(System.in);Visitorv=newVisitor();System.out.print(请输入姓名:请输入姓名:);v.name=input.next();System.out.print(请输入年龄:请输入年龄:);v.age=input.nextInt();v.show();创建对象创建对象给每个属性赋值给每个属性赋值调用方法调用方法演示示例演示示例4:创建和使用对象:创建和使用对象3面向对象(面向对象(OO)的优点)的优点l与人类的思维习惯一致把人类解决问题的思维过程转变为程序能够理解的过程 l信息隐藏,提高了程序的可维护性和安全性 封装实现了模块化和信息隐藏 封装使得在对象外部不能随意访问对象的属性和方法l提高了程序的可重用性一个类可以创建多个对象实例,增加了重用性 4.2.2类体类体 类类声声明明之之后后的的一一对对大大括括号号“”,“”以以及及它它们们之之间间的的内内容容称称作作类类体体,大大括括号号之之间间的的内内容容称称作作类体的内容。类体的内容。类类体体的的内内容容由由两两部部分分构构:一一部部分分是是变变量量的的声声明明,用用来来刻刻画画属属性性;另另一一部部分分是是方方法法的的定定义义,用用来来刻刻画功能。画功能。4.2.3成员变量和局部变量成员变量和局部变量 类类体体中中变量声明部分所声明的变量被称作类的成员变量。在方法体中声明的变量和方法的参数被称作局部变量。1变变量量的的类类型型:成员变量和局部变量的类型可以是Java中的任何一种数据类型,包括基本类型:整型、浮点型、字符型;引用类型:数组、对象和接口(对象和接口见后续内容)。2变变量量的的有有效效范范围围:成员变量在整个类内都有效,局部变量只在声明它的方法内有效。方法参数在整个方法内有效,方法内的局部变量从声明它的位置之后开始有效。3实实例例变变量量与与类类变变量量:在声明成员变量时,用关键字static给予修饰的称作类变量,否则称作实例变量(类变量也称为static变量,静态变量)。4成成员员变变量量的的隐隐藏藏:如果局部变量的名字与成员变量的名字相同,则成员变量被隐藏,即这个成员变量在这个方法内暂时失效。5编程风格编程风格(1)一行只声明一个变量。(2)变量的名字符合标识符规定。(3)变量名字见名知意,避免容易混淆的变量名字。4.2.4方法方法 方方法法的的定定义义包包括括两两部部分分:方方法法声声明明和和方方法法体体。一一般般格格式为:式为:方法声明部分方法声明部分 方法体的内容方法体的内容 1方法声明 方法声明包括方法名和方法的返回类型,如:float area()注:注:方法的返回类型方法的返回类型、方法的参数、方法的名字方法的参数、方法的名字 2方法体 方法声明之后的一对大括号“”,“”以及之间的内容称作方法的方法体。方法体的内容包括局部变量的声明和Java语句。为什么要用带参数的方法为什么要用带参数的方法l工作原理新鲜桃汁新鲜桃汁新鲜苹果汁新鲜苹果汁新鲜梨汁新鲜梨汁输输出出三三种种果果汁汁如何使用带参数的方法如何使用带参数的方法l定义带参数的方法l调用带参数的方法publicclassZhazhipublicStringzhazhi(Stringfruit)Stringjuice=fruit+汁汁;returnjuice;/*调用调用zhazhi方法方法*/ZhazhimyZhazhi=newZhazhi();StringmyFruit=苹果苹果;StringmyJuice=myZhazhi.zhazhi(myFruit);System.out.println(myJuice);参数列表:参数列表:(数据类型数据类型参数参数1,数,数据类型据类型参数参数2)调用方法,传递的参数要调用方法,传递的参数要与参数列表一一对应与参数列表一一对应如何使用带参数的方法如何使用带参数的方法返回类型返回类型()/方法的主体方法的主体该方法允许被访问调用该方法允许被访问调用的权限范围的权限范围方法返回值的方法返回值的类型类型publicclassStudentsBizStringnames=newString30;publicvoidaddName(Stringname)/增加学生姓名增加学生姓名publicvoidshowNames()/显示全部学生姓名显示全部学生姓名传送给方法的形参列表传送给方法的形参列表一个形式参数一个形式参数没有返回值没有返回值如何使用带参数的方法如何使用带参数的方法publicstaticvoidmain(Stringargs)StudentsBizst=newStudentsBiz();Scannerinput=newScanner(System.in);for(inti=0;i5;i+)System.out.print(请输入学生姓名:请输入学生姓名:);StringnewName=input.next();st.addName(newName);st.showNames();实参的类型、数量、顺序实参的类型、数量、顺序都要与形参一一对应都要与形参一一对应先实例化对象,先实例化对象,再使用方法再使用方法演示示例演示示例1:带一个参数的方法:带一个参数的方法调用带参数的方法调用带参数的方法对象名对象名.方法名(实参方法名(实参1,实参实参2,,实参,实参n)实参列表实参列表带两个参数的方法带两个参数的方法l可以设计一个方法来实现,通过传递两个参数(需要修改的姓名、新姓名)来实现 1、修改学生姓名,输入新、旧姓名,进行、修改学生姓名,输入新、旧姓名,进行修改并显示是否修改成功修改并显示是否修改成功publicclassStudentsBizStringnames=newString30;publicbooleaneditName(StringoldName,StringnewName)booleanfind=false;/是否找到并修改成功标识是否找到并修改成功标识/循环数组,找到姓名为循环数组,找到姓名为oldName的元素,修改为的元素,修改为newNamefor(inti=0;inames.length;i+)if(namesi.equals(oldName)namesi=newName;find=true;break;returnfind;返回值类型返回值类型带有两个形参带有两个形参返回结果:返回结果:boolean类型类型带两个参数的方法带两个参数的方法2-2publicclassTestModifypublicstaticvoidmain(Stringargs)System.out.print(n请输入要修改的学生姓名请输入要修改的学生姓名:);Stringoldname=input.next();System.out.print(n请输入新的学生姓名请输入新的学生姓名:);Stringnewname=input.next();System.out.println(n*修改结果修改结果*);if(st.editName(oldname,newname)System.out.println(找到并修改成功找到并修改成功!);elseSystem.out.println(没找到该学生没找到该学生!);st.showNames();根据返回值进行处根据返回值进行处理理传递两个实参传递两个实参演示示例演示示例2:带两个参数的方法:带两个参数的方法带带多多个参数的方法个参数的方法l设计方法,通过传递三个参数(开始位置、结束位置,查找的姓名)来实现 2、指定查找区间,查找学生姓名并显示是、指定查找区间,查找学生姓名并显示是否修改成功否修改成功publicbooleansearchName(intstart,intend,Stringname)booleanfind=false;/是否找到标识是否找到标识/指定区间数组中,查找姓名指定区间数组中,查找姓名for(inti=start-1;iend;i+)if(namesi.equals(name)find=true;break;returnfind;返回值类型返回值类型带有三个形参带有三个形参返回结果:返回结果:boolean类型类型带带多多个参数的方法个参数的方法演示示例演示示例3:带多个参数的方法:带多个参数的方法if(st.searchName(s,e,name)System.out.println(找到了找到了!);elseSystem.out.println(没找到该学生没找到该学生!);传递三个实参传递三个实参/方法定义方法定义publicvoidaddName(Stringname)/方法体方法体/方法调用方法调用对象名对象名.addName(String张三张三);调用方法时不能指定实参类型!调用方法时不能指定实参类型!常见错误常见错误对象名对象名.addName(张三张三);/方法定义方法定义publicbooleansearchName(intstart,intend,Stringname)/方法体方法体/方法调用方法调用Strings=开始开始;inte=3;Stringname=张三张三;booleanflag=对象名对象名.searchName(s,e,name);形参和实参数据类型不一致形参和实参数据类型不一致!常见错误常见错误/方法定义方法定义publicbooleansearchName(intstart,intend,Stringname)/方法体方法体/方法调用方法调用ints=1;inte=3;booleanflag=对象名对象名.searchName(s,e);形参和实参数量不一致形参和实参数量不一致!常见错误常见错误/方法定义方法定义publicbooleansearchName(intstart,intend,Stringname)/方法体方法体/方法调用方法调用ints=1;inte=3;Stringname=张三张三;对象名对象名.searchName(s,e,name);调用方法后没有对返回值作任何处理调用方法后没有对返回值作任何处理!常见错误常见错误数组类型的方法返回值数组类型的方法返回值l使用Arrays类提供的sort()方法实现l定义一个独立的方法来实现姓名排序,该方法的返回值为数组类型1、编写方法,实现学生的姓名排序、编写方法,实现学生的姓名排序publicclassStudentsBizStringnames=newString5;/学生姓名数组学生姓名数组publicvoidinputNames()/接收用户输入的接收用户输入的5个学生姓名,存放于个学生姓名,存放于names中中/字符串数组作为返回值字符串数组作为返回值publicStringgetNames()Arrays.sort(names);returnnames;返回字符串数组返回字符串数组publicclassTestSortpublicstaticvoidmain(Stringargs)StudentsBizst=newStudentsBiz();st.inputNames();Stringnamesbysort=st.getNames();System.out.println(*排序后排序后*);for(inti=0;inamesbysort.length;i+)if(namesbysorti!=null)System.out.print(namesbysorti+t);数组类型的方法返回值数组类型的方法返回值演示示例演示示例1:数组类型的方法返回值:数组类型的方法返回值调用方法,返回结果调用方法,返回结果处理返回结果处理返回结果对象类型的参数对象类型的参数l定义学生类,添加属性:三门课的成绩 l定义学生成绩计算类,添加方法,传递对象参数 l定义测试类2、编写学生成绩计算类,计算学生平均分、编写学生成绩计算类,计算学生平均分publicclassStudents/定义三门课成绩属性定义三门课成绩属性floatjava=0;floatdatabase=0;floathtml=0;三门课成绩三门课成绩publicclassScore/计算平均分,对象作为参数计算平均分,对象作为参数publicfloatgetAvg(Studentsstu)floatavg=0;avg=(stu.java+stu.database+stu.html)/3;returnavg;对象类型的参数对象类型的参数返回结果返回结果对象类型的参数对象类型的参数publicclassTestScorepublicstaticvoidmain(Stringargs)Studentsstu=newStudents();Scoresc=newScore();floatavg=0;stu.java=80;stu.database=95;stu.html=77;avg=sc.getAvg(stu);System.out.println(该学生的平均分为:该学生的平均分为:+avg);调用方法,传递参数,调用方法,传递参数,返回结果返回结果演示示例演示示例2:对象类型的参数:对象类型的参数对象类型的参数对象类型的参数809577publicclassTestScorepublicstaticvoidmain(Stringargs)Studentsstu=newStudents();Scoresc=newScore();floatavg=0;stu.java=80;stu.database=95;stu.html=77;avg=sc.getAvg(stu);System.out.println(该学生的平均分为:该学生的平均分为:+avg);publicclassScore/计算平均分,对象作为参数计算平均分,对象作为参数publicfloatgetAvg(Studentsstu)floatavg=0;avg=(stu.java+stu.database+stu.html)/3;returnavg;main:stu0 x2a486c0.00.00.00main:avg84.0getAvg:stu0 x2a486c0getAvg:avg84.0省略内存分配省略内存分配内存分配图内存分配图对象数组类型的参数对象数组类型的参数lStudents类中定义身高属性lHeight类中定义方法,传递学生对象数组,求平均身高l测试类调用Height类的方法3、计算学生的平均身高、计算学生的平均身高publicclassHeightpublicfloatgetAvgHeight(Studentsstu)floatavgHeight=0;floatall=0;/所有学生的总身高所有学生的总身高intcount=0;/学生计数学生计数for(inti=0;i100|health0)this.health=40;System.out.println(健康值应该在健康值应该在0和和100之间,默认值是之间,默认值是40);elsethis.health=health;/其它其它getter/setter方法方法this代表代表当前对象当前对象 1 1 2 2 2 2 3 3-name:String-health:int-love:int-strain:StringDog+print():void+setHealth():void+getHealth():Stringthis的用法lthis关键字的用法调用属性调用方法调用构造方法this.health=100;this.name=大黄大黄;this.print();this();如果使用,如果使用,必须是必须是构构造方法中的造方法中的第一条语第一条语句句 this(小黑小黑,100,100,雄雄);为什么需要包为什么需要包l生活案例 文档分门别类,易于查找文档分门别类,易于查找不同内容的文档可以放在不同的不同内容的文档可以放在不同的袋子中,拥有相同的名字,避免冲突袋子中,拥有相同的名字,避免冲突易于管理易于管理为什么需要包为什么需要包树形文件系统树形文件系统使用目录解决文件同名冲突问题使用目录解决文件同名冲突问题如何存放两个同名的类而不冲突?如何存放两个同名的类而不冲突?Sort.java插入排序插入排序Sort.java冒泡排序冒泡排序包包l包解决类的同名问题允许类组成较小的单元(类似允许类组成较小的单元(类似文件夹),易于找到和使用相文件夹),易于找到和使用相应的文件应的文件防止命名冲突防止命名冲突更好的保护类、属更好的保护类、属性和方法性和方法A.java包包如何创建包如何创建包package cn.jbit.classandobject;/声明包public class AccpSchool /public String toString()/包名包名使用使用package声明包,声明包,以分号结尾以分号结尾如果有包的声明,一定如果有包的声明,一定作为作为Java源代码的第一条源代码的第一条语句语句包命名规范包命名规范l包名由小写字母组成,不能以圆点开头或结尾l包名之前最好加上唯一的前缀,通常使用组织倒置的网络域名。如:域名 l包名后续部分依不同机构内部的规范不同而不同 packagemypackage;packagenet.javagroup.mypackage;packagenet.javagroup.research.powerproject;部门名部门名项目名项目名package.mypackage;用用Eclipse创建包创建包l使用Eclipse创建包的两种方法:分别创建包和类:l创建项目创建包创建类创建类的过程中创建类所在的包l创建项目创建包和类演示示例演示示例4:使用:使用Eclipse创建包和类创建包和类 包与目录的关系包与目录的关系l创建好的包和Java源文件是如何存储的?创建包cn.jbit.classandobject,即创建了目录结构:cnjbitclassandobject cnjbitclassandobjectAccpSchool.javaHelloAccp.java如何导入包如何导入包l为了使用不在同一包中的类,需要在Java程序中使用import关键字导入这个类importjava.util.*;/导入导入java.util包中所有类包中所有类importcn.jbit.classandobject.AccpSchool;/导入指定包中指定类导入指定包中指定类关键字关键字import并不陌生并不陌生import包名包名.类名;类名;1、系统包:、系统包:java.util2、自定义包:、自定义包:cn.jbit.classandobject*:指包中的所有类指包中的所有类AccpSchool:指包中的:指包中的AccpSchool类类小结小结l AccpSchool.java位于cn.jbit.classandobject包中,HelloAccp.java位于demo包中,下面程序空缺部分需要填入代码吗?如果需要,是什么?/添加代码添加代码2/添加代码添加代码3publicclassHelloAccppublicstaticvoidmain(Stringargs)AccpSchoolcenter=newAccpSchool();center.showMessage();/添加代码添加代码1publicclassAccpSchoolpublicvoidshowMessage()System.out.println(“这是上这是上海海Accp中心。中心。);packagecn.jbit.classandobject;packagedemo;importcn.jbit.classandobject.*;声明包的含义:声明包的含义:声明当前类所处的位置声明当前类所处的位置导入包的含义:导入包的含义:声明在当前类中要使用到的声明在当前类中要使用到的别的类所处的位置别的类所处的位置练习练习模拟账户查询,实现存取模拟账户查询,实现存取款款l需求说明:模拟银行账户业务,进行余额查询,实现存款和取款完成时间:完成时间:20分钟分钟4.2.5方法重载方法重载 方方法法重重载载的的意意思思是是:一一个个类类中中可可以以有有多多个个方方法法具具有有相相同同的的名名字字,但但这这些些方方法法的的参参数数必必须须不不同同,即即或或者者是是参参数数的的个个数数不不同同,或或者者是是参参数数的的类类型不同。型不同。4.2.6构造方法构造方法 构构造造方方法法是是一一种种特特殊殊方方法法,它它的的名名字字必必须须与与它它所所在在的的类类的的名名字字完完全全相相同同,而而且且没没有有类类型型,构造方法也可以重构造方法也可以重载载。4.2.7类方法和实例方法类方法和实例方法 方方法法声声明明时时,方方法法类类型型前前面面不不加加关关键键字字staticstatic修修饰饰的的是是实实例例方方法法、加加staticstatic修修饰饰的的是是类方法(静态方法)。类方法(静态方法)。4.2.8几几个值得注意的问题个值得注意的问题 1 1对对成成员员变变量量的的操操作作只只能能放放在在方方法法中中,方方法法可可以以对对成成员员变变量量和和该该方方法法体体中中声声明明的的局局部部变变量进行操作。量进行操作。2 2需需要要注注意意的的是是:实实例例方方法法既既能能对对类类变变量量操操作作也也能能对对实实例例变变量量操操作作,而而类类方方法法只只能能对对类类变变量进行操作。量进行操作。3 3一一个个类类中中的的方方法法可可以以互互相相调调用用,实实例例方方法法可可以以调调用用该该类类中中的的其其它它方方法法;类类中中的的类类方方法法只只能调用该类的类方法,不能调用实例方法。能调用该类的类方法,不能调用实例方法。4.4参数传值参数传值4.4.1基本数据类型参数的传值基本数据类型参数的传值 对对于于基基本本数数据据类类型型的的参参数数,向向该该参参数数传传递递的值的级别不可以高于该参数的级别的值的级别不可以高于该参数的级别。例例4-44-4 4.4.2引用类型参数的传值引用类型参数的传值 当当参参数数是是引引用用类类型型时时,“传传值值”传传递递的的是是变变量中存放的量中存放的“引用引用”,而不是变量所引用的实体。,而不是变量所引用的实体。例例4-54-5 4.4.3可变参数可变参数 可可变变参参数数是是指指在在声声明明方方法法时时不不给给出出参参数数列列表表中中从从某某项项直直至至最最后后一一项项参参数数的的名名字字和和个个数数,但但这这些些参参数数的的类类型型必必须须相相同同。可可变变参参数数使使用用“”“”表表示示若若干干个个参参数数,这这些些参参数数的的类类型型必必须须相相同同,最最后后一个参数必须是参数列表中的最后一个参数。一个参数必须是参数列表中的最后一个参数。例如:例如:public void public void f(intf(int.x).x)例例4-64-64.4.4有理数的类封装有理数的类封装 面面向向对对象象编编程程核核心心思思想想之之一一就就是是将将数数据据和和对对数据的操作封装在一起。数据的操作封装在一起。1 1RationalRational(有理数)类有理数)类 2 2用用RationalRational对象做运算对象做运算 Rational.javaRational.java MainClass.javaMainClass.java 4.5对象的组合对象的组合 一一个个类类可可以以把把对对象象作作为为自自己己的的成成员员变变量量,如如果果用用这这样样的的类类创创建建对对象象,那那么么该该对对象象中中就就会会有有其其它它对对象象,也也就就是是说说该该对对象象将将其其他他对对象象作作为为自自己己的的组组成成部部分分,或或者者说说该该对对象象是是由由几几个个对对象象组合而成。组合而成。例例4-74-7 4.6staticstatic关键字关键字 用static 修饰的变量 类变量类变量没有用static 修饰的变量 实例变量实例变量方法声明中用static 修饰的方法类方法类方法方法声明中不用static 修饰的方法实例方法实例方法4.6.1实例变量和类变量的区别实例变量和类变量的区别 如如果果类类中中有有类类变变量量,那那么么所所有有对对象象的的这这个个类类变变量量都都分分配配给给相相同同的的一一处处内内存存,改改变变其其中中一一个个对对象象的的这这个个类类变变量量会会影影响响其其它它对对象象的的这这个个类类变变量。也就是说对象共享类变量。量。也就是说对象共享类变量。例例4-84-8 4.6.2实例方法和类方法的区别实例方法和类方法的区别 当当用用类类创创建建对对象象后后,类类中中的的实实例例方方法法才才分分配配入入口口地地址址,从从而而实实例例方方法法可可以以被被类类创创建建的的任任何何对对象调用执行。象调用执行。对对于于类类中中的的类类方方法法,在在该该类类被被加加载载到到内内存存时时,就分配了相应的入口地址。就分配了相应的入口地址。例例4-94-9 4.7this this 关键字关键字 this是Java的一个关键字,表示某个对象。this可以出现在实例方法和构造方法中,但不可以出现在类方法中。4.7.1在构造方法中使用在构造方法中使用this thisthis关关键键字字出出现现在在类类的的构构造造方方法法中中时时,代代表表使用该构造方法所创建的对象。使用该构造方法所创建的对象。例例4-104-10 4.7.2在实例方法中使用在实例方法中使用this 当当thisthis关关键键字字出出现现实实例例方方法法中中时时,代代表表正正在在调用该方法的当前对象。调用该方法的当前对象。当当实实例例成成员员变变量量在在实实例例方方法法中中出出现现时时,默默认认的的格式是:格式是:this.this.成员变量。成员变量。当当staticstatic成成员员变变量量在在实实例例方方法法中中出出现现时时,默默认的格式是:认的格式是:类名类名.成员变量。成员变量。4.8包包 包是包是Java语言中有效地管理类的一个机制。语言中有效地管理类的一个机制。包名的目的是有效的区分名字相同的类。包名的目的是有效的区分名字相同的类。4.8.1包语句包语句 通过关键字通过关键字packagepackage声明包语句。声明包语句。packagepackage语语句句作作为为JavaJava源源文文件件的的第第一一条条语语句句,为该源文件中声明的类指定包名。为该源文件中声明的类指定包名。package package语句的一般格式为:语句的一般格式为:package package 包名包名;4.8.2有包名的类的存储目录有包名的类的存储目录 程序如果使用了包语句,例如:程序如果使用了包语句,例如:package package tom.jiafeitom.jiafei;那那么么存存储储文文件件的的目目录录结结构构中中必必须须包包含含有有如如下下的的结结构构 tomtomjiafeijiafei 如:如:c:1000tomjiafei c:1000tomjiafei 并并且且要要将将源源文文件件编编译译得得到到的的类类的的字字节节码码文文件件保保存存在在目目录录c:1000tomjiafei中中(源源文文件件可可以以任任意意存存放)。放)。4.8.3运行有包名的主类运行有包名的主类 如如果果主主类类的的包包名名是是tom.jiafei,那那么么主主类类的的字字节节码码一一定定存存放放在在tomjiefei目目录录中中,运运行行时时必必须须到到tomjiefei的的上上一一层层(即即tom的的父父目目录录)目目录录中中去运行主类。去运行主类。假假设设tomjiefei的的上上一一层层目目录录是是1000,那那么么,必必须如下格式来运行:须如下格式来运行:C:1000java C:1000java tom.jiafeitom.jiafei.主类名主类名 注:主类名是:注:主类名是:“包名包名.主类名主类名”例例4-114-114.9import import 语句语句 一一个个类类可可能能需需要要另另一一个个类类声声明明的的对对象象作作为为自自己己的的成成员员或或方方法法中中的的局局部部变变量量,如如果果这这两两个个类类在同一个包中,当然没有问题。在同一个包中,当然没有问题。如如果果一一个个类类想想要要使使用用的的那那个个类类和和它它不不在在一一个个包中,要使用包中,要使用importimport语句完成使命。语句完成使命。4.9.1引入类库中的类引入类库中的类 如如果果用用户户需需要要类类库库中中的的类类就就必必须须使使用用import语语句,如:句,如:import import java.until.Datejava.until.Date;例例4-124-124.9.2引入自定义包中的类引入自定义包中的类 用用户户程程序序可可以以使使用用tom.jiafei包包中中的的类类,即即使使用用非非类类库库中中有有包包名名的的类类,也也要要使使用用import语语句句,如:如:import import tom.jiafeitom.jiafei.*;.*;例例4-134-13,例例4-144-144.9.3使用无包名的类使用无包名的类 如如果果一一个个类类想想使使用用无无名名包包中中的的类类,只只要要将将这这个个无无包包名名的的类类的的字字节节码码和和当当前前类类保保存存在在同同一一目目录中即可。录中即可。例例4-154-154.9.4避免类名混淆避免类名混淆 1 1区分无包名和有包名的类区分无包名和有包名的类 如如果果想想同同时时使使用用tom.jiafeitom.jiafei包包中中的的A A类类和和无无名名包中的包中的A A类,就不能省略包名,例如:类,就不能省略包名,例如:A a1=new A();A a1=new A();tom.jiafei.Atom.jiafei.A a2=new a2=