第三章对象与类

上传人:Sc****h 文档编号:231386988 上传时间:2023-09-02 格式:PPT 页数:37 大小:304.50KB
收藏 版权申诉 举报 下载
第三章对象与类_第1页
第1页 / 共37页
第三章对象与类_第2页
第2页 / 共37页
第三章对象与类_第3页
第3页 / 共37页
资源描述:

《第三章对象与类》由会员分享,可在线阅读,更多相关《第三章对象与类(37页珍藏版)》请在装配图网上搜索。

1、第三章第三章 对象与类对象与类n3.1 类与对象类与对象n3.2 定义类定义类n3.3 成员变量的作用域成员变量的作用域n3.4 方法重载方法重载 n3.5 创建对象创建对象 n3.6 构造方法构造方法 n3.7 this关键字关键字 n3.8 初始化问题初始化问题 n3.9 static 关键字关键字n3.10 对象的清理对象的清理 n3.11 访问控制修饰符访问控制修饰符n3.12 具体隐藏实现具体隐藏实现 n3.13 参数传递参数传递 n3.14 总结总结 3.1 3.1 定义类定义类n传统程序设计语言的不足 数据和对数据的操作相分离 n面向对象设计的思想n什么是对象 一切都是对象n对象

2、与类的关系 类是对象的模版,对象是类的实例3.2 3.2 定义类定义类 类是组成程序的基本单元,定义了自己的类就是定义了要使用的对象的类型。例:定义一个汽车类:例:定义一个汽车类:class Car int color;int door;int speed;void start()void brake()声明一个汽车类的引用变量:Car myCar;声明类的语法:修饰符 class 类名称 /成员变量 /方法JavaJava基本数据类型基本数据类型Java数据类型包括基本数据类型和引用类型包装器类型把基本数据类型数据“包装”成对象 从 int类型创建一个Integer对象:int myInt;

3、Integer myInteger=new Integer(myInt);从包装对象中取出基本类型值:myInt=myInteger.intValue();JavaJava基本数据类型基本数据类型第一个第一个JavaJava程序程序 程序3.1 Rectangle.javaclass Rectangle int a,b;int getArea()return a*b;void locate(int x,int y)System.out.println(The position s(+x+,+y+);public static void main(String args)Rectangle r1

4、=new Rectangle();r1.locate(3,4);r1.a=2;r1.b=3;int area=r1.getArea();System.out.println(Area of r1 is:+area);第一个第一个JavaJava程序程序nmain方法是程序的入口 n包含main方法的类是Java应用程序的主类 n一个Java源文件可以包含多个类,但同一个Java源文件只有主类可以声明为public nJava源文件的命名必须与主类同名 3.33.3成员变量的作用域成员变量的作用域n在Java中变量的作用域是由大括号组成的程序块决定n在不嵌套的程序块中可以多次声明相同变量 n在嵌

5、套的程序块中不允许重复声明同名的变量n声明在方法中的变量为局部变量,与实例变量重名的局部变量会覆盖实例变量,其作用域为整个方法体。见程序3.2 TestScoping.java作用域举例作用域举例int x=1;int y=2/xy可用 /x可用y超出作用域合法的声明:int x=1;int x=2;不合法的嵌套声明:int x=1;int x=2;3.43.4方法重载方法重载方法重载(Overload)是指一个类中可以定义参数列表不同但名字相同的多个方法,调用时,会根据不同的参数列表来选择对应的方法。n重载的方法名字必须相同n重载的方法参数必须不同当一个重载方法被调用时,Java 用参数的类

6、型和(或)数量来表明实际调用的重载方法的版本。每个重载方法的参数的类型和(或)数量必须是不同的。虽然每个重载方法可以有不同的返回 类型,但返回类型并不足以区分所使用的是哪个方法。当Java 调用一个重载方法时,参数与调用参数匹配的方法被执行。见程序3.3 TestOverload.java 程序3.4 TestOverload1.java被重载的方法必须有不同的参数列表,前面例子区分重载方法的参数采用了或者数量不同,或者类型不同,参数顺序不同虽然也可以重载,但是容易产生歧义。例:程序3.5 TestOverload2.javapublic class TestOverload2 void pr

7、int(int a,float b)System.out.println(Print int a and float b:+a+b);void print(float a,int b)System.out.println(Print float a and int b:+a+b);public static void main(String args)TestOverload2 obj=new TestOverload2();obj.print(1,2);3.53.5创建对象创建对象n先声名引用变量 Rectangle r1;然后创建对象赋值给r1:r1=new rectangle();n声明

8、引用变量的同时产生一个对象赋给它:Rectangle r1=new Rectangle();引用变量r1“代表”了一个矩形对象,我们就可以使用引用变量加句点形式访问对象的成员了 在Java中基本类型变量存储在栈的内存结构中 int x=10;boolean y=true;引用型变量内储存着对象实例的地址声明两个矩形类引用变量r1、r2:Rectangle r1,r2;r1、r2没有指向任何对象实例,系统默认赋初值null 产生一个新对象实例并赋值给r1:r1=new rectangle();r2=r1;n在java中字符串类型数据是按照对象来处理的 n两种方式 显式和隐式创建nJava为了加快

9、程序的执行速度,把隐式创建的字符串对象放在栈中一个特殊区域字符串池(String Pool)中,相同内容的字符串对象只保留一份。String str1=new String(“Hello java!”);String str2=”Hello Java!”程序3.6 TestString.javapublic class TestString public static void main(String args)String str1=new String(Hello Java!);String str2=str1;String str3=Hello Java!;String str4=Hel

10、lo Java!;System.out.println(str1=str2);System.out.println(str1=str3);System.out.println(str3=str4);输出结果:truefalsetrue3.63.6构造方法构造方法n构造方法是创建对象时调用的特殊方法n方法名必须与要创建对象的类名相同n不允许声明返回类型,即使声明为void也是不正确的n如果类中并没有定义构造方法,Java会自动地给你添加一个无参的缺省构造方法 n可以自定义重载的多个构造方法,在创建对象时使实例多样化。(重载)例:程序3.7 Student.java 3.7 this3.7 thi

11、s关键字关键字public Student(int age)System.out.println(Invoke constructor with age.);age=age;以上构造方法中出现age=age的奇怪语句,this关键字用来解决这个问题。this引用指向的是其本身所在方法的当前对象。以上构造方法若采用this关键字则修改为:public Student(int age)System.out.println(Invoke constructor with age.);this.age=age;this.age=age意指把参数age的值赋给类成员变量age。3.83.8初始化问题初始

12、化问题n如果程序员使用了缺省的构造方法并且没有在类中初始化成员变量,创建对象时系统会对各种类型的成员变量按表3.3自动进行初始化赋予一个默认值。用构造方法完成初始化用构造方法完成初始化n可以使用自定义的构造方法在方法体内初始化成员n可以在构造方法中使用this()调用其它构造方法以减少代码冗余n构造方法内this必须在第一行n只能调用一次this()不允许调用两次nthis()只能在构造器中使用,其他成员方法不得调用。classStudentintage;Stringname;publicStudent()System.out.println(Creatingdefaultstudent.);

13、System.out.println(Defaultage=+age);System.out.println(Defaultname=+name);publicStudent(inta,Stringn)this(a);/必须在第一句 name=n;System.out.println(Initializestudentwithnameandage.);publicStudent(intage)this.age=age;System.out.println(Initializestudentwithage.);publicStudent(Stringname)this.name=name;Sys

14、tem.out.println(Initializestudentwithname.);publicclassTestThispublicstaticvoidmain(Stringargs)Studentst1=newStudent();newStudent(24,Jacky);程序3.8TestThis.java3.9 static 3.9 static 关键字关键字n声明为static的成员方法和变量在内存中固定只存在一份,也就是说所有类都可以共享使用的 n声明为静态的成员变量和成员方法在类内部可以直接使用,在类外部可以通过类名加句点的方式直接访问,而不必实例化再使用 n静态方法内部不能调

15、用非静态方法,因为静态方法本身是不会实例化的;this在静态方法中没有意义3.10 3.10 对象的清理对象的清理nC语言和c+是通过程序员自己定义对象的生命周期,你必须在适当的时候自己写程序清除不再使用的对象空间 nJava将释放无用内存空间的任务交给了Java虚拟机,通过垃圾回收器来回收无用对象的内存空间n程序员无需强制垃圾回收器立即执行进行清除工作,只有当内存资源不够用时垃圾回收器才开始真正回收空间,所以整个程序过程中垃圾回收器可能不需要工作。什么样的对象将被垃圾回收什么样的对象将被垃圾回收?classStudentintage;Stringname;publicStudent(Stri

16、ngn)name=n;publicstaticvoidp()Studentst1=newStudent(Peter);Studentst2=newStudent(Julie);st1=st2;st2=null;publicclassTestGcpublicstaticvoidmain(Stringargs)Student.p();程序3.9TestGc.java静态方法p中首先创建了两个学生Peter和Julie,然后引用st1指向st2,这时st1和st2同时指向Julie,对象Peter没有引用变量引用,所以处于待回收状态,st2赋空值后仍然有st1指向Julie所以Julie这时还不是垃

17、圾,当方法p()执行完成返回main方法时,局部变量st1和st2超出作用域,结束生命。内存堆中的Peter和Julie都变成了垃圾,处于待回收状态。处于待回收状态只是告诉虚拟机哪些对象是垃圾,并不不知道垃圾回收器什么时候回收他们。当内存资源紧张时,垃圾回收器会及时工作清理这些垃圾。finalizefinalize()()在某些情况下回收垃圾对象时需要结束与这个对象相关的一些工作,比如说某个对象打开了一个文件,那么清除这个对象时就需要关闭这个文件,否则这个文件在垃圾对象被回收以后就无法再编辑和关闭了finalize方法可以完成这些工作。finalize方法在垃圾回收发生之前调用,用来验证回收条

18、件是否成熟,比如你的对象可能还与其他对象联系在一起,这时在finalize方法中设定条件,阻止垃圾回收,使垃圾对象“复活”。3.113.11访问控制修饰符访问控制修饰符 类成员修饰符npublic 指定类成员为public时,该类成员在任何类中都可以通过一个该类对象的引用来进行访问,当然该类内部可直接访问。nprivate即声明说这是私有的,指定成员变量或方法为private时,该类成员变为此类的“私有财产”,只能在该类中访问。ndefualt即缺省,修饰符为隐含的package,可以在该类中访问,也能够在同一包中的类访问。但在不同包中即使是其子类也无法访问。nprotected 说明该成员是

19、受保护的,可以在该类中访问。同时同一包中的类也可以对其进行访问,不同包的子类也可以进行访问。类修饰符:public、default n指定为public时,可以通过import指令对该类进行复用。如果缺省则是隐含的package访问修饰语,这时只有在相同包里的类才能调用该类。3.123.12具体隐藏实现具体隐藏实现 具体隐藏实现是面向对象设计中一个非常重要的概念,通过使用访问控制修饰符,把类中的无须公开的数据与方法封装起来,对外隐藏了类功能的具体实现过程。改变类的功能时不会影响类的使用者,并且提高了程序的安全性与可维护性。通过添加访问器和修改器修改Rectangle类 classRectang

20、leprivateinta,b;publicintgetArea()returna*b;publicintsetAB(inta,intb)if(a=0|b=0)System.out.println(“Erroinput!”);this.a=a;this.b=b;3.133.13参数传递参数传递nJava的参数传递都是值传递nJava参数传递分为基本类型参数传递与对象类型(即引用类型)参数传递。n基本类型参数值传递意味着当将一个实参值传递给一个方法时,如果方法修改了该参数,改变的是形参,而原始的实参的值保持不变。n引用类型变量传递将一个参数传递给一个方法后,方法接收的是一个引用变量的值,这个值某

21、个对象的内存地址值。引用变量的参数传递仍然是值传递。程序3.10TestPass.javaclassStudentintage;Stringname;publicStudent(inta,Stringn)age=a;name=n;publicclassTestPasspublicstaticvoidchangeAge(intfromAge,inttoAge)fromAge=toAge;System.out.println(AfterinvokemethodchangeAgefromAgeis:+toAge);publicstaticvoidchangeObjAge(Studentst,intt

22、oAge)st.age=toAge;publicstaticvoidmain(Stringargs)Studentst1=newStudent(19,Jacky);changeAge(st1.age,20);System.out.println(AfterinvokemethodchangeAgestudentageis:+st1.age);changeObjAge(st1,20);System.out.println(AfterinvokemethodchangeObjAgestudentageis:+st1.age);nchangeObjAge方法通过接受引用变量参数改变了对象的成员值,如

23、果你从此就认为传递了引用变量参数就可以改变对象就大错特错了。以修改后的程序3.10 TestPass1.java为例 n方法调用完毕st完成使命从内存中释放,而原来的st1仍然指向“Jacky”,“Julie”没有引用变量再引用它成为垃圾,等待垃圾回收器清除。整个过程“Jacky”没有发生改变。n由此可知,Java的参数传递都是值传递,只要理解了这一点并掌握了内存的变化过程,这样的错误很容易避免。4.8 4.8 总结总结n面向对象设计是一种更接近人类自然思维的程序设计方法,最重要的就是通过类的定义与使用,类的封装等特性提高程序的复用性。n类是封装了相同属性与行为的一类对象的模版,对象就是类的实

24、例,使用new关键字加构造方法的方式创建对象,然后通过引用变量名加点(.)运算符来访问对象成员。n 实例成员变量是属于类的一个对象实例的变量,要使用它必须通过创建类的对象实例然后用引用变量访问它。n 类属成员变量和方法,即静态成员,用static关键字声明,静态变量和静态方法不依赖于具体实例,可以通过类名直接访问。n修饰符指定类、方法和数据的访问方式。public表示任何用户都具有访问权限。Private表示方法和数据成员只能在类内部访问。n方法的所有参数传递都是值传递。对于基本类型的参数传递实际值,对于引用类型的参数传递对象的引用。n具体隐藏实现是通过设定修改器与访问器方法把类中的数据封装起来,通过这些方法访问类的数据提高了安全性。nThis是指向类的当前实例的引用,关键字this也能在构造方法中使用,this()调用同一个类的另一个构造方法。n创建的对象存储在对内存中,这是一种灵活的存储机制,你不必自己定义对象的生命周期,在合适的时候垃圾回收器会对垃圾对象进行清理以释放内存空间。

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!