java 第三章 延边大学 计算机系.ppt_第1页
java 第三章 延边大学 计算机系.ppt_第2页
java 第三章 延边大学 计算机系.ppt_第3页
java 第三章 延边大学 计算机系.ppt_第4页
java 第三章 延边大学 计算机系.ppt_第5页
已阅读5页,还剩96页未读 继续免费阅读

下载本文档

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

文档简介

第三章类与对象,程序设计语言的发展,机器语言汇编语言高级语言a=b+c;面向对象语言CarmyCar=newCar();myCar.go();,面向过程和面向对象,公共数据,函数,函数,算法数据结构,数据,方法,方法,数据,方法,方法,过程式程序设计,OOP程序设计,对象消息,消息,面向过程和面向对象,举例:煮方便面面向过程往锅里倒水()-把水煮开()-把面放进锅里()-放调料()-起锅()面向对象分析问题域,抽象出对象(类):锅、水、面、调料分析每个对象的属性、方法:例如:锅.加热()水.加热()面.煮()分析对象之间的关系:锅包含水、面、调料,面向过程和面向对象,用面向对象的设计思想分析下句话。开车去北京。,Java与面向对象,对象:对问题域中事物的描述,是Java的核心,在Java程序中“万物皆对象”。对象是静态属性(成员变量)和动态属性(方法)的封装体。类:同种对象的抽象,类中定义这一类对象所具有的静态和动态属性。类可以看成一类对象的模板,对象可以看成该类的一个具体实例。举例:用代码实现“开车去北京”。,Java与面向对象,学生,对象,抽象,实例化,题外话:为什么用面向对象?,更接近人类自然思维过程。可重用性(reusable)、可扩展性(extensibility)。,类的定义,类的定义类修饰符class类名extends父类名implements接口名成员变量定义;方法定义;,类的定义,类修饰符(Modifier):public:允许其他类(没有限制)访问本类,一个源文件仅可以有一个public类。缺省:可被当前包中的其他类访问。abstract:没有实例的抽象概念类,是它的所有子类的公共属性和公共方法的集合。final:不能再被扩展,不能有子类的类;易于安全性的实现,或用于创建固定功能的类。,类的定义,例:publicabstractclassshapeclassrectangleextendsshapefinalclassroundrectextendsrectangle注意:final可以与abstract一起使用吗?,成员变量,声明成员变量(member)的语法修饰符数据类型变量名;引用:对象名.变量名修饰符访问控制符public:可被所有其他类引用private:仅可被该类自身引用和修改,不能被其他任何类(包括该类的子类)引用,它提供了最高级别的保护。,成员变量,protected:该类自身、子类、同一包中的其他类static:类成员变量,对所有的实例一致,引用时前缀可使用类名或对象名final:数值不变常量,定义同时应对其进行初始化,成员变量,publicclassMemberVarprivateinti;publicintj;protectedintk;staticints;finalintf=1;publicstaticfinalintMAX=100;,方法,方法定义对类内成员变量(数据)的操作方法的声明语法:修饰符返回类型方法名(参数列表)throws例外名方法体;方法是类的动态属性,标志了类所具有的功能和操作,方法,方法定义规则方法名后的小括号是方法的标志。形式参数是方法从调用它的客户代码输入的数据。返回值是方法在操作完成后返还给调用它的客户的数据。要指定方法返回值类型。如没有返回值,类型要写void方法名相同,但参数不同,是不同的方法。与类名相同的所有方法都是类的构造方法。,方法,在方法中定义的变量称为局部变量。其生命周期:执行进入方法体时建立,退出方法时撤消。局部变量使用之前必须初始化。在方法体中可以访问所有的类属性,可以调用所有类中定义的方法。方法可以递归调用。,类的定义举例,实例:定义“学生”类。publicclassStudentprivateStringid;privateintage=0;privateStringname;publicStringgetId()returnid;publicintgetAge()returnage;publicStringgetName()returnname;publicvoidsetAge(inti)age=i;,对象的引用,Java中除基本数据类型之外的变量都是引用数据类型。Java中的对象是通过引用操作。classTestpublicstaticvoidmain(Stringargs)Students;s=newStudent();System.out.println(s.getId();,s:xxxx,id:0,name:null,age:0,对象的创建和使用,必须使用new关键字创建对象(分配空间)。使用对象(引用).成员变量来访问对象的成员变量。使用对象(引用).方法来调用对象的方法。同一类的每个对象有不同的成员变量存储空间。同一类的每个对象共享该类的方法。,类和对象的内存分析,CodeSegment,类A的代码classAinti;intj;mainAa1=newA();Aa2=newA();,Stack,Heap,a1:xxx,a2:yyy,构造方法,当new一个对象实际上调用了类的构造方法。构造方法用来初始化对象的成员变量。构造方法与类名同名,且没有返回值。,构造方法,publicclassStudentintid;intage;publicStudent(inti,inta)id=i;age=a;publicstaticvoidmain(Stringargs)Students=newStudent(1,2);分析内存,id:1,age:2,s:xxxx,构造方法,默认构造方法:如果没有显式定义一个构造方法,那么系统将调用默认构造方法。Student()如果显式定义了构造方法,那么默认构造方法将不起作用。Student(inti,inta)id=i;age=a;,分析内存,构造函数的应用实例引用类型的交换方法,myname:xxx,s:good,me:yyy,id:20,name:xxx,age:1,a1:xxx,id:1,a2:yyy,id:2,题外话:指针的传递(C语言),指针可以更改指向的数据值voidadd(int*_p)*_p=*_p+1;intmain()inti=1;int*p=,题外话:指针的传递(C语言),可以更改指针指向吗?voidsetNull(int*_p)_p=NULL;intmain()inti=1;int*p=,题外话:指针的传递(C语言),通过二级指针改变指针指向voidsetNull(int*_p)*_p=NULL;intmain()inti=1;int*p=,类之间的关系(UML类图描述),UML(UnifiedModelingLanguage)常用的UML建模工具软件:rationalroseUML包括:用例图、类图、对象图、状态图、时序图、协作图、活动图、组件图、配置图。,类之间的关系(UML类图描述),UML类图(ClassDiagrams),类之间的关系(UML类图描述),依赖关系(dependency)可以理解为一个类A使用了另外一个类B。这种关系是具有偶然性的、临时性的、弱的关系。类B的变化会影响到A。,类之间的关系(UML类图描述),依赖关系(dependency),类之间的关系(UML类图描述),classMousepublicvoidcry()System.out.println(Damnit!);publicclassCatpublicvoidcatchMouse(Mousem)m.cry();publicstaticvoidmain(Stringargs)Mousem=newMouse();Catc=newCat();c.catchMouse(m);,类之间的关系(UML类图描述),关联关系(Associations),publicclassPersonprivateCarmycar;publicPerson()mycar=newCar();publicvoidgotoYanji()mycar.run();publicstaticvoidmain(Stringargs)Personp=newPerson();p.gotoYanji();classCarpublicvoidrun()System.out.println(carisrunning.);,类之间的关系(UML类图描述),聚合(aggregation)聚合是关联关系的一种特例,体现的整体与部分、拥有的关系、即has-a的关系。但是整体和部分可以分离,有各自的生命周期,例如家庭和人的关系,公司与员工的关系等。,类之间的关系(UML类图描述),聚合(aggregation),类之间的关系(UML类图描述),聚合(aggregation)publicclassFamilyprivateCollectionpersons;,类之间的关系(UML类图描述),组合(Composition)组合也是关联关系的一种特例,体现的是contains-a的关系,这种关系比聚合更强。同样体现整体和部分的关系,但是整体和部分是不可分的。整体的生命周期结束意味着部分的部分周期也结束。,类之间的关系(UML类图描述),组合(Composition),类之间的关系(UML类图描述),继承(Inheritance)继承是指一个类扩展另一个类的功能,通常能表示is-a关系。除了包含父类的已有属性、方法外还可以增加自己的属性和方法。继承是面向对象程序设计语言的重要特性。,类之间的关系(UML类图描述),继承(Inheritance),类之间的关系(UML类图描述),继承(Inheritance)publicclassPersonprivateStringid;privateStringname;publicvoideat()System.out.println(吃饭,请勿打扰);publicclassStudentextendsPersonprivateStringstu_id;publicvoidstudy()System.out.println(学习中);publicclassTeacherextendsPersonprivateStringjob_No;publicvoidteach()System.out.println(上课中);,类之间的关系(UML类图描述),实现(implements)指的是一个类(class)实现一个接口(interface)。接口用来定义一组抽象操作的集合。实现(implements)一个接口的类必须实现接口中规定的所有方法。,类之间的关系(UML类图描述),实现(implements),类之间的关系(UML类图描述),实现(implements)publicinterfaceMovablepublicvoidrun();publicclassCarimplementsMovablepublicvoidrun()System.out.println(四轮驱动.);publicclassPersonimplementsMovablepublicvoidrun()System.out.println(两条腿走路.);,this,在类的方法定义中使用的this关键字代表使用该方法的对象的引用。要指出当前方法是属于哪个对象的时候可以使用this来指示。this可用来处理形参和成员变量重名的问题。this里面存储的是当前对象的引用值。实例:ThisTest.java,a1:xxx,a2:yyy,this:yyy,this:xxx,this,实例:案例3.10教材,x:xxx,i:3,this:xxx,xxx,xxx,xxx,static,static修饰成员变量静态变量为类的各对象共享的变量。位于数据区(datasegment)中。static成员变量只有一份副本。实例:StaticTest.java,stack,heap,datasegment,static,static修饰方法static声明的方法为静态方法。可以通过对象引用或类名访问static方法。静态方法中不能访问非静态成员变量,而只能访问静态成员(static方法-static成员变量)。静态方法中不能直接使用本类中的非静态方法,只能使用其他的static方法。static方法中没有this值。实例:StaticMethod.java,单件模式(Singleton),有些对象只需要一个,例如:线程池、注册表、游戏中的记分牌对象。怎样保证在整个应用程序范围内,只有一个类的实例?,单件模式(Singleton),第一步、屏蔽构造方法privateSingleton()第二步、提供另外的方法、返回类的实例。publicstaticSingletongetInstance()returnnewSingleton();第三步、用一个静态变量来记录Singleton的唯一实例,并用getInstance()控制。,单件模式(Singleton),classSingletonprivatestaticSingletonme;privateSingleton()publicstaticSingletongetInstance()if(me=null)me=newSingleton();returnme;,单件模式(Singleton),单件模式:用来创建独一无二的对象。,单件模式(Singleton),恭喜你,学会了第一个模式!推荐书籍:HeadFirst设计模式敏捷软件开发:原则、模式与实践,继承,java中通过extends实现继承。类修饰符class类名extends父类名成员变量定义;方法定义;子类继承父类的非私有属性和方法,还可以定义新的属性和方法,改写父类的方法。Java只支持单继承,不允许多继承。,继承,实例:classParentpublicintpub_var=1;privateintpri_var=2;protectedintpro_var=3;intvar=4;classChildextendsParentpublicvoidm()pub_var=2;pri_var=3;pro_var=4;var=5;,继承,继承的内存分析:PersonStudentTest.java,s:xxx,name:kim,age:20,stu_id:01060521,s:xxx,name:kim,age:20,stu_id:01060521,this:,this:xxx,继承,继承中的变量隐藏子类中在不定义任何成员变量的情况下拥有父类的所有非private的成员变量。classAintx=1;classBextendsAprt()System.out.println(x);如果子类中定义一个与父类中的变量完全相同的变量,那么称子类的变量隐藏了父类的变量。classAintx=1;classBextendsAintx=100,继承,继承中的变量隐藏如何访问被隐藏的父类变量?调用父类的方法来访问父类的变量。使用super.变量名显式地访问父类变量。例:VarHide.java(分析内存),a:xxx,x:1,b:yyy,x:1,x:1,x:100,super:,this:yyy,a:xxx,x:1,b:yyy,x:1,x:100,super:,this:,继承,方法覆盖(overriding)classVehiclepublicvoidrun()System.out.println(交通工具在走动);classCarextendsVehicleclassPlaneextensVehicleclassTestpublicstaticvoidmain(Stringargs)Carc=newCar();Planep=newPlane();c.run();,继承,方法覆盖(overriding)子类可以把从父类那里继承来的某个方法改写,形成同父类方法同名、解决的问题也相似、但具体实现和功能却不尽一致的新方法。classAvoidprt()System.out.println(A)classBextendsAvoidprt()System.out.println(B);,继承,方法覆盖(overriding)方法覆盖的条件:完全相同的方法名完全相同的参数列表完全相同类型的返回值注意:在满足上述三个条件同时,还必须保证:访问权限不能缩小,抛出的异常要相同三个条件有一个不满足,就不是方法的覆盖,而是子类自己定义与父类无关的方法,父类的方法未被覆盖,因而仍然能访问。调用父类被覆盖的方法super.方法名例:Overriding.java,继承,方法覆盖(overriding)抽象(abstract)方法的覆盖包含抽象方法的类必须是抽象的如果抽象类的子类不是抽象的,那么必须实现(覆盖)父类的抽象方法。抽象类不能被实例化,但是可以用来声明一个变量例:AbstractMethodOverriding.java,继承,继承中的构造方法(不带参数)子类或定义自己的构造方法,或使用隐含构造方法。子类没有定义构造方法时,自动继承父类不含参数的构造方法,并在创建新子类对象时自动执行。子类有自己的构造方法时,创建新子类对象时也要先执行父类不含参数的构造方法,再执行自己的构造方法。,继承,注意构造方法的调用顺序:按继承顺序依次调用父类的不含参数的构造方法,直到到达本子类依次执行本子类成员对象的构造方法最后,执行本子类的构造方法,继承,构造方法调用顺序举例:Sandwich.java调用顺序:Meal().Lunch().PortableLunch().Bread().Cheese().Lettuce().sandwich().,继承,继承中的构造方法(带参数)带参数的构造方法不会自动继承classCarpublicCar(Strings)System.out.println(s);classSaloonCarextendsCarpublicSaloonCar(Strings)System.out.println(s);,继承,解决方法一:classCarpublicCar()/加上构造方法的重载定义publicCar(Strings)System.out.println(s);classSaloonCarextendsCarpublicSaloonCar(Strings)System.out.println(s);,继承,解决方法二:classCarpublicCar(Strings)System.out.println(s);classSaloonCarextendsCarpublicSaloonCar(Strings)super(s);System.out.println(s);代码:ConstructorWithParameter.java,继承,构造方法的使用举例例:JiaoCai3_9.java,包,在大型软件系统中,解决类名冲突问题。java中引入包(package)机制,提供分层命名空间。约定俗成的包命名方式:域名倒置=packagecom.kim.项目名.模块名;,包,package用来指明该文件中定义的类所在的包。格式为:packagepk1.pk2.pk3;若不写该语句,则为无名包。加入package语句之后,包对应于文件系统中的对应目录。packagecom.kim.pk1;=类文件应位于.comkimpk1目录下,对象转型(casting),一个父类的引用类型变量可以“指向”其子类的对象。一个父类的引用不能访问其子类对象新增加的成员(属性和方法)。可以使用引用变量instanceof类名来判断该引用型变量所“指向”对象是否属于该类或该类的子类。子类的对象可以当作父类对象来使用称作向上转型(upcasting),反之称为向下转型(downcasting)。,对象转型(casting),实例一:CastingTest1.java实例二:CastingTest2.java实例三:CastingTest3.java,stack,heap,codesegment,Animalad:xxx,Duck,Animal,Animal.eat(),Duck.swim(),Duckd2:xxx,多态,多态(动态绑定)多态是指“在执行期间”(而非编译期间)判断所引用对象的实际类型,根据其实际的类型调用相应的方法。多态的三个条件继承覆盖父类的引用指向子类对象,多态,实例一:VehicleTest.java,多态,多态,实例二,BigTank,QuickTank,NormalTank,MyTank,多态,xxx,yyy,zzz,kkk,MyTank,NormalTank,QuickTank,BigTank,TankGame.java,多态,实例三:几何形状(Shape),ShapeGUI.java,Shape.java,抽象类,为什么引入抽象类?NonAbstra

温馨提示

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

评论

0/150

提交评论