《面向对象技术C的复习回顾.ppt》由会员分享,可在线阅读,更多相关《面向对象技术C的复习回顾.ppt(57页珍藏版)》请在金锄头文库上搜索。
1、内容简介内容简介3.1类和对象的定义和使用;类和对象的定义和使用;3.2类的封装类的封装封装的概念、如何封装?封装的概念、如何封装?n3.3类的继承类的继承n继承的概念继承的概念、再论构造函数、再论构造函数n3.4类的多态类的多态n方法的覆盖方法的覆盖、方法的重载、方法的重载n3.5Java和和C+这章的主要不同点这章的主要不同点计算机专业三年级3.1类和对象的定义和使用类和对象的定义和使用nJava是(纯)面向对象的编程语言是(纯)面向对象的编程语言- -万物皆对象,客观世界是各种对象的集合万物皆对象,客观世界是各种对象的集合万物皆对象,客观世界是各种对象的集合万物皆对象,客观世界是各种对象
2、的集合- -复杂的对象由简单的对象组合而成复杂的对象由简单的对象组合而成复杂的对象由简单的对象组合而成复杂的对象由简单的对象组合而成- -每个对象都是唯一的(单独分配内存)每个对象都是唯一的(单独分配内存)每个对象都是唯一的(单独分配内存)每个对象都是唯一的(单独分配内存)- -对象具有属性和行为,他们之间进行消息发送对象具有属性和行为,他们之间进行消息发送对象具有属性和行为,他们之间进行消息发送对象具有属性和行为,他们之间进行消息发送- -对象都属于某个类对象都属于某个类对象都属于某个类对象都属于某个类计算机专业三年级类和对象的概念类和对象的概念n什么是类?什么是对象?什么是类?什么是对象?
3、n对象象在我们所处的客观世界中,每一个有明确的意义和边界的事物都可以看作一个对象(Object)例如:某台电脑,一辆汽车n对象象类(简称类Class)我们可以把具有相似特征的事物归为一类,也就是所把具有相同属性的对象看成一个对象类。例如:“电视机电视机类”n类类-电视机的设计图电视机的设计图对象对象-各家各户的电视机各家各户的电视机nJava是通过先定一个类,然后按照类的结构创造是通过先定一个类,然后按照类的结构创造一个又一个对象。一个又一个对象。计算机专业三年级型号型号:Ferrari颜色颜色:Red年份年份:1995动作动作:启动启动停止停止加速加速classCarStringtype;i
4、ntcolor;intprice;voidstart()voidbrake();voidaccelerate() 现实世现实世界汽车界汽车类类计算机世界计算机世界描述的汽车类描述的汽车类MyFirstCar=newcar()计算机世界描述的一计算机世界描述的一辆汽车(对象)辆汽车(对象)计算机专业三年级classmanStringname;intage;floatweight;StringID;voidmove()voidspeek();voidwork() 现实世现实世界人类界人类计算机世界计算机世界描述的人描述的人(类类)Jack=newman()计算机世界描述计算机世界描述Jack(对象
5、)对象)姓名姓名:Jack年龄年龄:28体重体重:65kgs身份证号身份证号:320444548152动作动作:走路走路说话说话工作工作Jack计算机专业三年级使用使用Java如何创建一个类如何创建一个类类声明格式:类声明格式: class class 修饰符:修饰符:public|private|public|private|空空类名:类名:一个自定义的修饰符号一个自定义的修饰符号publicclasspersonprivateStringname;intage=12;intweight=30;publicperson()publicvoidspeak()publicStringgo().p
6、ublicvoidwork(inta)计算机专业三年级抽象类举例抽象类举例classpointintx,y;/属性声明属性声明point()x=0;y=0;/默认的构造函数默认的构造函数point(intx1,inty1)x=x1;y=y1;/自定义构造函数自定义构造函数voidprint()System.out.println(“(”+x+”,”+y+“)”(2,1)计算机专业三年级publicclassCircle抽象类举例抽象类举例privateintx,y;privatedoubler;Circle(intx1,inty1,doubler1)x=x1;y=y1;r=r1;voidset
7、X(intx1)x=x1;voidsetR(intr1)r=r1intgetY()retruny;doublegetR()returnr;public double getCir() return Math.PI*r*2;public double getArea() return Math.PI*r*r; 计算机专业三年级publicclassuseCirclepublicstaticvoidmain(Stringargs)floats=0;L=0;/创建了创建了2个圆对象个圆对象, Circlec1=newCircle(20,50,15.0);Circlec2=newCircle(100,
8、110,30.0),s=c1.getArea();/调用方法调用方法L=c1.getCir();System.out.println(“圆c的面积是:”+s+“圆c1的周长是:”+L);c1=c2;/对象的赋值对象的赋值L=c1.getCir();System.out.println(“圆圆c1的周长是的周长是:”+L);计算机专业三年级通过类创建对象通过类创建对象格式:格式:类型类型 对象名对象名= =new 类型类型( 参数列表参数列表 );如如:Circlec1=newCircle(20,50,15.0);创建对象比较:创建对象比较:C+:Circlec1;Java:Circlec1=n
9、ewCircle(20,50,15.0);计算机专业三年级30H16位16位32位16位16位32位40Hc1 30Hc2 40Hn执行执行c1=c2后后呢?呢?对象的赋值对象的赋值c1=c2;返回返回计算机专业三年级实例变量和局部变量实例变量和局部变量 nJava中的变量分为两种:中的变量分为两种:n类内定义类内定义的的实例变量(成员变量)实例变量(成员变量);n方法中定义方法中定义的的局部变量局部变量;classpointintx,y;/实例变量实例变量voidinit(inta,intb)ints=0;/局部变量局部变量;x=a;y=b;计算机专业三年级实例变量和局部变量实例变量和局部变
10、量n类内定义类内定义的的实例变量实例变量;n方法中定义方法中定义的的局部变量局部变量;classpointintx,y;/实例变量实例变量voidinit(inta,intb)intx=0;/局部变量局部变量;x=a;x=b;计算机专业三年级PublicclassexpPublicvoiddisplay()intx=1;intx=0; /错误错误n注意:注意:在同一个作用域内,不允许定义两在同一个作用域内,不允许定义两个同名的局部变量。个同名的局部变量。计算机专业三年级实例变量和局部变量实例变量和局部变量classPointprotectedintx,y;/实例变量实例变量point(intx
11、1,inty1)x=x1;y=y1;publicvoidsetValue()x=5;y=10;publicvoidprintValue()intx=15;/局部变量局部变量System.out.println(+x);publicvoidprintInsValue()x=5*x;y=y/5;System.out.println(x+y);publicstaticvoidmain(Stringargs)/在类中在类中Pointp1=newPoint(10,10);p1.setValue();p1.printValue();p1.printaInsValue();计算机专业三年级nClass Po
12、int /保存为保存为point.h文件文件nPublic: Point(int x1,int y1)x=x1;y=y1;n setValue();n print( )cout “x=” x “y=”y nprotected: int x,y; n#include /保存为*.cppnintx;nvoid Point: setValue() Point :x=0;Point:y=0nvoid main() n Point p1;n p1.setValue();n :x=12; 注意注意:C+支持全局变量而支持全局变量而Java不支持不支持计算机专业三年级构造函数(特殊的方法)构造函数(特殊的方
13、法)DEF:构造函数是构造函数是在创建对象的时在创建对象的时候候自动调用的一个方法自动调用的一个方法,该方法与,该方法与类名同名。类名同名。构造函数的作用:构造函数的作用:主要是用来初始化主要是用来初始化对象的数据属性。对象的数据属性。计算机专业三年级举例举例nclassCellPhonenprivateStringtype;privateStringcolor;nprivatedoubleprice;npublicCellPhone(Stringtype,Stringcolor,doubleprice)nthis.type=type;this.Color=color;nthis.Price=
14、price;nnpublicstaticvoidmain(Stringargs)nCellPhoneMine=newCellPhone(“Nokia”,“Red”,n“1500.0”);nn计算机专业三年级nclassDatenintyear,month,day;nvoidprint()nnclassDatenintyear,month,day;nnvoidprint()nSystem.out.println(dateis+year+-+month+-+day);nDate()如果没有构造器,如果没有构造器,系统怎么办?系统怎么办?系统自动创建一个默认构造器系统自动创建一个默认构造器计算机专业
15、三年级如果有多个构造器,如果有多个构造器,系统怎么办?系统怎么办?一个类可以有多个构造函数一个类可以有多个构造函数(重载重载),根据参数的不同决定执行哪一个根据参数的不同决定执行哪一个.计算机专业三年级多个构造器多个构造器classPointintx,y,z;Point()x=1;y=1;/默认的构造函数默认的构造函数Point(intnew_x,intnew_y)x=new_x,y=new_y;Point(intnew_x,intnew_y,intnew_z)x=new_x,y=new_y;z=new_z; classUsePointPointpoint_A=newPoint();Point
16、point_B=newPoint(5,7);pointpoint_c=newPoint(10,20,87)其中无其中无参构造参构造其实默其实默认的构认的构造器造器计算机专业三年级构造函数的特点:构造函数的特点:1、构造函数的函数名与类名相同构造函数的函数名与类名相同2、构造函数没有返回值、构造函数没有返回值(但是不加但是不加void修饰符)修饰符)3、构造函数可以没有参数、构造函数可以没有参数默认构造函数默认构造函数4、构造函数可以有参数、构造函数可以有参数自定义构造函数自定义构造函数Java采用垃圾自动回收机制没有采用垃圾自动回收机制没有析构函数(析构函数(C+)计算机专业三年级3.23.2
17、类的封装类的封装什么是封装呢?什么是封装呢?类类A构造函数构造函数方法方法属属性性classprivate属性属性构造函数构造函数方法方法n封装的定义封装的定义:类的设类的设计者把类设计成一个计者把类设计成一个黑匣子黑匣子,使用者只能,使用者只能看见类定义的公共方看见类定义的公共方法而看法而看不见方法实现不见方法实现的细节的细节;也不能对类;也不能对类的数据进行操作的数据进行操作.计算机专业三年级为什么要对类进行封装呢?为什么要对类进行封装呢?(1)隐藏类的细节()隐藏类的细节(使用类的人无需知道细节使用类的人无需知道细节)(2)迫使用户通过方法接口去访问数据迫使用户通过方法接口去访问数据防止
18、外部对类中数据的干扰防止外部对类中数据的干扰(3)封装减少了程序对类中数据表达的依赖封装减少了程序对类中数据表达的依赖性,性,增强了代码的可维护性。增强了代码的可维护性。n类封装的概念可以打个比方:类封装的概念可以打个比方:n拿收音机做类比拿收音机做类比计算机专业三年级npublic class MyDate /类的封装 n private int year,month,day; /成员变量,私有的n public MyDate(int y,int m,int d)/对私有成员赋值对私有成员赋值n year = y; month = m; day = d : n public void set
19、Year(int y)year=y;n public void setDay(int d)dayr=d;n public int getYear()return year; /返回私有成员以便利用返回私有成员以便利用n public int getMonth()return month; n public int getDay() return day; n public void print() n System.out.println(dateis+year+:+month+:+day);n计算机专业三年级class EncapsueDate public static void main
20、(String args) MyDate a = new MyDate(2002,6,28); a.day=13; System.out.println(a.year+”:”+a.month+”:”+a.day); a.print(); 对吗?对吗?对吗?对吗?怎样修改呢?怎样修改呢?计算机专业三年级3.3类的继承类的继承nDEF:DEF:子类子类继承继承父类的父类的属性和方法属性和方法, ,以及在父以及在父类的基础上类的基础上添加添加新的新的属性和方法则就叫做属性和方法则就叫做继承。继承。继承继承super部分部分Sub2增加的部分增加的部分继承继承super部分部分Sub2增加的部分增加的
21、部分Super超类超类n在在 Java Java 中,有一个被中,有一个被称为称为ObjectObject的特殊超的特殊超类,所有的类都直接或间类,所有的类都直接或间接地继承接地继承ObjectObject类类计算机专业三年级bicycle(superclass)MountainbikesRacingbikesTandembikessubclass父类和子类父类和子类 之间反映的是之间反映的是“一般与特殊一般与特殊”的关系的关系父类和子类父类和子类 之间反映的是之间反映的是“一般与特殊一般与特殊”的关系的关系计算机专业三年级继承语法:继承语法:classclassNameextendssupe
22、rClassName各实例变量各实例变量方法的定义方法的定义注意注意没有没有extends,默认父类为默认父类为Object只能有一个父类,即单继承只能有一个父类,即单继承子类继承父类的全部成员子类继承父类的全部成员类继承具有传递性类继承具有传递性计算机专业三年级classPeoplepublicStringname;publicintage;publiccharsex;People(Stringname,intage,charsex)this.name=name;this.age=age;this.sex=sex;voidsetNameAgeSex(Stringname,intage,cha
23、rsex)this.name=name,this.age=age,this.sex=sex;StringgetName()returnname;/查询姓名查询姓名父类:父类:/ People类的声明计算机专业三年级classTeacherextendsPeopleString course /教授课程教授课程 子类子类Teacher类类:Teacher(Stringname,intage,charsex,String course )this.name=name;this.age=age;this.sex=sex;this.course=course ;String whichCourse()
24、 return course ;/查询所授课程查询所授课程voidsetValue(Stringname,intage,charsex,booleanisTeaching)nsetNameAgeSex(name,age,sex);n this.course=course;voidprint()System.out.println(“”+name+“”+sex+“”+age+“”+course);计算机专业三年级classtestpublicstaticvoidmain(Stringargs)TeacherLiPing=newTeacher(“LiPing”,25,m,”Chinese”);Li
25、Ping.print();如果我们将如果我们将PeoplePeople类的类的所有属性改为所有属性改为privagteprivagte, ,程序对吗?如何改呢程序对吗?如何改呢?计算机专业三年级classtestpublicstaticvoidmain(Stringargs)TeacherLiPing=newTeacher(“LiPing”,25,m,”Chinese”);LiPing.print();如果我们将如果我们将PeoplePeople类的类的所有属性改为所有属性改为privagteprivagte, ,程序对吗?如何改呢程序对吗?如何改呢?计算机专业三年级有关继承必须说明的几点:有
26、关继承必须说明的几点: (1)子类能够继承父类中声明的所有成员变量子类能够继承父类中声明的所有成员变量,不能直接使用不能直接使用private类型的成员变量类型的成员变量.(2)子类的变量(方法)会覆盖超类的同名成子类的变量(方法)会覆盖超类的同名成员变量(方法),但子类方法不能缩小父类员变量(方法),但子类方法不能缩小父类方法的权限方法的权限。(3)子类的构造函数与父类构造函数的关系子类的构造函数与父类构造函数的关系计算机专业三年级成员覆盖习练习题成员覆盖习练习题1classAintx=1234;voidshow()System.out.println(classA:);计算机专业三年级cl
27、assBextendsAdoublex=567.89;voidshow()intx=45;System.out.println(“classA:x”+super.x);System.out.println(“classB:x”+x);super.show();System.out.println(classB:);publicstaticvoidmain(Stringargs)Bx=newB();System.out.prinln(x.x);x.show();程序运行结果?程序运行结果?计算机专业三年级再论构造函数再论构造函数nthis引用和引用和super引用引用n关键字关键字thisnDE
28、F:代表一个特殊的对象即当前对象。代表一个特殊的对象即当前对象。n(1)指代对象指代对象n(2)指代构造函数指代构造函数计算机专业三年级this代表一个特殊的对象即当前对象代表一个特殊的对象即当前对象例例:Class Buttonncharc;nbooleanequals(Buttonother)nif(this=other)returntrue;nreturnfalse;nnclass test Button publicstaticvoidmain(Stringargs)Button t1=newButton (),t3=newButton ();t3=t1;System.out.prin
29、tln(t3.equals(t1);地址传递地址传递计算机专业三年级nthis指代对象可以用于解决实例变量被指代对象可以用于解决实例变量被局部变量屏蔽的问题局部变量屏蔽的问题npublicclassMyDate/类的封装类的封装nprivateintyear,month,day;npublicMyDate(intyear,intmonth,intday)nthis.year=year; this.month=month;nthis.day = day; n publicsetDay(intday)this.day=day;ndate1=newMyDate(2002,5,8)构造函数中的构造函数
30、中的this.year就是指的是就是指的是date1的实例变量的实例变量year计算机专业三年级nthis指代构造函数指代构造函数:在构造器内部使用在构造器内部使用this,它用它用于指代另外一个构造函数。于指代另外一个构造函数。nClasspointnintx,inty;nPoint(inta,intb)nx=a;y=b;nPoint()nthis(-1,-1);npublicclassUsePointPublicstaticvoidmain()pointp1=newpoint();System.out.println(“(”+p1.X+“,”+p1.y+“)”);pointp2=newpo
31、int(10,20);,System.out.println(“(”+p2.X+“,”+p2.y+“)”);计算机专业三年级关键字关键字super n构造函数是一种特殊的方法,构造函数是一种特殊的方法,子类不能继承子类不能继承超类的构造函数,超类的构造函数,n但子类构造函数可以但子类构造函数可以通过通过super调用超类的调用超类的构造函数构造函数。计算机专业三年级class circle extends point intradius;circle(intr,intx,inty)super(x, y); /调用父类的构造函数调用父类的构造函数radius=r;System.out.print
32、ln(子子类类构构造造函函数数被被调调用用!);class pointintx,y;point(intx,inty)this.x=x;this.y=y;System.out.println(父类构造函数被调用!父类构造函数被调用!);计算机专业三年级publicclasstestInherencepublicstaticvoidmain(Stringargs)circlec1;c1=new circle(1,1,1);计算机专业三年级有关构造函数,有关构造函数,请注意下列几个例子请注意下列几个例子计算机专业三年级子类子类classcircleextendspointintr;circle(in
33、tr)radius=r;publicstaticvoidmain(Stringargs)circlec1=newcircle(20);System.out.println(x=+c1.x+y=+c1.y+r=+c1.r);或:或:classpointintx=1,y=1;point()程序运行结果?程序运行结果?此处相当于有一个此处相当于有一个super();计算机专业三年级n总结:总结:n若若父类没有定义构造函数或只有一个默父类没有定义构造函数或只有一个默认构造函数认构造函数n那么那么子类先执行父类默认的构造函数子类先执行父类默认的构造函数(对父类数据的初始化对父类数据的初始化),然后再执行
34、),然后再执行自己的构造函数自己的构造函数计算机专业三年级若父类中若父类中含参构造函数含参构造函数?答案:答案:子类可以在自己的构子类可以在自己的构造函数中使用造函数中使用super调用它。调用它。计算机专业三年级classCylinderextendsCircle private double height;publicCylinder(intx1,inty1,doubler1,double)height=h;classcircleextendspointintradius;/circle(intr,intx,inty)radius=r;this.x=x;this.y=y;super();c
35、ircle()计算机专业三年级这个程序能编译成功吗?这个程序能编译成功吗?nclassPointintx,y;nPoint(intx,inty)this.x=x;this.y=y;nnclassCircleextendsPointnintr;nCircle()x=10;y=10;r=10;nCircle(intr)nsuper(20,20);this.r=r;nsuper();Point()计算机专业三年级类的多态性类的多态性n(1)方法的覆盖方法的覆盖(-简单的多态简单的多态)n(2)方法重载方法重载n(3)构造函数的重载构造函数的重载计算机专业三年级方法的重载 在在Java中,同一个方法名
36、可以被定义多次,但中,同一个方法名可以被定义多次,但要要求参数表不能完全一样求参数表不能完全一样。调用方法时,系统是通。调用方法时,系统是通过方法名和参数确定所调用的具体方法。这种现过方法名和参数确定所调用的具体方法。这种现象叫做方法或函数的象叫做方法或函数的重载重载。类类voidabs(intint_num)voidabs(LongLong_num)voidabs(floatfloat_um)123888L1.23计算机专业三年级classmysqureintsquare(intx)returnx*x;doublesquare(doubley)returny*y;publicclassMet
37、hodOverloadpublicstaticvoidmain(Stringg)mysqures=newmysqure();System.out.println(Thesquareofinteger17is+s.square(17);System.out.println(Thesquareofdouble17.5is+s.square(17);计算机专业三年级Java和和C+在这一章的不同在这一章的不同n-基本的概念相同基本的概念相同(类、类的三大特征类、类的三大特征),语法有所不同。语法有所不同。n-Java是单继承,是单继承,C+是多继承是多继承n-Java纯封装(无全局变量和类外的纯封装
38、(无全局变量和类外的方法),方法),C+非也非也计算机专业三年级习题习题 (1) 类类Test1、Test2定义如下:定义如下:1publicclassTest12publicfloataMethod(floata,floatb)n3n4n5publicclassTest2extendsTest1n6n7n将以下哪种方法插入行将以下哪种方法插入行6是不合法的。(是不合法的。()nA)publicfloataMethod(floata,floatb)nB)publicintaMethod(inta,intb)nC)publicintaMethod(floatp,floatq)nD)publici
39、ntaMethod(floata,intb)计算机专业三年级面向对象程序举例面向对象程序举例n创建一个复数类(创建一个复数类(Complex类),有两个类),有两个类变量类变量realimaginn要求:要求:两个构造函数两个构造函数;n用方法将复数以用方法将复数以(a,b)显示出来显示出来n三个方法实现复数的加减乘三个方法实现复数的加减乘n(a,b)+(c,d)=(a+c,b+d)n(a,b)-(c,d)=(a-c,b-d)n(a,b)*(c,d)=(a*c-b*d,a*d+b*c)计算机专业三年级程序设计例题程序设计例题创建复数类创建复数类nclassComplexnprivatefloa
40、treal;nprivatefloatimagin;nComplex()real=0;imagin=0;nComplex(floatreal,floatimagin)nthis.real=real;this.imagin=imagin;nfloatreturnReal()returnreal;nfloatreturnImaginary()nreturnimagin;计算机专业三年级nComplexadd(Complexb)nintTreal=real+b.real;ninTimagin=imagin+b.imagin;nreturnnewComplex(Treal,Timagin);nnComplexsub(Complexb)nintTreal=real-b.real;nintTimagin=imagin-b.imagin;nreturnnewComplex(Treal,Timagin);n计算机专业三年级