第04,5章-Java的面向对象特性_第1页
第04,5章-Java的面向对象特性_第2页
第04,5章-Java的面向对象特性_第3页
第04,5章-Java的面向对象特性_第4页
第04,5章-Java的面向对象特性_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

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

文档简介

4-5章Java的面向对象特性QQ:66459753Email:66459753@重庆师范大学计算机学院王艳霞1内容Java的类Java的对象构造方法2面向过程的设计思想和面向对象的设计思想我要回家面向过程开车、挂档、踩油门、…面向对象我命令车回家车怎么去的不关我的事信息封装在车这个类的内部不用去了解整个开车的过程3一个问题老李养了两只狗,一只黑狗,叫小黑,颜色黑色,年龄4岁;一只黄狗,叫小黄,颜色黄色,年龄10岁。要求编写程序,输入狗的名字,如有这只狗,显示其信息,没有就提示错误。dogInfo.java4面向对象编程思想

从现实世界中客观存在的事物出发来构造软件系统,并在系统的构造中尽可能运用人类的自然思维方式面向对象更加强调运用人类在日常的思维逻辑中经常才赢的思想方法与原则,如类,对象、继承,聚合,多态等5类与对象的概念类是同种对象的集合与抽象,类中定义了这一类对象所应具有的静态和动态属性。对象用计算机语言对问题域中事物的描述,对象通过“属性(attribute)”和“方法(method)”来分别对应事物所具有的静态属性和动态属性

对象是属性(成员变量)和方法的集合。{一类事物的具体的某一个东西(符合这类事物的具体特征的某个东西)

叫对象}

类与对象的关系:类可以看成一类对象的模板,对象可以看成该类的一个具体实例,瓶子是一个类,某个瓶子就是对象

类对象职员职员-姓名-年龄-目前工资+显示姓名()+显示年龄()+修改姓名()+领取工资()职员A:职员姓名=A年龄=30目前工资=800职员B:职员姓名=B年龄=350目前工资=900实例化实例化抽象6封装什么是封装?封装是把抽象出来的数据和对数据的操作封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作才能对数据进行操作私有数据方法方法数据对象A对象B公有数据举例子Packaging.java7继承关系(一般和特殊)8Java与面向对象

对象是Java程序的核心,在java程序中“万事万物皆对象”。对象可以看成静态属性(成员变量)和动态属性(方法)的封装体类是用来创建统一类型的对象的“模板”,在一个类中定义了该类对象所应具有的成员变量以及方法J2SDK提供了很多类供编程人员使用,编程人员也可以自定义自己的类9类的定义类定义的格式

[public][abstract|final]

classclassName[extendssuperclassName]

[implementsinterfaceNameList]

{

…//类体,包括定义类的成员变量和方法}publicclassPerson{privateintid;privateintage=20;publicintgetAge(){returnage;}}publicclassStudentextendsPerson{ intSno;Stringschoolname;publicvoidGotoSchool(){。。。。}

}10成员变量的定义成员变量的定义格式:[修饰符]类型成员变量名[=默认值];如privateintid;publicStringname=“小花”;11成员变量成员变量可以使用java语言中任何一种数据类型(包括基本类型和引用类型),作用范围为整个类体定义成员变量时可以不初始化,java系统会给你赋初始值成员变量的作用域是整个类体注意:局部变量必须赋初试值才可以使用

看例子dog.java12引用类型除了java语言中基本类型以外的变量类型Java中的对象是通过引用对其操作的例子StringS

/*声明string类型的引用变量,但是没使它指向一个对象*/S=newString(“helloworld!”);/*使用new语句创建一个String类型的对象并用S指向它,以后可以通过S完成对其的操作*/

NULL内存0x3a123bhelloworld!堆内存13成员方法定义成员方法的定义格式[修饰符]返回值类型方法名([参数列表]){

java语句;。。。//方法体}语法解释:(1)形式参数:在方法被调用时用于接收外界输入的数据。(2)实参:调用方法时实际传给方法的数据。(3)返回值:方法在执行完毕后返回给调用它的环境的数据。(4)返回值类型:事先约定的返回值的数据类型,无返回值,必须给出返回类型viod。14成员方法定义Java语言中使用下述形式调用方法:

对象名.方法名(实参列表)实参的数目、数据类型和次序必须和所调用方法声明的形式列表匹配。return语句终止方法的运行并指定要返回的数据。Java中进行函数调用中传递参数时,遵循传递的原则:基本类型传递的是该数据本身,引用类型传递的是对象的引用,不是对象本身15引用实例化对象或对象的创建和使用

创建一个对象有两种方法

(1)先声明再创建

对象声明:类名对象名对象创建:对象名=new类名()

(2)一步到位法:

类名对象名=new类名();

使用:对象(引用).成员变量来引用对象的成员变量使用:对象(引用).方法(参数列表)来调用对象的方法16对象的创建和使用同一类的每个对象有不同的成员变变量存储空间同一类的每个对象共享该类的方法例子Person.java17类和对象的关系(内存)如何在内存中区分类和对象?(1)类是静态的概念,代码区(2)对象是new出来的,位于堆内存,类的每个成员变量在不同的对象中都有不同的值(除了静态变量)而方法只有一份,执行的时候才占用内存18类和对象的关系(内存)类C的代码(codeseg) (heapseg)XXXXXXXXXXXXXXC1.iC1.jC2.iC2.jC1C2ClassC{ inti; intj;….main…{Cc1=newC();Cc2=newC();}}19构造方法

构造方法是定义在java类中的一个用来初始化对象的方法构造方法名字与类的名字相同,大小写也保持一致使用new+构造方法创建一个新的对象构造函数与类同名且没有返回值。即便是void也不能写注意:当无指定构造函数时,编译器为类自动添加形为:类名(){}的构造方法

20构造方法例如:Person类的构造函数publicclassPerson{ intid; intage=20; Person(int_id,int_age){ id=_id age=_age; }}

21创建对象时,使用构造函数初始化对象的成员变量。PublicclassTest{ Publicstaticvoidmain(String[]agrs){ Persontom=newPerson(1,25); Personjrry=newPerson(1,27); }}构造方法TOMjrryXXXX####

堆内存12512722内存详细过程详解

Tom:xxx_id:1_age:25调用构造函数(方法局部变量)new一个Person对象调用完成后方法、局部变量消失Id:1age:25栈内存堆内存23构造方法当无指定构造函数时,编译器为类自动添加形为:类名(){}的构造方法

publicclassPerson{ intid; intage=20;}Personp=newPerson()

一旦自己定义了构造方法,系统就不会再给默认构造方法了24约定俗成的命名规则类名的首字母大写变量名和方法名的首字母小写运用驼峰标示25总结方法Java的方法类似于其他语言的函数,是一段用来完成特定功能的代码片段,声明格式:

[修饰符1修饰符2…]返回值类型方法名(形式参数列表){java语句;…;…;}形式参数:在方法被调用时用于接收外界输入的数据。实参:调用方法时实际传给方法的数据返回值:方法在执行完毕后返还给调用它的环境的数据返回值类型:事先约定的返回值得数据类型,如无返还值,必须给出返回值类型void26总结方法Java语言中使用下述形式调用方法:

对象名.方法名(实参列表)实参的数目、数据类型和次序必须和所调用方法声明的形参列表匹配Return语句终止方法的运行并制定要返回的数据Java中进行函数调用中传递参数时,遵循值传递的原则:基本类型传递的是该数据值本身。引用类型传递的是对对象的引用,而不是对象本身。27创建Java应用程序一个java应用程序通常由一个或多个类构成,但其中只能有一个类作为整个应用程序执行的起点,称之为主类。主类的类名必须与Java文件名相同,且必须含有main()方法,main()方法必须被声明为public,static,void,具体格式如下:publicstaticvoidmain(Stringargs[]){//方法体}28创建Java应用程序main(Stringarg[])方法可以从命令行接收一个或多个参数,这些参数作为字符串依次被传递并存入数组arg[]中。看例子MainTest()29复习:对象的创建和使用必须使用new关键字来创建对象对象(引用).成员变量来引用对象的成员变量对象(引用).方法(参数列表)来调用对象的方法同一类的每个对象有不同的成员变变量存储空间同一类的每个对象共享该类的方法非静态变量是针对每个对象进行调用30例子的分析Chap04/BirthDay(看DOC文档)Exercise/TestCircle.java31课堂练习定义一个点(Point)类用来表示三维空间中的点(有三个坐标)。要求如下1.可以生成具有特定坐标的点对象(构造函数)2.提供可以设置三个坐标的方法(修改坐标值)3.提供可以计算该点到原点距离平方的方法4.编程序为Cricle类添加一个方法,计算一个点(Point对象)是否在圆(Cricle对象)内,并写程序验证。

32重载overload什么是方法的重载(编译时多态性)?在同一个类中至少有两个方法用同一个名字,但有不同的参数个数或参数类型,调用时会根据不同的参数表选择对应方法。类voidshow(intint_num)voidshow(doubledouble_num)voidshow(nitnit_um,floatfloat_um)1231.23123,1.2333重载overload例子TestOverLoad/test.java构造函数的重载(例子TestOverLoad.java)34this关键字

在类的方法定义中使用this关键字代表使用该方法的对象引用当必须指出当前使用方法的对象是谁时要使用this有时使用this可以处理方法中成员变量和参数重名情况this可以看做一变量,它的值是当前对象引用例子TestThis画图35使用类成员(Static)在类中,static声明的成员变量为静态成员变量,它为该类的公用变量,在第一次使用时被初始化,对该类的所有对象来说,static成员变量只有一份。用static声明的方法为静态方法,在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可访问非static的成员。-----静态方法不再是针对某个对象调用,所以不能访问非静态成员可以通过对象引用或者类名(不需实例化)访问静态成员。Cat.java36包java引入包(package)机制提供类的多重类命名空间。package语句作为java源文件第一句,指明该文件定义的类所在包。若缺省该语句,则指定为无名包)。它的格式为:packagepkg1[.pkg2[.pkg3….]];约定俗成的命名:com.域名.xxxjava编译器把包语句对应于文件系统的目录管理,package语句中使用”.”点指明包(目录)层次如.sxt;指的是该文件中所有类位于.\com\sxt目录下Java引入import机制简化包的引入TestPackage37包-总结声明包:package.pkg.xxx而编译好的文件xx.class必须位于正确目录下pkg\xxx\... 使用包,在另一个类中使用包中的类,必须写全名称,也可以用import关键词,在文件开头引入要使用的类,如importcom.bjsxt.java.*;注意:访问位于同一个包中的类不需要引入可以不需要用import语句而直接使用java.lang包中的类必须class文件的最上层包的父目录位于classpath下38J2SDK中主要包的介绍

Jdk目录下jre\lib\rt.jar里面包含运行时需要的所有class文件:就是一个classpathJava.langjava语言的核心类,如String、Math、integer、System和thread,提供常用功能Java.awt构成抽象窗口工具集(abstractwindowtoolkits)的多个类,这些类被用来构件和管理应用程序的图形用户界面(GUI)J执行与网络相关的操作的类Java.io提供多种输入/输出功能的类Java.util一些实用工具类,如定义系统特性、使用与日期日历相关的函数打包语句:在classpath的testpackage目录下输入:jar–cvftest.jar*.*39类的继承Java中使用extends关键字实现类的继承机制。语法为:<modifier>class<name>[extends<superclass>]{……}通过继承,子类自动拥有了基类(父类)(superclass)的所有成员(成员变量和方法)java只支持单继承,不允许多继承:一个子类只能有一个基类一个基类可以派生出多个类classParent{privateintn_private=1;intfriendly=2;}classChildextendsParent{publicvoidf(){n_private=1;friendly=20;}}TestPerson.java40类及成员修饰符Java权限修饰符publicprotectedprivate置于类的成员定义前,用来限定其他对象对该类对象成员的访问权限修饰符类内部同一个包子类任何地方private√default√√protected√√√public√√√√对于class的权限修饰值可以用public和default1.公开:public类可以在任意地方被访问2.默认:default类只可以被同一个包内部的类访问TestAccess.java41重写(overridden)在子类中可根据需要对基类中继承来的方法进行重写就是说对父类中的方法不满意需要自己重新写重写方法必须和被重写方法具有相同方法名称、参数列表和返回值重写方法不能使用比被重写方法更严格的访问权限TestOverWrite.java42Super用super来引用当前基类(父类)的成分就是说子类继承父类时,父类的某个方法虽然完成的不是很好但是也完成了部分功能不必重写,就用super.f()调用父类的相应方法,再接着写你想实现的功能cc::xxxValue:100Value:200thissuperTestSuper/TestInherit.java43继承中的构造方法

子类的构造过程中必须调用基类的构造方法。子类可在自己的构造方法中使用super(argument_list参数列表)调用基类的构造方法。---如果调用super.必须写在子类构造方法第一行---使用this(argument_list)调用本类的另外构造方法如果子类构造方法中没有显示的调用基类构造方法则系统默认调用基类无参数的构造方法。如果子类构造方法既没有显示地调用基类构造方法,而基类中又没有无参数的构造方法,则编译出错TestSuper/TestSuperSub.java44练习classA{protectedvoidprint(Strings){System.out.println(s);}A(){print(“A()”);}publicvoidf(){print(“A:f()”);}}classBextendsA{B(){print(“B()”);}publicvoidf(){print(“B:f()”);}publicstaticvoidmain(Stringarg[]){Bb=newB();b.f();}}分析输出结果,体会一般方法和构造方法在继承中的区别把TestTeacher.java拷给学生,自己分析45对象转型(casting)一个基类的引用类型变量可以指向其子类的对象一个基类的引用不可以访问其子类对象新增加的成员(属性和方法)可以使用引用变量instanceof类名来判断该引用类型变量所指向的对象是否属于该类或该类的子类子类的对象可以当作基类的对象来使用称作向上转型(upcasting),否则称作向下转型(downcasting)46对象转型(casting)例子1classAnimal{ publicStringname; Animal(Stringname){ =name; }}classCatextendsAnimal{ publicStringeyesColor; Cat(Stringn,Stringc){ super(n);eyesColor=c; }}classDogextendsAnimal{publicStringfurColor;Dog(Stringn,Stringc){ super(n);furColor=c;}}47对象转型(casting)例子1publicclassTest{ publicstaticvoidmain(Stringarg[]){ Animala=newAnimal("name"); Catc=newCat("catname","blue"); Dogd=newDog("dogname","black");

System.out.println(ainstanceofAnimal);//true System.out.println(cinstanceofAnimal);//true System.out.println(dinstanceofAnimal);//true System.out.println(ainstanceofCat);//false

a=newDog("bigyellow","yellow"); System.out.println(); //System.out.println(a.furColor); System.out.println(ainstanceofAnimal);//true System.out.println(ainstanceofDog);//true

Dogd1=(Dog)a; System.out.println(d1.furColor); }}48对象转型(casting)例子2publicclassTest1{ publicstaticvoidmain(Stringarg[]){ Test1test=newTest1(); Animala=newAnimal("name"); Catc=newCat("catname","blue"); Dogd=newDog("dogname","black"); test.f(a);test.f(c);test.f(d); }

publicvoidf(Animala){System.out.println("name:"+);if(ainstanceofCat){Catcat=(Cat)a;System.out.println(""+cat.eyesColor+"eyes");}elseif(ainstanceofDog){Dogdog=(Dog)a;System.out.println(""+dog.furColor+"fur");}}}49多态性是由封装性和继承性引出的面向对象程序设计语言的另一特征。静态多态性(编译时多态〕由方法重载(overload)实现动态多态性(运行时多态)在执行期间(非编译期)判断所引用对象实际类型,根据其实的类型调用其相应的方法

TestPolymoph/test.java总结:多态存在的条件:有继承,有重写,父类引用指向子类对象。一旦满足,当调用父类里被重写的方法时,实际new的哪个子类对象,就调用子类对象方法。50抽象类与抽象方法用abstract来修饰的类/方法规则:含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须重写抽象类不能被实例化抽象方法只需声明而不需实现TestAbstract\Test.java51final关键字final的变量的值不能够被改变final的成员变量final的局部变量(形参)final的方法不能够被重写final的类不能够被继承如:publicfinalclassString类publicfinalvoidm()方法finalintI=9成员/局部变量TestFinal.java52接口/interface

接口是抽象方法和常量值的定义的集合从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。接口定义举例:

publicinterfaceRunner{(publicstaticfinal)intid=1;public(abstract)voidstart();//抽象类,不需要实现public(abstract)voidrun();public(abstract)voidstop();53接口/interface接口特征接口可以多重实现;接口中声明的属性必须为publicstaticfinal的,可以不写;接口中只能定义抽象方法,而且这些方法必须为publicabstract的;接口可以继承其他的接口,并添加新的属性和抽象方法;与继承关系类似,接口与实现类之间存在多态性*接口之间可以相互继承,类之间也可以相互继承而类只能实现接口对象实现接口的时候一定要把接口中的方法定义54接口/interface接口规则多个无关类可以实现同一接口一个类可以实现多个无关接口与继承关系类似接口与实现类之间存在多态性定义Java类的语法格式:<modifier>classclassname[extends<sopclass>][implements<interface>[,interface,…]]{}Testinterface/test.java55接口/interface联系Testinterface/Valuable.java56类java.lang.ObjectObject类是所有Java类的根基类如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类例子publicclassPerson{}publicclassPersonextendsObject{}

57类java.lang.Object该类定义了一些所有对象最基本的状态和行为equals():比较两个对象(引用)是否相同,如果相同返回true,否则返回false。相当于操作符“==”;getClass():返回对象运行时所

温馨提示

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

评论

0/150

提交评论