2020/3/1100:201第三章类与对象武汉大学计算机学院计算机应用系第2页全面掌握面向对象的基本特征掌握如何定义一个类以及如何生成对象深入掌握方法的定义及技巧深入掌握类的访问权限与封装机制深入掌握包的定义与包的使用方法本章学习要点第3页第三章类与对象Java是一种纯粹的面向对象的程序设计语言,一个Java程序乃至Java程序内的基本单元都是对象。因此,用Java进行程序设计必须将自己的思想转入到一个面向对象的世界,以对象世界的思维方式来思考问题。编写一个Java程序就是在定义类和创建对象,也就是说定义类和建立对象是Java编程的主要任务。本章和下一章将介绍Java面向对象程序设计基础,即对象、类、子类、超类、接口、包以及类的继承等内容。第4页3.1类的建立Java的类分为两大部分:系统定义的类和用户自定义类。学习Java语言在某种程度上就是在:学习如何定义所需要的类,即学习Java程序的书写规范,熟悉和掌握语法规则;熟悉Java平台定义了哪些经常要用到、而且满足我们需要的类。Java的类库就是系统定义的类,它是系统提供的已实现的标准类的集合,提供了Java程序与运行它的系统软件(Java虚拟机)之间的接口。第5页3.1.1类的概念与定义用面向对象的观点来看,世界上的一切事物都是对象。而物以“类”聚,所以这些对象可以划分成各种“类”。按照面向对象的观点,一个类分为状态和行为两部分,再加上类名这一部分,可以把一个类的定义分为3个部分:IS,HAS,DOES。其具体含义是:·IS说明该类“是”什么样的一个类,即说明类的名字及其性质,如一个类的父类、修饰符等,这一部分称为类声明。·HAS说明这个类“有”些什么特征及属性,这些特征和属性用域变量来表示,这一部分统称为成员变量。·DOES说明这个类可以“做”什么,即这个类有哪些行为,这些行为用实例方法和类方法描述,这些方法统称为成员方法。第6页3.1.1类的概念与定义IS和HAS部分构成了一个类的状态,DOES就是一个类的行为,行为通过成员方法(MemberMethod)来实现。这样,定义一个类的更具体的形式为:class类名//IS{成员变量;//HAS成员方法;//DOES}在Java中,class是声明一个类的关键字,类名是要声明的类的名字,它必须是一个合法的Java标识符,习惯上用大写字母开头。第7页第8页3.1.2类声明类声明定义了类的名字以及其他的属性,说明该类是(IS)什么样的一个类。一般来说,根据声明的类的需要,类声明可以包含如下3个选项:·声明类的修饰符·说明该类的父类·说明该类所实现的接口[类修饰符]class类名称[extends父类名称][implements接口名称列表]{变量定义及初始化;方法定义及方法体;}类体,其中定义了该类中所有的变量和该类所支持的方法,分别称为成员变量和成员方法。第9页类修饰符是下列之一:[public|abstract|final]public该关键字声明的类可以在其他的任何类中使用。默认时,该类只能被同一个程序包中其他的类使用。abstract—抽象类,没有具体对象的概念类,没有具体实现功能,只用于扩展子类。例如:“鸟”,它可以派生出“鸽子”、“燕子”等具体类。final—最终类,表示该类已经非常具体,没有子类可扩展。1.类修饰符第10页在Java中,除Object之外,每个类都有一个父类。Object是Java语言中惟一没有父类的类,如果某个类没有声明父类,Java就认为它是Object的直接子类。因此,所有其他类都是Object的直接子类或间接子类。说明一个类的父类的形式为:class类名extends父类名{……//类体}其中extends子句认为是直接继承其后的父类,因此在类的分级结构中插入这个类。2.说明一个类的父类第11页接口定义了行为的协议,这些行为可以在处于各个层次的任何类中被实现。一个类要实现的一个或多个接口,可以使用关键字implements,并且在其后面给出由该类实现的接口的名字表,接口的名字表是以逗号分隔的多个接口,其形式为:implementsInterfaces1,Interfaces2,…,Interfacesk;接口可以声明多个方法和变量,但是没有这些方法的具体实现。3.说明一个类所实现的接口第12页[变量修饰符]变量数据类型变量名1,变量名2[=变量初值]…;变量修饰符:[public|protected|private|package][static][final]public、protected、private为可访问性修饰符static—说明该成员变量是类变量final—说明为常量使用成员变量的类型可以是Java中任意的数据类型,包括简单类型,类,接口,数组。在一个类中的成员变量应该是唯一的。3.1.3成员变量的声明类成员变量的定义及修饰符第13页访问控制符public:任何其它类、对象只要可以看到这个类的话,那么它就可以存取变量的数据,或使用方法。protected:同一类,同一包可以使用。不同包的类要使用,必须是该类的子类。private:不允许任何其他类存取和调用。default:(前边没有修饰字的情况)在同一包中出现的类才可以直接使用它的数据和方法.第14页访问控制符对公共类的成员变量和成员方法而言,可通过施以一定的访问权限来限定其成员的应用范围,具体范围如下:同一个类中同一个包中不同包中的子类不同包中的非子类private★default★★protected★★★public★★★★第15页访问控制符公共类和非公共类的属性和方法的访问控制表及图示见下图:BBBD默认AB+CBDpublicpublicprotected默认private类属性与方法A:所有类B:包中的类D:本类C:所有子类第16页classABCD{chardata;staticintshare_data;}classDemo{ABCDa,b,c,d;}objectachardataobjectcchardataObjectbchardatastaticintshare_dataobjectdchardata属于类的变量和方法——staticstatic在变量或方法之前,表明它们是属于类的,称为类方法(静态方法)或类变量(静态变量)。若无static修饰,则是实例方法和实例变量。类变量在各实例间共享第17页publicclassStaticVar{publicstaticintnumber=5;}publicclassOtherClass{publicvoidmethod(){intx=StaticVar.number;}}类变量的生存期不依赖于对象的实例,其它类可以不通过对象实例访问它们。甚至可以在它的类的任何对象创建之前访问。例ch3\Compare_test.java类变量第18页方法是类的动态属性。对象的行为是由它的方法来实现的。一个对象可通过调用另一个对象的方法来访问该对象。与类一样,方法也有两个主要部分:方法首部声明和方法体。方法声明的基本形式为:返回类型方法名(){……//方法体}3.1.4方法的声明与实现方法体访问等级返回类型方法名参数表方法首部声明第19页[方法修饰符]返回类型方法名称(参数1,参数2,…)[throwsexceptionList]{…statements;//方法体:方法的内容}方法修饰符[public|protected|private][static][final|abstract][native][synchronized]返回类型可以是任意的Java数据类型,当一个方法不需要返回值时,返回类型为void。参数的类型可以是简单数据类型,也可以是引用数据类型(数组、类或接口),参数传递方式是值传递。方法体是对方法的实现。它包括局部变量的声明以及所有合法的Java指令。局部变量的作用域只在该方法内部。方法声明方法的定义及修饰符第20页方法的返回类型一个方法必须声明其返回类型,如果无返回值,则必须声明其返回类型为void。当return语句带有返回值时,它与方法定义的返回类型的关系必须符合如下几种情况之一:·当方法声明的返回类型是基本数据类型时,返回值的数据类型必须与返回类型一致。·当方法声明的返回类型是一个类时,返回对象的数据类型必须是与方法声明的返回类相同的类或其子类。·当方法声明的返回类型是一个接口类型时,返回的对象所属的类必须实现这个接口。第21页方法名方法名可以是任何合法的Java标识符。(1)方法可以重载Java支持方法名重载,即多个方法可以共享一个名字。(2)重载的方法不一定返回相同的数据类型,但参数必须有所区别:·参数的类型不同。例如,doubleIt(intx)和doubleIt(Stringx)方法的两个版本的参数的类型不一样。·参数的顺序不同。这里是指一个方法有多个不同类型参数的情况,改变参数的顺序也算是一种区分方法。·参数的个数不同。第22页方法的参数一个参数是一个方法的变元,它与类的成员变量毫无关系,因此参数名可以和成员变量名相同。如果一个方法的参数名与成员变量名同名,则在这个方法中,参数隐藏了这个成员变量名,也就是说,在方法中出现的这个名字指的是参数名,而不是成员变量名。ClassCircle{intx,y,radius;publicCircle(intx,inty,intradius){this.x=x;this.y=y;this.radius=radius;}}第23页方法的参数传递Java的参数传递方式是传递值,也称为“值传递”。对于这种值传递方式要区分如下两种情况:(1)当参数变元是一个简单类型时,值传递意味着这个方法不能改变参数变元的值。(2)当参数变元是一个引用类型时,值传递意味着这个方法不能改动这个对象的引用,但是方法可以调用该对象的方法来修改该对象中可访问的变量。第24页方法体(1)null变量null是一个“空”变量,用于指代某一个对象,但这个对象没有相应的实例。例如:Stackstack=null;(2)this变量this表示的是当前类的当前对象本身,更准确地说,this代表了当前对象的一个引用。(3)super变量super表示的是当前对象的直接父类对象的引用。所谓直接父类是相对于当前对象的其他“祖先”类而言的,(4)局部变量在方法体中,可以声明多个变量,它们在该方法内部使用。第25页变量的作用域方法参数的作用域局部变量的作用域异常处理参数的作用域成员变量的作用域第26页类方法类方法独立于该类的任何对象,其他的类不用实例化即可调用它们。类方法可以调用其它的类方法类方法只能访问static变量类方法不能以任何形式引用this和superpublicclassGeneralFunction{publicstaticintaddUp(intx,inty){returnx+y;}}publicclassUseGeneral{publicvoidmethod(){inta=9;intb=10;intc=GeneralFunction.addUp(a,b);//通过类名GeneralFunction引用addUp方法}}第27页不正确的引用:classStaticError{Stringmystring=“hello”;publicstaticvoidmain(Stringargs[]){System.out.println(mystring);}}编译时错误信息:nonstaticvariablemystringcannotbereferencedfromastaticcontext为什么不正确:只有对象的方法可以访问对象的变量。正确的引用同一个类中的方法可以访问该类