【文档说明】Java面向对象特性课件.ppt,共(39)页,178.001 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-44836.html
以下为本文档部分文字说明:
1第四章Java面向对象特性对象与类对象生命周期类的创建重载子类2对象的基本概念面向对象程序语言三个关键特点:封装(Encapsulation)多态(Polymorphism)继承(Inheritance)3基本数据类型和聚集类型的变量与一些操作(如+,-)之间不需特殊的
联系。在面向对象语言中,在数据类型的声明与操作这些数据的代码声明之间建立紧密联系,这种联系通常描述为一种抽象数据类型。在Java中,抽象数据类型的概念用类来实现。抽象数据类型4类和对象类是特定类型对象的定义,包括:对象包含的数据,对象的创建及对象对自身数据操作的
方法。类是一个模板。对象是在其类模型基础上构造出的,是具体的实例。5类和对象举例类定义:ClassEmpInfo{Stringname;Stringdesignation;Stringdepartment;voidprint(){System.out.println
(name+“is”+designation+“at”+department);}}对象的生成与使用:…EmpInfoemployee=newEmpInfo();employee.name=“RobertJavaman”;employee.designation=“Mana
ger”;employee.department=“Coffeeshop”;employee.print();...6对象生命周期创建对象使用对象清除不用的对象7创建对象例:Pointorigin_one;origin_one=newPoint(23,9
4);Rectanglerect_one=newRectangle(origin_one,100,200);Rectanglerect_two=newRectangle(50,100);创建对象的三个步骤:声明(Declaration)实
例化(Instantiation)初始化(Initialization)8对象实例化过程构造与初始化对象的过程(调用newXxxx()):开辟内存空间(变量、方法体代码)及类成员变量的初始化:数值型:0;布尔型:false;引用型:null;字符串型:nul
l;显式初始化:执行类成员声明时带有的简单赋值表达式。publicclassInitialized{privateintx=5;privateStringname=“Fred”;…}执行构造函数。9对象的回收垃圾收集机制(garbagecollection):Java
运行环境当确定某个对象不再被使用时,将其删除。一个对象在没有引用指向它时,可作为垃圾收集。垃圾搜集器:Java运行环境中的垃圾搜集器周期性地释放不用对象占用的空间。10垃圾收集机制C++:A*a=newA();A*b=a;A*c=a;Java:
Aa=newA();Ab=a;Ac=a;abcbc(指针悬空)abcbc//a使用完,将其删除deletea;//a使用完,将其删除a=null;11类的创建12构造方法定义:public类名(参数){…}注意:•方法名必须与类名相同。•不能带返回类型
。类的构造函数13如果在类定义中无构造函数,Java在编译时可缺省加入构造方法。如publicEmployee(){};一旦在类中有一个自己声明的构造函数,则缺省的构造函数将不被加到源程序中。缺省构造函数14类成员方法定义一般格式:<modifiers><return_type><n
ame>([<argument_list>])[throws<exception>]{<block>}方法是传值的,方法调用不会改变参数的值。当对象作为参数时,参数的值是该对象的引用,这时对象的内容可以在方法中改变,但是对象的引用不会改变。15举例PublicclassPassTest{f
loatptValue;publicvoidchangeInt(intvalue){value=55;}publicvoidchangeStr(Stringvalue){value=newString(dif
ferent“);}publicvoidchangeObjValue(PassTestref){ref.ptValue=99.0f;}publicstaticvoidmain(Stringargs[]){Stringst
r;intval;PassTestpt=newPassTest();val=11;pt.changeInt(val);System.out.println(“Intvalueis:”+val);str=newString(“hello”);pt.changeStr(str);Sys
tem.out.println(“strvalueis:”+str);pt.ptvalue=101.0f;pt.changeObjValue(pt);System.out.println(“ptvalueis:”+pt.ptValue);}}结果:IntValueis:11StrVa
lueis:helloptvalueis:99.0f16数据隐藏与封装数据隐藏:使用private定义的成员变量,只能在成员方法中使用,其它方法中禁止使用。优点:保证对象中数据的一致性。封装:基本数据和对数据进行的操作方法的结合。优点:•隐藏类中具体实现的细节。•强迫程序员使用统一的接口访
问数据。•使代码可维护性好。17数据隐藏与封装举例ClassDate{privateintday,month,year;voidsetDate(inta,intb,intc){day=a;month=b;year=c;}}…Dated1;d1.newDate();d1.se
tDate(30,9,2001);...d1.day=30;(错误!)18“this“引用关键字this用来指向当前对象本身。例:classDate{privateintday,month,year;publicDategetTommorrow(){this.day++;…}19重载(
Overloading)含义:在同一个类中一个方法名被用来定义多个方法。classScreen{publicvoidprint(inti){…}publicvoidprint(floati){…}publicvoidpr
int(Stringstr){…}}重载必须遵守原则:•参数表必须不同,以此区分不同方法体。•返回类型、修饰符可相同或不相同。20激活重载的构造函数在一个构造函数中可以利用另一个构造函数。classEmployee{privateStringname;privat
eintsalary;publicEmployee(Stringn,ints){name=n;salary=s;}publicEmployee(Stringn){this(n,0);}publicEmployee(){this(“Unknown”)
;}}21子类子类表示类之间一种“属于”(isa)关系。例:publicclassEmployee{Stringname;DatehireDate;DatedateofBirth;StringjobTitle;intgrade;…}publ
icclassManager{Stringname;DatehireDate;DatedateofBirth;StringjobTitle;intgrade;Stringdepartment;Employee[]subordin
ates;…}22Java中用extends关键字定义子类。Extends关键字publicclassEmployee{Stringname;DatehireDate;DatedateofBirth;StringjobTitle;intgrade;…}子类是从已有的类创建新类的一种方法。pu
blicclassManagerextendsEmployee{Stringdepartment;Employee[]subordinates;}23子类子类继承父类的属性、功能(方法),子类中只需声明特有的东西。带privat
e修饰符的属性、方法是不能被继承的。构造函数不能被继承。在方法中调用构造方法用this()。调用父类的构造方法用super()。--super指向该关键字所在类的父类。24构造不同类型数据的集合Java中允许构造如下类型的
数组:Employee[]staff=newEmployee[1024];staff[0]=newManager();staff[1]=newWorker();staff[2]=newEmployee();…----staff是由多种类型的对象组成的。Java中任何一个子类的实例都可作为父类
的实例使用,可以调用父类具有的方法。25单继承Java是单继承的,即只能从一个类继承,extends后类名只能有一个。单继承的优点:•代码更可靠•可以用接口弥补用一个类实现多个接口,达到多继承效果。26重写(Overridingmethods)子类可以改变从父类继承的行为。被重写方
法的返回值、方法名、参数列表要与父类中的方法完全一样。27Overriding示例publicclassStack{privateVectoritems;//codeforStack'smethodsandconstructornotshown//overridesObject'stoS
tringmethodpublicStringtoString(){intn=items.size();StringBufferresult=newStringBuffer();result.append("[");for(inti=0;i<n;
i++){result.append(items.elementAt(i).toString());if(i<n-1)result.append(",");}result.append("]");returnre
sult.toString();}}28方法重写的规则必须返回与原来方法完全相同的返回值。方法的访问权限不能缩小。不能抛出新的例外。29多态Anobjecthasonlyoneform,whileavariableispolymorphism,sinceitcanrefertoobje
ctsofdifferentforms,polymorphismistheabilitytohavemanydifferentforms.30Java允许父类对象的变量作为子类对象的变量使用。如:Employeee=newMa
nager();但通过该变量(如e)只能访问父类的方法,子类特有的部分被隐藏。运行时确定使用父类还是子类的方法。Employeee=newManager();e.getDetails();多态31Super关键字Super指向该关键字所在类的父类。Publicclass
Empolyee{privateStringname;privateintsalary;publicStringgetDetails(){return“Name:”+name+“\nSalary:”+salary;}}publicclassManagerextendsEmpol
yee{privateStringdepartment;publicStringgetDetails(){returnsuper.getDetailes()+„\nDepartment:“+department;}}32“ins
tanceof”及类型强制转换Instanceof测试对象类型Empolyeea=newManager();则ainstanceofManager为true;类型转换父类弱、子类强,指向父类的引用不能直接
按子类引用,必须要强制类型转换后才能作为子类的引用使用。例:publicvoidmethod(Employeee){if(einstanceofManager){Managerm=(Manager)e;m.department=“…”;…}}33子类对象的初始化初始化对象是很结构化的。在对对象
初始化时,分三步:•分配空间,并初始化为“0”值。•按继承关系从顶向下显式初始化。•按继承关系从顶向下调用构造函数。34调用父类构造方法缺省是不带参数的构造方法。如果需要调用特殊的父类构造方法,则需在子类构造方法中第一行通过super(…)调用。classEmployee{
...publicEmployee(Stringn){name=n;}}classManagerentendsEmplyee{publicManager(Strings,Stringd){super(s);...}}35Ob
ject及其子类Object定义了所有对象都需要的状态和行为。如对象之间的比较、将对象转换为字符串、等待某个条件变量、当某条件变量改变时通知相关对象以及返回对象的类。36在Object子类中可以重写的方法:•clone•equals•finalize•toString:返
回对象的字符串表示,表达的内容因具体的对象而异在Object子类中不能重写的方法:•getClass•notify•notifyAll•waitObject及其子类37Object的clone方法aCloneableObject.clone();//从已有的对象创建
新的对象注意:•aCloneableObject必须实现了Cloneable接口•Object.clone()是shallowcopy而不是deepcopy38publicclassStackimplementsCloneable{privateVectoritems;//codeforStac
k'smethodsandconstructornotshownprotectedObjectclone(){try{Stacks=(Stack)super.clone();//clonethestacks.items=(Vector)
items.clone();//clonethevectorreturns;//returntheclone}catch(CloneNotSupportedExceptione){}}}Object的clone方法39Object的toString方法返回对象的字符串表示,表达的内容因具体的
对象而异。例:System.out.println(Thread.currentThread().toString());对于Integer的对象是所包含的整型数的字符表示。Thread[main,5,main]