第4章 类和对象_第1页
第4章 类和对象_第2页
第4章 类和对象_第3页
第4章 类和对象_第4页
第4章 类和对象_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本章主要内容面向对象的程序设计思想类和对象的关系类的定义及访问类的实例化类的封装、继承和多态4.1面向对象程序设计思想4.1.1OOP思想面向对象的分析(OOA,Object-OrientedAnalysis);面向对象的设计(OOD,Object-OrientedDesign);面向对象的程序设计(OOP,Object-OrientedProgram)。4.1.2面向对象程序设计方法特点与人类习惯的思维方法一致,稳定性好,可重用性好,易于开发大型软件产品,可维护性好4.2类和对象的关系类(Class):具有相同或相似性质的对象的抽象就是类。忽略事物的非本质特征,只注意那些与当前目标有关的本质特征,从而找出事物的共性,把具有共同性质的事物划分为一类,得出一个抽象的概念。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象。packagesample;classStringTest{privateStrings;publicvoidprintString(){System.out.println(s);}publicvoidchangeString(Stringstr){s=str;}publicstaticvoidmain(String[]args){StringTestst=newStringTest();st.changeString("HelloLixin");st.printString();}}【例】类的创建4.3类的定义及访问类的定义成员变量的定义及修饰字方法的定义及修饰字方法的参数传递类成员的访问控制符4.3.1类的定义基本语法如下:[类修饰符]class类名称[extends父类名称][implements接口名称列表]{

成员变量定义及初始化;方法定义及方法体;}

类的定义由类声明和类体组成。其中,类声明包含关键字class、类名称及类的属性。类的修饰符有:public、abstract、final和friendly四种,默认方式为friendly。4.3.2成员变量的定义及修饰字成员变量:指类的一些属性定义,标志类的静态特征,它的基本语法如下:[变量修饰符]变量数据类型变量名1,变量名2[=变量初值]…; 对于一个成员变量,可以有访问说明符有public、private和protected三种:(1)public:省略时默认为公有类型,可以由外部对象进行访问。(2)private:私有类型,只允许在类内部的方法中使用,若从外部访问,必须通过构造函数间接进行。(3)Protected:受保护类型,子类访问受到限制。4.3.3方法的定义及修饰字基本格式如下:[方法修饰符]返回类型方法名称(参数1,参数2,…)[throws异常类]{

方法体}其中,方法修饰符有:[public|protected|private][static][final|abstract][native][synchronized]。4.3.4方法的参数传递方法分为有参数的方法和无参数的方法。在调用一个有参(参数称为形式参数)方法时,必须给方法提供实际参数,完成实际参数向形式参数的传值,就是参数传递。计算机语言为子程序传递参数提供两种方式。第一种方式是值传递(pass-by-value)。这种方式将一个参数值(value)复制成为子程序的参数,这样,对子程序参数的改变不影响调用它的参数。第二种方式是引用传递(pass-by-reference)。在这种方式中,参数的引用(而不是参数值)被传递给子程序参数。在子程序中,该引用用来访问调用中指定的实际参数,这样,对子程序参数的改变将可能会影响调用子程序的参数。Java对于基本数据类型的参数,它是“值传递”方式。对于引用类型的参数,它也是“值传递”方式,只不过传递的是引用的值(有些书籍中称为引用传递。)因此,引用本身无法改变,而引用指向的对象内容可以被改变。packagesample;classParamPass{voidadd(inti){i+=5;}publicstaticvoidmain(Stringargs[]){inta=10;System.out.println("aandbbeforecall:"+a);ParamPassob=newParamPass();ob.add(a);System.out.println("aandbaftercall:"+a);}}【例】参数的传递方式4.3.5类成员的访问控制符修饰符同一个类中同一个包中不同包中的子类中全局publicYesYesYesYesprotectedYesYesYesNodefault(friendly)YesYesNoNoprivateYesNoNoNo4.4类的实例化创建对象对象成员的使用对象资源的回收4.4.1创建对象对象的生成包括声明、实例化和初始化。基本语法如下:

类名称

对象名//声明对象

对象名=new类名([<参数列表>]);//创建对象4.4.2对象成员的使用

对象的使用是通过运算符"."实现对变量的访问和方法的调用。变量和方法可以通过设定访问权限来限制其它对象对它的访问。基本语法如下:

对象名.成员变量名

对象名.成员方法名([<参数列表>]);packagesample;publicclassPerson{intage;publicvoidpout(){System.out.println("Myageis"+age);}publicstaticvoidmain(Stringargs[]){Personp1=newPerson();Personp2=newPerson();p1.age=20;p2.age=18;p1.pout();p2.pout();}}【例】类的定义及成员方法的使用4.4.3对象资源的回收

Java技术提供了垃圾收集器(GarbageCollection),来跟踪每一块分配出去的内存空间,当Java虚拟机(JavaVirtualMachine)处于空闲循环时,垃圾收集器会自动检查每一快分配出去的内存空间,然后自动回收每一快可以回收的无用的内存块,有效地防止了内存渗漏体的出现,并极大可能地节省了宝贵的内存资源。程序员也不用考虑对象的释放问题,减轻了程序员的负担,提高了程序的安全性。4.5构造方法Java中的每个类都有构造方法,用来初始化该类的一个新对象。构造方法(Constructor)是一种特殊的方法。构造方法的名称必须和类名相同,为公有类型,无返回值,用来从类实例中访问类时初始化此类的私有变量。当创建对象时,由new运算符调用默认构造方法(没有参数的构造方法)。但是特别要注意的是,如果程序中已经定义了构造方法,Java就不会再生成默认构造方法了。packagesample;publicclassUseConstruct{publicstaticvoidmain(String[]args){AEmployeem=newAEmployee("王飞",10000);//初始化赋值

System.out.println(m.getSalary());}}

classAEmployee{privateStringname;//名字

privateintsalary;//薪水

//构造函数

publicAEmployee(String_name,int_salary){name=_name;salary=_salary;}publicStringgetSalary(){Stringstr;str="名字:"+name+"\nSalary:"+salary;returnstr;}}【例】构造方法的示例4.6类的封装封装是抽象的一种具体体现,把一组数据和与其有关的操作集合组装在一起,形成一个能动的实体。封装目的是增强安全性和简化操作。使用者不必了解具体的实现细节,而只需要通过外部接口来使用类的成员。如:生活中的封装实体——集成电路,面向对象中的封装实体——对象。packagesample;classEncapTest{inta;//默认存取控制(defaultaccess)publicintb;//公有存取控制(publicaccess)privateintc;//私有存取控制(privateaccess)//访问c的方法voidsetc(inti){//设定c的值c=i;}intgetc(){//获得c的值returnc;}}publicclassAccessTest{publicstaticvoidmain(Stringargs[]){EncapTestob=newEncapTest();//以下代码是正确的ob.a=10;ob.b=20;//以下代码会产生错误//ob.c=30;//我们必须通过公有的方法操作cob.setc(30);//正确System.out.println("a,b,andc:"+ob.a+""+ob.b+""+ob.getc());}}【例】数据的封装4.7类的继承继承的概念继承的实现方法重写this和super的使用继承中的构造方法调用finalize()方法的使用

4.7.1继承的概念所谓继承就是保持已有类的特性而构造新类的过程。继承是子类利用父类中定义的方法和变量,就像它们属于子类本身一样。特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。例如:如汽车与小汽车;教育工作者与教师。当一个类拥有另一个类的所有数据和操作时,就称这两个类之间存在着继承关系。Java中不支持类之间的多重继承(注:Java支持接口之间的多重继承),即不允许一个子类继承多个父类。这是因为多重继承带来了许多必须处理的问题。多重继承只对编程人员有益,却增加了编译器和运行环境的负担。4.7.2继承的实现我们通过在类的声明中加入extends子句来创建一个类的子类:classSubClassextendsSuperClass{……}如果缺省extends子句,则该类为java.lang.Object的子类。子类可以继承父类中访问权限设定为public、protected、default的成员变量和方法,但是不能继承访问权限为private的成员变量和方法。packagesample;publicclassTestExtendextendsEmployee{publicstaticvoidmain(String[]args){System.out.println("覆盖的方法调用:"+getSalary("王一",500));System.out.println("继承的方法调用:"+getSalary2("王一",500));System.out.println("覆盖的方法调用:"+getSalary("王飞",10000));System.out.println(“继承的方法调用:”+getSalary2(“王飞",10000));}publicstaticStringgetSalary(Stringname,intsalary){Stringstr;if(salary>5000)str="名字:"+name+"Salary:"+salary;elsestr="名字:"+name+"Salary:低于5000";returnstr;}}classEmployee{publicStringname;//名字publicintsalary;//薪水publicstaticStringgetSalary(Stringname,intsalary){Stringstr;str="名字:"+name+"Salary:"+salary;returnstr;}publicstaticStringgetSalary2(Stringname,intsalary){Stringstr;str="名字:"+name+"Salary:"+salary;returnstr;}}【例】类的继承的实现1.方法重写也叫做方法覆盖,指在子类中重新定义父类中已有的方法。方法重写允许通用类指定方法,这些方法对该类的所有派生类都是公有的,同时该方法允许子类定义这些方法中的某些或全部的特殊实现。也就是说,方法重写能够帮助Java实现它的多态性。关于多态我们稍后讲解。2.方法重写的条件:如果能满足以下条件,那么我们就说子类中的方法重写了超类中的方法。

方法名、参数列表和返回值完全相同;

访问控制范围(public,protected,private,default)不能被缩小;

抛出的异常不能被扩大。4.7.3方法重写packagesample;importjava.io.IOException;

publicclassOverridenTest{publicstaticvoidmain(String[]args){SuperCc=newSubC();c.methodA(0);c.methodB();c.methodC();try{c.methodD("hello",3);}catch(Exceptione){}c.methodE("aaa",2);}}

classSuperC{publicvoidmethodA(inti){System.out.println("methodA(int)inSuperC");}protectedvoidmethodB(){System.out.println("methodB()inSuperC");}voidmethodC(){System.out.println("methodC()inSuperC");}publicvoidmethodD(Strings,inti)throwsException{System.out.println("methodD(String,int)inSuperC");}publicintmethodE(Strings,inti){System.out.println("methodE(String,int)inSuperC");return0;}}【例】方法的重写classSubCextendsSuperC{publicvoidmethodA(inti){System.out.println("methodA(int)inSubC");}

publicvoidmethodB(){System.out.println("methodB()inSubC");}

voidmethodC(){System.out.println("methodC()inSubC");}

publicvoidmethodD(Strings,inti)throwsIOException{System.out.println("methodD(String,int)inSubC");}

publicintmethodE(Strings,inti){System.out.println("methodE(String,int)inSubC");return0;}

}以上5个方法都满足方法重写的条件。程序的输出结果如下:methodA(int)inSubCmethodB()inSubCmethodC()inSubCmethodD(String,int)inSubCmethodE(String,int)inSubCthis()方法与上面的this关键字不同,this()方法代表的是一个构造方法对其他构造方法的调用。这里要特别注意的是,this()必须放在构造方法的第一行,也就是说,它前面不能再有其他语句。super有两种通用形式。第一种是调用超类的构造方法。当一个子类调用super()时,它调用它的直接超类的构造方法。这样,super()总是引用调用类直接的超类,这甚至在多层次结构中也是成立的。还有,super()必须是子类构造方法中的第一个执行语句。第二种是用来访问被子类的成员隐藏的超类成员。super指这个对象的父类。super可以用来引用父类中的(被覆盖的)方法、(被隐藏的)变量及构造方法。4.7.4this和super的使用packagesample;publicclassEmployee{privateStringname;privateintsalary;

publicEmployee(Stringn,ints){name=n;salary=s;}

publicEmployee(Stringn){this(n,0);}

publicEmployee(){//inta=0;//错误!this()必须放在构造方法的第一行

this("Unknown");}}【例】this和super的使用publicclassAppleextendsFruit{publicApple(doubleprice){super(price);super.var=value;super.method(paraList);}}类层次结构创建以后,组成层次结构的类的构造方法以怎样的顺序被调用呢?举个例子来说,给定一个名为B的子类和超类A,是A的构造方法在B的构造方法之前调用,还是情况相反?这和我们生活中的逻辑一样,在类层次结构中,构造方法以派生的次序调用,从超类到子类。而且,super()必须是子类构造方法的第一条执行语句,无论是否用到了super(),这个次序都不变。如果super()没有被用到,那么每个超类的默认的或无参数的构造方法仍将执行。下面的例子阐述了何时执行构造方法。4.7.5继承中的构造方法调用packagesample;publicclassInheritanceTest{publicstaticvoidmain(String[]args){newSubA(1);SubAsa=newSubA();sa.print();newSubB();}

}classSuperA{privateintj=10;publicSuperA(inti){System.out.println("constructorSuperA(int)");}

publicSuperA(){System.out.println("constructorSuperA()");}

voidprint(){System.out.println("print()inSuperA");}}

【例】构造方法classSubAextendsSuperA{privateintk=2;publicSubA(inti){super(i);System.out.println("constructorSubA(int)");}

publicSubA(){//隐含调用super()-->SuperA()System.out.println("constructorSubA()");}voidprint(){super.print();System.out.println("print()inSubA");}}

classSuperB{

publicSuperB(Strings){System.out.println("ConstructorsuperB(String)");}}

classSubBextendsSuperB{publicSubB(){super("Hello");System.out.println("ConstructorsubB()");}}程序的运行结果如下:constructorSuperA(int)constructorSubA(int)constructorSuperA()constructorSubA()print()inSuperAprint()inSubAConstructorsuperB(String)ConstructorsubB()在对对象进行垃圾收集前,Java运行时系统会自动调用对象的finalize()方法来释放系统资源。该方法必须按如下方式声明:protectedvoidfinalize()throwsthrowable{……}finalize()方法是在java.lang.Object中实现的,在用户自定义的类中,它可以被覆盖,但一般在最后要调用父类的finalize()方法来清除对象所使用的所有资源。protectedvoidfinalize()throwsthrowable{……//释放本类中使用的资源super.finalize();}4.7.6finalize()方法的使用4.8多态性多态概念多态实现条件4.8.1多态概念多态是指一个方法只能有一个名称,但可以有许多形态,也就是程序中可以定义多个同名的方法,用“一个接口,多个方法”来描述,可以通过方法的参数和类型引用实现。

多态性使指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。4.8.2多态实现条件多态性的代码实现基本模板如下:1)继承和方法重写SubC1extendsSuperCoverridemethodA();SubC2exte

温馨提示

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

评论

0/150

提交评论