第五章Java面向对象编程基础类:现实世界中实体的抽象集合。5.1定义类定义类的过程就是定义类的属性和服务的过程;类的属性就是类的静态属性的简称,指类内包含的各项数据。类的服务则被称为成员函数或方法。类的一般语法结构为:[修饰符]class类名[extends父类][implements接口名]{类成员变量声明;类方法声明;}1.声明类头类头部分关键字class标志着一个类定义的开始,class后面跟着新定义类的类名,类名由编程者命名,命名原则要遵从Java对标识符的有关规定,并体现该类主要功能或作用。(1)父类名父类名跟在extends关键字后面,用来说明当前类是已经存在的哪个类的子类。这个已经存在的类可以是Java类库中定义的类,也可以是同一个程序或其他程序中已定义好的类。通过定义继承关系,子类可以获得父类的所有属性和方法。classEmployee{//雇员类,包含所有雇员都有的属性intm_EmpNo;//雇员号intm_DeptNo;//雇员所在部门号}//一般雇员,有上司编号classCommonEmployeeextendsEmployee{intm_ManagerNo;//上司编号}//主管,有秘书编号classManagerEmployeeextendsEmployee{intm_SecretaryNo;//秘书编号}(2)接口名接口名跟在implements关键字后面,用来说明当前类中实现了哪个接口定义的功能和方法。接口是Java语言用来实现多重继承的一种机制。(3)修饰符类的修饰符用来说明类的特殊性质,分为访问控制符抽象类说明符最终类说明符2.声明类体类头定义了类的性质,类体则定义了类的具体内容,包括类的属性和方法。(1)类的属性一个类的属性描述了该类内部的信息,又称为类的静态属性。类属性为简单变量:[修饰符]变量类型变量名[=变量初值]类属性为对象的语法:[修饰符]类名对象名[=new类名(实际参数列表)]注:若使用另一个类的对象作为当前所定义的类的属性,则一定要保证这“另一个类”在当前类中是可见的,即它可以被当前类所引用。类属性的修饰符包括:访问控制符静态修饰符static最终修饰符final易失修饰符volatile过渡修饰符transient。(2)类的方法类的方法,又称为成员函数,用来规定类属性上的操作,实现类的内部功能的机制,同时也是类与外界进行交互的重要窗口。Java中声明方法的语法:[修饰符]返回值类型方法名(参数列表)Throws例外名1,例外名2,……{方法体:局部变量声明;语句序列;}方法的修饰符包括:访问控制符静态修饰符static抽象修饰符abstract最终修饰符final同步修饰符synchronous本地修饰符native。类中定义的方法通常起到两种作用:一是围绕着类的属性进行各种操作;二是与其他的类或对象进行数据交流、消息传递等操作。5.2创建类的实例对象创建对象使用关键字运算符new。类名对象名=new类名(参数);例5.15.3构造函数构造函数是类的一种特殊方法,它的特殊性主要体现在如下的几个方面:构造函数的方法名与类名相同。构造函数没有返回类型。构造函数的主要作用是完成对类对象的初始化工作。在创建一个类的新对象的同时,系统会自动调用该类的构造函数为新对象初始化。注:Java在声明类时,可以不定义构造函数,系统会自动为该类生成一个默认的构造函数。此时这个构造函数的名字与类名相同,没有任何形式参数,也不完成任何操作。5.4访问控制修饰符在定义类、属性和方法时,所有修饰符被放在语句的最前面。若有一个以上的修饰符同时修饰这个类、属性和方法,则将这些修饰符并列并用空格互相隔开。修饰符1…修饰符Nclass类名{…}修饰符1…修饰符N数据类型属性名;修饰符1…修饰符N方法返回值类型方法名(形式参数列有){…}类的访问控制符只有一个public属性和方法的访问控制符有:publicprivateprotectedprivateprotected1.公共访问控制符public对于同一个包中的类可以不需任何说明而方便地互相访问和引用。在不同包中的类,只有它们都声明为public时,然后再在程序头部声明import后才可以被访问和引用相应的类。注:用public修饰的类的属性称为公共属性,如果公共属性属于一个公共类,则它可以被所有的其他类所引用。public修饰符会造成安全性和数据封装性下降,应尽量减少public属性的使用。一个类作为整体对程序的其他部分可见,并不能代表类内的所有属性和方法也同时对程序的其他部分可见,前者只是后者的必要条件,类的属性和方法能否为所有其他类所访问,还要看这些属性和方法自己的访问控制符。类中被设定为public的方法是这个类对外的接口部分,程序的其他部分通过调用它们达到与当前类交换信息、传递消息甚至影响当前类的作用。2.缺省访问控制符缺省访问控制符规定该类只能被同一个包中的类访问和引用,而不可以被其他包中的类使用。这种特性又称为包访问性。类内的属性和方法如果没有访问控制符来限定,也说明它们具有包访问性,可以被同一个包中的其他类所访问和调用。3.私有访问控制符private用private修饰的属性或方法只能被该类自身所访问和修改,而不能被任何其他类,包括该类的子类来获取和引用。当其他类想要获取这些私有成员时,需要借助于类的方法来实现。4.保护访问控制符protected用protected修饰的成员变量可以被三种类所引用:该类自身、与它在同一个包中的其他类、在其他包中的该类的子类。使用protected修饰符的主要作用是允许其他包中的它的子类来访问父类的特定属性。5.私有保护访问控制符privateprotectedPrivate和protected按顺序连用构成一个完整的访问控制符:私有保护访问控制符。用此修饰符的成员变量可以被两种类访问和引用:一种是该类本身;二是该类的所有子类,不管这些子类是否与该类在同一个包中。类属性与方法public缺省publicABprotectedB+CB缺省BBPrivateprotectedC+DE+DprivateDD5.5静态属性、静态方法与静态初始化器1.静态属性被static修饰的属性称为静态属性,这类属性的一个最本质的特点是:它们是类的属性,而不属于任何一个类的具体对象。静态属性是一个公共的存储单元,任何一个类的对象访问它时,取到的都是相同的数值,同样任何一个类的对象去修改它时,也都是在对同一个内存单元做操作。见例ch05/Employee.java2.静态方法static修饰符修饰的属性是属于类的公共属性;用static修饰符修饰的方法是属于整个类的方法;不用static修饰符修饰的方法是属于某个具体类对象或实例的方法。声明一个方法的static至少有三重含义:调用这个方法时,应该使用类名做前缀,而不是某一个具体的对象名;非static的方法是属于某个对象的方法,在这个对象创建时对象的方法在内存中拥有自己专用的代码段;而static的方法是属于整个类的,它在内存中的代码段将随着类的定义而分配和装载,不被任何一个对象专有;Static方法只能处理static类型的数据。3.静态初始化器静态初始化器是由关键字static引导的一对大括号括起的语句组。静态初始化器与构造函数的三点区别:(1)构造函数是对每个新创建的对象初始化,而静态初始化器是对每个类进行初始化;(2)构造函数是在用new运算符产生新对象时由系统自动执行,而静态初始化器则是在它所属的类加载入内存时由系统调用运行的;(3)不同于构造函数,静态初始化器不是方法,没有方法名、返回值和参数列表。5.6抽象类与抽象方法1.抽象类当一个类被声明为abstract时,这个类被称为抽象类。所谓抽象类就是没有具体实例对象的类。抽象类是它的所有子类的公共属性的集合。使用抽象类的一大优点就是可以利用这些公共属性来提高开发和维护程序的效率。2.抽象方法作为类修饰符,abstract声明了一种没有具体对象的,出于组织概念的层次关系需要而存在的抽象类。作为类方法修饰符,abstract则声明了一种仅有方法头,而没有具体的方法体和操作实现的抽象方法。注:具体的实现方法由各个子类来实现。P1115.7最终类、最终属性、最终方法与终结器1.最终类如果一个类被final修饰符所修饰和限定,说明这个类不可能有子类。2.最终属性final就是用来修饰常量的修饰符,一个类的成员变量如果被声明为final,那么它的取值在程序的整个执行过程中都不会改变,也就是一个常量。用final修饰符说明常量时,需要注意以下几点:1)需要说明常量的数据类型;2)需要同时指出常量的具体取值;3)因为所有类对象的常量成员,其数值都固定一致,为了节省空间,常量通常都被声明为static。3.最终方法final修饰符所修饰的类方法,是功能和内部语句都不能被更改的最终方法。即是不能被当前类的子类重载的方法。final方法的作用:固定所对应的具体操作,防止子类对父类关键方法的错误的重定义,保证了程序的安全性和正确性。注:所有已被private修饰符限定为私有的方法,以及所有包含在final类中的方法,都被缺省地认为是final的。4.终结器终结器是回收对象时执行的方法。protectedvoidfinalize(){}终结器是一个名为finalize的方法,没有产生列表和返回值。5.8其他修饰符及修饰符的混合使用1.volatile修饰符若一个类的属性被volatile所修饰,说明这个属性可能同时被几个线程所控制和修改。即这个属性不仅仅被当前程序所掌握,在运行过程中可能存在其他的未知的程序的操作来影响和改变该属性的取值,所以在使用当中应该特别留意这些其他影响因素。通常,volatile用来修饰受外部输入的属性。2.native修饰符native修饰符一般用来声明用其他语言写方法体并具体实现方法功能的特殊的方法。其他语言包括C,C++,fortran,汇编等。由于native的方法的方法体使用其他语言在程序外部写成,所以所有的native方法都没有方法体,而用一个分号代替。在java中使用其他语言编写模块作为类方法,目的有两个:一、充分利用已经存在的程序功能模块和避免重复工作。二、可以利用native方法来提高运算速度。3.synchronized修饰符synchronized修饰符修饰的类方法,如果是一个类的方法(即static的方法),那么在调用执行前,将把系统类Class中对应当前类的对象加锁;如果synchronized修饰的是一个对象的方法(未用static方法),则这个方法在被调用执行前,将把当前对象加锁。synchronized修饰符主要用于多线程共存的程序中的协调和同步。4.修饰符的混合使用大多数情况下,修饰符是可以混合使用的。但是下面一些修饰符混用时需要注意:abstract不能与final并列修饰同一个类;abstract不能与private、static、final或native并列修饰同一个方法;abstract类中不能有private的成员(包括属性和方法);abstract方法必须在abstract类中;static方法中不能处理非static属性。