Java编程基础——面向对象基础东软IT人才实训中心Copyright2008ByNeusoftGroup.Allrightsreserved第六章面向对象基础目标:面向对象编程的基本思想,理解什么是类,什么是对象,什么是构造方法,对象在内存中的表现形式及如何使用对象等。介绍Java的垃圾回收机制。3Sept.2008Confidential学时:2.5学时教学方法:讲授ppt+上机练习本章要点·····类和对象的关系构造器的特征和作用对象创建的内存模型访问权限修饰符简介this关键字3Sept.2008Confidential面向对象编程思想···面向对象编程(Object-OrientedProgramming,OOP)–从20世纪90年代开始流行,成为主流的编程方法论–优点:大幅度提高项目的成功率,降低后期的维护成本,提高软件的可靠性和可伸缩性对比:面向过程与面向对象–面向过程编程考虑流程,需要了解程序运行的每一个步骤,运行的先后顺序,然后设计代码。–面向对象编程考虑系统由哪些不同类型的对象构成,让对象间互相通信、传递消息来完成系统功能。当然,也要考虑系统的流程,不过这些流程存在于不同的类中。实际上面向对象就是人类认识客观世界的方式。3Sept.2008Confidential类··什么是类–蓝图–是面向对象的核心,描述了对象的特征任何对象的特征都可以分成两个方面–实例变量:描述对象包含的数据特征–函数:描述对象表现的行为特征3Sept.2008Confidential类的定义·类的格式:修饰符class类名{{}}类的成员;···修饰符一般为public,也可以没有修饰符。注意类名的命名规范。类的成员:–变量成员(实例变量)–函数成员(函数)3Sept.2008Confidential类的举例Car.java0102030405publicclassCar{Stringcolor;intdoorNumber;doubletopSpeed;06070809101112}}public}}public}}public}}voidspeedUp(){voidspeedDown(){voidbrake(){3Sept.2008Confidential类的举例Person.java01020304050607publicclassPerson{Stringname;intage;doubleheight;publicvoidsayHello(){System.out.println(Hello);0809}}}}//没有main函数一个人力资源系统必定要有经理、员工等对象。分析这些对象有相同的特征,包含的数据特征(属性)有名字、年龄、身高等,包含的行为特征(方法)有说话等。用Java代码表示为Person类。经过分析得到类的过程,称为抽象。编写代码时应尽量将属性写在类的顶端,把方法写在底端。3Sept.2008Confidential创建对象····类是静态存在的,而程序运行依靠的是对象–类是抽象的概念,对象是具体的体现–类只是规定了将来要产生出来的对象应该具备哪些属性和方法,就像一个模板要利用类创建出对象,使用对象的属性和方法让程序运行。如:利用图纸生产汽车,图纸是类,汽车是对象再如:“人类”只是一个概念,它不具体表示哪个人,而是所有人的总称。名字、年龄等属性对于“人类”来说没有具体的值,而这些属性对于人类的具体对象——张三,就可以拥有具体的值。3Sept.2008Confidential创建对象·创建Person类的一个对象p类名对象名Personp=newPerson();与类同名·再创建Person类对象q内存分配操作符Personq=newPerson();p和q都是Person类的对象,我们称为Person类的“实例”。由类生成实例的过程,称为“实例化”。3Sept.2008Confidential创建对象举例PersonCreate.java01020304publicclassTest{publicstaticvoidmain(String[]args){Personp=newPerson();p.name=zhangsan;05060708091011121314}}}}p.age=33;p.height=1.73;p.sayHello();Personq=newPerson();q.name=lisi;q.age=44;q.height=1.74;q.sayHello();由类产生的对象必定拥有类中定义的属性和方法3Sept.2008Confidential构造器Constructor··类中特殊的方法(也叫构造方法、构造函数)–一般情况权限为public;–没有返回值类型,不要写void;–方法名称与类名完全一致;–作用:完成对象的创建,即完成对象的实例化;–不能直接调用,只能由内存分配操作符(new)来调用。所有的对象都是通过构造器来创建的,也可以说任何对象都是通过内存分配操作符new创建和开辟内存空间的3Sept.2008Confidential构造器举例01publicclassPerson{02Stringname;03intage;04doubleheight;0506publicPerson(Stringn,inta,doubleh){{07name=n;08age=a;09height=h;10}1112publicvoidsayHello(){13System.out.println(Hello,mynameis+name);14}15}3Sept.2008Confidential默认构造器···默认的空构造器–如果在编译时编译器发现某个类没有构造器,编译器会自动给类增加空构造器,无参无代码;如果我们创建了带参数的构造器,建议增加空构造器Person3.java3Sept.2008Confidential构造器重载Person2.java可以根据各种情况来考虑使用不同的构造器;01020304050607080910111213publicclassPerson{Stringname;intage;doubleheight;publicPerson(){}}publicPerson(Stringn,inta,doubleh){name=n;age=a;height=h;}}}}3Sept.2008Confidential对象创建的内存模型····Java中主要有三种类型的变量:–局部变量:定义在方法体中的变量,方法的形参–实例变量:类的属性–静态变量:类中声明为static的属性Java虚拟机的内存–栈stack:保存基本数据类型的局部变量和对象的引用值–堆heap:实例变量、数组的元素创建一个对象,同时操作栈内存和堆内存MemStack.java3Sept.2008Confidential对象创建的内存模型(续)Personp=newPerson(“lisi”,44,1.74);Personp0x80000x8000“lisi”441.74nameageheight一旦引用出栈释放,没有任何引用指向该对象,对象就变成垃圾失效了。3Sept.2008Confidential对象创建的内存模型(续)PersonPersonMemHeap.javappqq====newnewPerson(“zhang”,33,1.73);Person(“lisi”,44,1.74);0x3000“lisi”name441.74ageheight0x8000……“zhang”33nameagePersonqPersonp0x30000x80001.73height3Sept.2008Confidential对象创建的内存模型(续)PersonPersonppqq====newnewPerson(“zhang”,33,1.73);Person(“lisi”,44,1.74);Persons=p;0x30000x8000“lisi”441.74……nameageheightPersonsPersonqPersonp0x80000x30000x8000“zhang”331.73nameageheight3Sept.2008Confidential对象创建的内存模型(续)PersonPersonppqq====newnewPerson(“zhang”,33,1.73);Person(“lisi”,44,1.74);Persons=p;p=null;思考:如果s也赋值为null,会有什么情况发生?0x30000x8000“lisi”441.74……nameageheightPersonsPersonqPersonp0x80000x3000null“zhang”331.73nameageheight3Sept.2008Confidential访问对象···在其它类中或main方法中,访问一个对象的属性或者方法,必须先实例化类,然后通过对象名和点操作符完成:–对象名.属性名–对象名.方法名()在类内的方法中,可以直接访问本类的属性和方法注意:以上说法有局限,是针对非静态成员来说的。3Sept.2008Confidential“”匿名对象(了解)··匿名对象:–没有对象名,对它的使用是一次性的,使用完毕马上变成垃圾如:publicclassAnonymity{publicstaticvoidmain(String[]args){newPerson(“zhangsan”,33,1.83).sayHello();}}}}3Sept.2008Confidential练习··设计一个类,描述矩形(要求:使用构造器给属性传值)–width–height包含一个drawRect()方法,在屏幕上使用“#”画出空心矩形########################RectangleExercise.java3Sept.2008Confidential访问权限修饰符简介····publicprotectedfriendlyprivatepublic权限–最大的权限,没有任何限制private权限–最小的权限,只限类内部访问AccessModifiers.java3Sept.2008Confidentialthis关键字···代表对象自身的引用–一个引用–指向调用该方法的当前对象形参名与属性名相同时必须使用thisRectangle.java3Sept.2008Confidentialthis关键字举例01publicclassPerson{02privateStringname;03privateintage;04privatedoubleheight;05Person3.java06publicPerson(Stringname,int07this.name=name;08this.age=age;09}10publicvoidsayHello(){11System.out.println(Hello,+name);12}13}3Sept.2008Confidentialage){mynameis垃圾回收机制···是Java保证程序健壮的主要手段仅作用在堆内存,与栈内存无关功能:Theheap–回收那些不再使用的对象的内存–移动正在使用的对象内存,填补由于内存回收产生的“缝隙”,消除内存碎片·回收哪些对象:–对象的引用被赋值为null–一次性使用的匿名对象·newPerson().sayHello();–超出生命周期3Sept.2008Confidential垃圾回收机制垃圾回收采用Java多线程机制FinalizeDemo.java、GCDemo.javaTheheap主线程后台线程Objecto1=newObject();o1objecto2object检查出对象没有引用指向Objecto2=newObject();×调用o2对象的finalize()方法o2=null;垃圾回收机制回收分配给该对象的内存3Sep