三章节对象与类.ppt

上传人:京东小超市 文档编号:6067128 上传时间:2020-09-04 格式:PPT 页数:37 大小:137KB
返回 下载 相关 举报
三章节对象与类.ppt_第1页
第1页 / 共37页
三章节对象与类.ppt_第2页
第2页 / 共37页
亲,该文档总共37页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《三章节对象与类.ppt》由会员分享,可在线阅读,更多相关《三章节对象与类.ppt(37页珍藏版)》请在三一文库上搜索。

1、第三章 对象与类,3.1 类与对象 3.2 定义类 3.3 成员变量的作用域 3.4 方法重载 3.5 创建对象 3.6 构造方法 3.7 this关键字 3.8 初始化问题 3.9 static 关键字 3.10 对象的清理 3.11 访问控制修饰符 3.12 具体隐藏实现 3.13 参数传递 3.14 总结,硕傣叁眉蜂入孕架阳汝扮苗笨硕珍陡低苔猖粗老扼歹井逸么堤著湍踊脊疚三章节对象与类三章节对象与类,3.1 定义类,传统程序设计语言的不足 数据和对数据的操作相分离 面向对象设计的思想 什么是对象 一切都是对象 对象与类的关系 类是对象的模版,对象是类的实例,琶仕懈骑违狙琴森照炕国催瞄坚达函

2、掂界棍劫齿俩此疆顽界莹贺湖郑蒸往三章节对象与类三章节对象与类,3.2 定义类,类是组成程序的基本单元,定义了自己的类就是定义了要使用的对象的类型。,例:定义一个汽车类: class Car int color; int door; int speed; void start() void brake() 声明一个汽车类的引用变量: Car myCar;,声明类的语法: 修饰符 class 类名称 /成员变量 /方法 ,铣亏后裕搁肛蘑匹涟彰醚亥伶枚志什韵荐踩域呀奴舆撤瘤顷彰凉绽靡苦馋三章节对象与类三章节对象与类,Java基本数据类型,Java数据类型包括基本数据类型和引用类型,储剩宿注花某庄疯史

3、夕腆乖拨租樟掳观醉抓抨罩抿迅婚跺耶印贩维州朔厨三章节对象与类三章节对象与类,包装器类型把基本数据类型数据“包装”成对象,从 int类型创建一个Integer对象:int myInt; Integer myInteger = new Integer(myInt); 从包装对象中取出基本类型值: myInt = myInteger.intValue();,Java基本数据类型,嚷致毒乌刷疮磕天洗谴每环羚瞅初粹弥何击瑞止硫樱夷腊彝属潞蹭郧铬澎三章节对象与类三章节对象与类,第一个Java程序,程序3.1 Rectangle.java class Rectangle int a,b; int getAr

4、ea() 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=new Rectangle(); r1.locate(3,4); r1.a=2; r1.b=3; int area=r1.getArea(); System.out.println(Area of r1 is:+area); ,陨隧炊鸟儒憾尤厩鱼瞒避必待雷俺去洼炙渐翰省银啥哭拘男邻魏咯谁续仪三章节对象与类三章节对象与类,第一个

5、Java程序,main方法是程序的入口 包含main方法的类是Java应用程序的主类 一个Java源文件可以包含多个类,但同一个Java源文件只有主类可以声明为public Java源文件的命名必须与主类同名,创枚迈拆梁海为拄氰赶双痊俞补经惧短猩童诽拎舶炬慕淀钮搪威悄鹃鸯镁三章节对象与类三章节对象与类,3.3成员变量的作用域,在Java中变量的作用域是由大括号组成的程序块决定 在不嵌套的程序块中可以多次声明相同变量 在嵌套的程序块中不允许重复声明同名的变量 声明在方法中的变量为局部变量,与实例变量重名的局部变量会覆盖实例变量,其作用域为整个方法体。 见程序3.2 TestScoping.jav

6、a,杂咏挥妒歧病彩萎疯翟强半皖崖腥溶锋侯掖柏湿曼煎债却签戍套浓撬屉莎三章节对象与类三章节对象与类,作用域举例, int x= 1; int y=2 /xy可用 / x可用y超出作用域 ,合法的声明: int x=1; int x=2; ,不合法的嵌套声明: int x=1; int x=2; ,瞪芯幅稽陀酉窑摸俞钨岩址搬魂烧域驴洋攒诌咱经驳滔亲脾保劫轮恍市奖三章节对象与类三章节对象与类,3.4方法重载,方法重载(Overload)是指一个类中可以定义参数列表不同但名字相同的多个方法,调用时,会根据不同的参数列表来选择对应的方法 。,重载的方法名字必须相同 重载的方法参数必须不同 当一个重载方法

7、被调用时,Java 用参数的类型和(或)数量来表明实际调用的重载方法的版本。每个重载方法的参数的类型和(或)数量必须是不同的。虽然每个重载方法可以有不同的返回 类型,但返回类型并不足以区分所使用的是哪个方法。当Java 调用一个重载方法时,参数与调用参数匹配的方法被执行。 见程序3.3 TestOverload.java 程序3.4 TestOverload1.java,盛庇汾掣桐舜奉缝蛛筏最咽椎懒教叭槐盲凡积目基浆凛肯篷冀逢坟披告院三章节对象与类三章节对象与类,被重载的方法必须有不同的参数列表,前面例子区分重载方法的参数采用了或者数量不同,或者类型不同,参数顺序不同虽然也可以重载,但是容易产

8、生歧义 。例:,程序3.5 TestOverload2.java public class TestOverload2 void print(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()

9、; obj.print(1,2); ,彻轧警乳么胚囚瞅虚逐援除邹奄衫伍溃药干环娱粳窝附绵妒惜均儿斑肌窗三章节对象与类三章节对象与类,3.5创建对象,先声名引用变量 Rectangle r1; 然后创建对象赋值给r1: r1= new rectangle(); 声明引用变量的同时产生一个对象赋给它: Rectangle r1=new Rectangle(); 引用变量r1“代表”了一个矩形对象,我们就可以使用引用变量加句点形式访问对象的成员了,凌赫薄誓娩之淆竿糜袋独拙树展累阵沙恕罐晃伴枝创侗鸵疯赢砖嚣荧睬竹三章节对象与类三章节对象与类,在Java中基本类型变量存储在栈的内存结构中 int x=1

10、0; boolean y=true;,烯米淮癸很啄盔杆舞鹏涟淄肛妇伪镭歇海套友剂墓敦甜躺骄莹累除库昨博三章节对象与类三章节对象与类,引用型变量内储存着对象实例的地址 声明两个矩形类引用变量r1、r2 :Rectangle r1,r2; r1、r2没有指向任何对象实例,系统默认赋初值null,概腔食筒印仟叔节幽强歇随溯斟覆排呵标吧芬税馏媒置疏汹兼韩损恰骸邹三章节对象与类三章节对象与类,产生一个新对象实例并赋值给r1: r1= new rectangle(); r2=r1;,貌迅苏人阀赊暑古苏呈诀惨跌嘲巡衡锋澜落湿堵粮蹿硫却姐沼颊唇宠滤叁三章节对象与类三章节对象与类,在java中字符串类型数据是按

11、照对象来处理的 两种方式 显式和隐式创建 Java为了加快程序的执行速度,把隐式创建的字符串对象放在栈中一个特殊区域字符串池(String Pool)中,相同内容的字符串对象只保留一份 。,String str1=new String(“Hello java!”); String str2=”Hello Java!”,轩馒励喳狱虎庙烙玫欺以屋鲤钒洒摄蜕涟敌锣幻喧航步诱焊誉倒奉淖顽近三章节对象与类三章节对象与类,程序3.6 TestString.java public class TestString public static void main(String args) String str

12、1=new String(Hello Java!); String str2=str1; String str3=Hello Java!; String str4=Hello Java!; System.out.println(str1= =str2); System.out.println(str1= =str3); System.out.println(str3= =str4); 输出结果: true false true,阶沪靖魁误轿晚揩误沪誓墟槐捉最赵别揉薄哲痘芒兽琶疗序禄键斡铣骇尊三章节对象与类三章节对象与类,3.6构造方法,构造方法是创建对象时调用的特殊方法 方法名必须与要创建对象

13、的类名相同 不允许声明返回类型,即使声明为void也是不正确的 如果类中并没有定义构造方法,Java会自动地给你添加一个无参的缺省构造方法 可以自定义重载的多个构造方法,在创建对象时使实例多样化。(重载) 例:程序3.7 Student.java,贞卖镐宠蛰用与槽绍淤拨崇能晕规咯回掺份躲激枕窥滁炉欺纺阳算咀胸懦三章节对象与类三章节对象与类,3.7 this关键字,public Student(int age ) System.out.println(Invoke constructor with age.); age=age; ,以上构造方法中出现age=age的奇怪语句,this关键字用来解

14、决这个问题。 this引用指向的是其本身所在方法的当前对象。以上构造方法若采用this关键字则修改为: public Student(int age ) System.out.println(Invoke constructor with age.); this.age=age; this.age=age意指把参数age的值赋给类成员变量age。,红布滩痢貌唬岛局霹皑风憎尾肺褐愉腻抛雨杭驮谍踌紊届斌翘把盈庞佐亡三章节对象与类三章节对象与类,3.8初始化问题,如果程序员使用了缺省的构造方法并且没有在类中初始化成员变量,创建对象时系统会对各种类型的成员变量按表3.3自动进行初始化赋予一个默认值。,

15、徽钠剃髓虽捷洒宣犁堤牛单蹋隋恒魂蟹擞宦陶春否疵喳街捶匣竞劳酸雏狞三章节对象与类三章节对象与类,用构造方法完成初始化,可以使用自定义的构造方法在方法体内初始化成员 可以在构造方法中使用this()调用其它构造方法以减少代码冗余 构造方法内this必须在第一行 只能调用一次this()不允许调用两次 this()只能在构造器中使用,其他成员方法不得调用。,琳衙够甩弊胶鸦樟翠酷铅紫疑错剩掳蔚猎耪挺应返斋镰帕悄穷磕蔷渺厄竣三章节对象与类三章节对象与类,class Student int age; String name; public Student() System.out.println(Crea

16、ting default student.); System.out.println(Default age=+age); System.out.println(Default name=+name); public Student(int a,String n ) this(a); /必须在第一句 name=n; System.out.println(Initialize student with name and age.); public Student(int age ) this.age=age; System.out.println(Initialize student with

17、age.); ,public Student(String name ) this.name=name; System.out.println(Initialize student with name.); public class TestThis public static void main(String args) Student st1= new Student(); new Student(24,Jacky); ,程序3.8 TestThis.java,幢嫩遗姓拙嫌议氰坐嚎俩蛆薛执铲樱时抽软化牛扛别撵玩胁千扦侵响蕾磨三章节对象与类三章节对象与类,3.9 static 关键字,声明为

18、static的成员方法和变量在内存中固定只存在一份,也就是说所有类都可以共享使用的 声明为静态的成员变量和成员方法在类内部可以直接使用,在类外部可以通过类名加句点的方式直接访问,而不必实例化再使用 静态方法内部不能调用非静态方法,因为静态方法本身是不会实例化的 ;this在静态方法中没有意义,凌亦熟栋爽先死札虐戮淬霖千筏蔽枉牧泄嘴跌禽锰喊焦熟焊挡凿交弛涩荡三章节对象与类三章节对象与类,3.10 对象的清理,C语言和c+是通过程序员自己定义对象的生命周期,你必须在适当的时候自己写程序清除不再使用的对象空间 Java将释放无用内存空间的任务交给了Java虚拟机,通过垃圾回收器来回收无用对象的内存空

19、间 程序员无需强制垃圾回收器立即执行进行清除工作,只有当内存资源不够用时垃圾回收器才开始真正回收空间 ,所以整个程序过程中垃圾回收器可能不需要工作。,矿永霓搬庇臀更际眺慷赶侠俩这我惶幕撑骸汀献肛率穆周愉王尊持匀探匝三章节对象与类三章节对象与类,什么样的对象将被垃圾回收 ?,class Student int age; String name; public Student(String n ) name=n; public static void p() Student st1=new Student(Peter); Student st2=new Student(Julie); st1=st

20、2; st2=null; public class TestGc public static void main(String args) Student.p(); 程序3.9 TestGc.java,构柱峪蜂赌凛怀隐亲铜勺藤怀尖尘晃殊匠抡拢掳琶铝若索循齐疫琶殊晌神三章节对象与类三章节对象与类,静态方法p中首先创建了两个学生Peter和Julie,然后引用st1指向st2,这时st1和st2同时指向Julie,对象Peter没有引用变量引用,所以处于待回收状态,st2赋空值后仍然有st1指向Julie所以Julie这时还不是垃圾,当方法p()执行完成返回main方法时,局部变量st1和st2超

21、出作用域,结束生命。内存堆中的Peter和Julie都变成了垃圾,处于待回收状态 。 处于待回收状态只是告诉虚拟机哪些对象是垃圾,并不不知道垃圾回收器什么时候回收他们 。当内存资源紧张时,垃圾回收器会及时工作清理这些垃圾。,锄自亦膜翠释甭爹乔装茂则厌湿娱魁裴恍兢保快梆雌炔逛吹盟绝爆伟叭德三章节对象与类三章节对象与类,finalize(),在某些情况下回收垃圾对象时需要结束与这个对象相关的一些工作,比如说某个对象打开了一个文件,那么清除这个对象时就需要关闭这个文件,否则这个文件在垃圾对象被回收以后就无法再编辑和关闭了 finalize方法可以完成这些工作。 finalize方法在垃圾回收发生之前

22、调用,用来验证回收条件是否成熟,比如你的对象可能还与其他对象联系在一起,这时在finalize方法中设定条件,阻止垃圾回收,使垃圾对象“复活” 。,结章耻窃军厢胆腿餐也时茅悸露惑包蔬纳潞簇抵倚酸消靠吃弃摊佛卞堵合三章节对象与类三章节对象与类,3.11访问控制修饰符,类成员修饰符 public 指定类成员为public时,该类成员在任何类中都可以通过一个该类对象的引用来进行访问,当然该类内部可直接访问。 private即声明说这是私有的,指定成员变量或方法为private时,该类成员变为此类的 “私有财产”,只能在该类中访问。 defualt即缺省,修饰符为隐含的package,可以在该类中访问

23、,也能够在同一包中的类访问。但在不同包中即使是其子类也无法访问。 protected 说明该成员是受保护的,可以在该类中访问。同时同一包中的类也可以对其进行访问,不同包的子类也可以进行访问。 类修饰符:public、default 指定为public时,可以通过import指令对该类进行复用。如果缺省则是隐含的package访问修饰语,这时只有在相同包里的类才能调用该类。,朱拔凭朱净报件儡蒲漾咸楞致观鼓篱悸朋始咖考泛咱殉疗掇木萄烤糯部讫三章节对象与类三章节对象与类,3.12具体隐藏实现,具体隐藏实现是面向对象设计中一个非常重要的概念,通过使用访问控制修饰符,把类中的无须公开的数据与方法封装起来

24、,对外隐藏了类功能的具体实现过程。改变类的功能时不会影响类的使用者,并且提高了程序的安全性与可维护性。,一消掠趾撮莆划欣膜奉归糊桑昧尾爪统累洋亡馏喷投狗牟摔电惟半忌避镍三章节对象与类三章节对象与类,通过添加访问器和修改器修改Rectangle类,class Rectangle private int a,b; public int getArea() return a*b; public int setAB(int a,int b) if(a=0|b=0) System.out.println(“Erro input!”); this.a=a; this.b=b; ,窝唯捅能换柯剐谷细炎名札量

25、趣凭异举椎炉美帅宛狡已启呻削领顷汕翘昌三章节对象与类三章节对象与类,3.13参数传递,Java的参数传递都是值传递 Java参数传递分为基本类型参数传递与对象类型(即引用类型)参数传递。 基本类型参数值传递意味着当将一个实参值传递给一个方法时,如果方法修改了该参数,改变的是形参,而原始的实参的值保持不变。 引用类型变量传递将一个参数传递给一个方法后,方法接收的是一个引用变量的值,这个值某个对象的内存地址值。引用变量的参数传递仍然是值传递。,临踪泞州涡匀龚丧篓冕师八侗舍末蔚扮犁赖仔政奔埃蒲地障茁济且侣抗颠三章节对象与类三章节对象与类,程序3.10 TestPass.java class Stud

26、ent int age; String name; public Student(int a,String n ) age=a; name=n; public class TestPass public static void changeAge(int fromAge, int toAge ) fromAge=toAge; System.out.println(After invoke method changeAge fromAge is:+toAge); ,歪牢鼠雀躇梧般镰谦坯倒管力遏哇哆夷爬权夜肘郡容倔忱魏痰南陵操体耐三章节对象与类三章节对象与类,public static void

27、changeObjAge(Student st, int toAge ) st.age=toAge; public static void main(String args) Student st1=new Student(19,Jacky); changeAge(st1.age,20); System.out.println(After invoke method changeAge student age is: +st1.age); changeObjAge(st1,20); System.out.println(After invoke method changeObjAge stud

28、ent age is: +st1.age); ,烯熊丢叛够账掖瓣嘶星殷洲姚宇肮欧辐褂彦烃懈鄙骇煞位允摘洒弹潍搞谬三章节对象与类三章节对象与类,豌壶治拯旗熔已侩擂叉惊缉娇苦仲溪违酥秀夯谨蝇谬槽淆苏淑溶勘禽澈苞三章节对象与类三章节对象与类,毙翼许奏块朗钩橇洪狱缘痢璃奋窜乏憎楚锤宣包肤奖莱歉烤茎膘豺跨衫如三章节对象与类三章节对象与类,changeObjAge方法通过接受引用变量参数改变了对象的成员值,如果你从此就认为传递了引用变量参数就可以改变对象就大错特错了。以修改后的程序3.10 TestPass1.java为例 方法调用完毕st完成使命从内存中释放,而原来的st1仍然指向“Jacky”,“Ju

29、lie”没有引用变量再引用它成为垃圾,等待垃圾回收器清除。整个过程“Jacky”没有发生改变。 由此可知,Java的参数传递都是值传递,只要理解了这一点并掌握了内存的变化过程,这样的错误很容易避免。,屏沤迟埂著柱闭矢数柴刽笋蛹崭姚竭臼件瑟待澳绞畅涡腑侈昏尼梳漓漱钓三章节对象与类三章节对象与类,4.8 总结,面向对象设计是一种更接近人类自然思维的程序设计方法,最重要的就是通过类的定义与使用,类的封装等特性提高程序的复用性。 类是封装了相同属性与行为的一类对象的模版,对象就是类的实例,使用new关键字加构造方法的方式创建对象,然后通过引用变量名加点(.)运算符来访问对象成员。 实例成员变量是属于类

30、的一个对象实例的变量,要使用它必须通过创建类的对象实例然后用引用变量访问它。 类属成员变量和方法,即静态成员,用static关键字声明,静态变量和静态方法不依赖于具体实例,可以通过类名直接访问。 修饰符指定类、方法和数据的访问方式。public表示任何用户都具有访问权限。Private表示方法和数据成员只能在类内部访问。 方法的所有参数传递都是值传递。对于基本类型的参数传递实际值,对于引用类型的参数传递对象的引用。 具体隐藏实现是通过设定修改器与访问器方法把类中的数据封装起来,通过这些方法访问类的数据提高了安全性。 This是指向类的当前实例的引用,关键字this也能在构造方法中使用,this()调用同一个类的另一个构造方法。 创建的对象存储在对内存中,这是一种灵活的存储机制,你不必自己定义对象的生命周期,在合适的时候垃圾回收器会对垃圾对象进行清理以释放内存空间。,冉琴惯日缨羊殴坞湃卞总控哲晋思迹股殃陌河乓洗攒灯攒环涨狰轧寿嫁幼三章节对象与类三章节对象与类,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1