面向对象程序设计 (2)2优秀课件.ppt
面向对象程序设计面向对象程序设计第1页,本讲稿共94页本章学习目标:本章学习目标:理解类与对象、封装、继承的概念理解类与对象、封装、继承的概念掌握类中成员变量和方法的声明与使用掌握类中成员变量和方法的声明与使用掌握对象的创建与使用掌握对象的创建与使用理解包的作用与用法理解包的作用与用法理解抽象类与接口的作用与用法理解抽象类与接口的作用与用法第2页,本讲稿共94页6.1引言引言lJava语言作为一种语言作为一种面向对象面向对象的程序设计语言,的程序设计语言,具备面向对象技术的基本属性。具备面向对象技术的基本属性。l定义类和建立对象是定义类和建立对象是Java编程的主要任务。本编程的主要任务。本章将介绍章将介绍Java面向对象程序设计的基础,即类、面向对象程序设计的基础,即类、对象、包、接口、类的继承等内容。对象、包、接口、类的继承等内容。l面向对象面向对象(Object Oriented,OO)的特点:的特点:封装封装+继承继承+多态多态+消息传递消息传递第3页,本讲稿共94页6.2类类l类是类是Java语言的最基本概念,是组成语言的最基本概念,是组成Java程序的基本要素;程序的基本要素;l类是类是Java的执行单位,的执行单位,Java运行的就是运行的就是Java类本身;类本身;l类封装了该类对象的类封装了该类对象的成员变量成员变量和和方法方法。l类和对象的关系类和对象的关系lJava的类分为两大部分的类分为两大部分系统定义的类系统定义的类用户自定义的类用户自定义的类 第4页,本讲稿共94页public class Teacherprivate String name;protected int hours;protected long payment;public Teacher(String name,int hours)this.name=name;this.hours=hours;this.payment=0;public void show()System.out.println(name+工作了+hours+小时,应付+payment);public void countPayment()payment=counting(1000,hours,50,0);public void resetHour()hours=0;public void addHour(int h)hours+=h;protected long counting(int base,int h,int perHour,long other)return(long)base+h*perHour+other;类声明类声明类体类体成员变量声明成员变量声明构造方法构造方法成员方法成员方法第5页,本讲稿共94页6.2.1类声明类声明l类声明格式如下:类声明格式如下:类的修饰字类的修饰字class 类名类名extends 父类名父类名implements 接口列表接口列表lclass是是声声明明一一个个类类的的关关键键字字,是是必必须须的的,类类名名是是要要声声明明的的类类的的名名字字,它必须是一个合法的它必须是一个合法的Java标识符。标识符。l根据声明类的需要,类声明还可以包含三个选项:根据声明类的需要,类声明还可以包含三个选项:声明类的修饰符;声明类的修饰符;说明该类的父类;说明该类的父类;说明该类所实现的接口。说明该类所实现的接口。第6页,本讲稿共94页6.2.2类体类体l类体用一对大括号括起。类体用一对大括号括起。l类体中定义了该类中类体中定义了该类中所有的变量所有的变量和该和该类所支持类所支持的方法的方法:成员变量对应类的成员变量对应类的静态属性静态属性方法对应类的行为和操作,方法对应类的行为和操作,动态属性动态属性第7页,本讲稿共94页l成员变量成员变量成员变量是类和对象的成员变量是类和对象的静态属性静态属性,它可以是基本数据类型的变,它可以是基本数据类型的变量,也可以是其它类(系统类或用户自定义类)的对象。量,也可以是其它类(系统类或用户自定义类)的对象。因此,定义成员变量的操作就是说明变量或创建对象的操作。因此,定义成员变量的操作就是说明变量或创建对象的操作。l方法方法方法是类的方法是类的动态属性动态属性,标志了类所具有的功能和操作,用来把,标志了类所具有的功能和操作,用来把类和对象的数据封装在一起。类和对象的数据封装在一起。Java的方法与其它语言中的函数或过程类似,是一段完成某种功的方法与其它语言中的函数或过程类似,是一段完成某种功能的程序段。能的程序段。第8页,本讲稿共94页6.2.3成员变量成员变量l最简单的成员变量的声明方式如下:最简单的成员变量的声明方式如下:public|protected|privatestaticfinaltype 成员变量名成员变量名;这里的这里的type可以是可以是Java中任意的数据结构,包括简单类中任意的数据结构,包括简单类型、类、接口、数组。型、类、接口、数组。在一个类中的成员变量应该是唯一的。在一个类中的成员变量应该是唯一的。l成员变量的作用域是成员变量的作用域是整个类整个类。第9页,本讲稿共94页l1静态成员变量静态成员变量用用static修饰的成员变量就是修饰的成员变量就是静态成员变量静态成员变量(类变量)。(类变量)。静态成员变量最本质的特点是:它们是类的成员变量,不属于任何一静态成员变量最本质的特点是:它们是类的成员变量,不属于任何一个类的具体对象,它不保存在某个对象的内存区成员变量中,而是保个类的具体对象,它不保存在某个对象的内存区成员变量中,而是保存在类的内存区成员变量的公共存储单元。存在类的内存区成员变量的公共存储单元。换句话说,对该类的具体对象而言,静态成员变量是一个公共换句话说,对该类的具体对象而言,静态成员变量是一个公共的存储单元。任何一个类的对象访问它,得到的都是相同的值;的存储单元。任何一个类的对象访问它,得到的都是相同的值;任何一个类的对象修改它,都是对同一内存单元进行操作。任何一个类的对象修改它,都是对同一内存单元进行操作。没有用没有用static修饰的变量是修饰的变量是实例变量实例变量,必须实例化该类才可以使用实,必须实例化该类才可以使用实例变量。该类的不同对象都各自拥有自身的实例变量的版本。例变量。该类的不同对象都各自拥有自身的实例变量的版本。第10页,本讲稿共94页l2最终成员变量最终成员变量lfinal:用来声明一个常量。:用来声明一个常量。如:如:classFinalVarfinal int CONSTANT=50;l此例中声明了常量此例中声明了常量CONSTANT,并赋值为,并赋值为50。对于用。对于用final限定的常量,在程序中不能改变它的值。通常常量名用大限定的常量,在程序中不能改变它的值。通常常量名用大写字母表示。写字母表示。第11页,本讲稿共94页6.2.4成员方法成员方法l方法由方法声明和方法体组成,其一般格式如下:方法由方法声明和方法体组成,其一般格式如下:public|protected|privatestaticfinal|abstractnativesynchronized 返回值返回值类型类型 方法名(形式参数列表)方法名(形式参数列表)throws 异常列表异常列表 方法体各语句;方法体各语句;l其中返回类型可以是任意的其中返回类型可以是任意的Java数据类型,当一个方法不需数据类型,当一个方法不需要返回值时,则必须声明其返回类型为要返回值时,则必须声明其返回类型为void。l形式参数列表形式参数列表指明每个参数的名字和类型,各参数之间用逗号指明每个参数的名字和类型,各参数之间用逗号分隔,分隔,格式为:格式为:形参类型形参类型1 形参名形参名1,形参类型,形参类型2 形参名形参名2,第12页,本讲稿共94页classCircleintx,y,radius;/x,y,radius是成员变量是成员变量publicCircle(intx,inty,intradius)/x,y,radius是参数是参数Circle类有三个成员变量:类有三个成员变量:x、y和和radius。在在Circle类类的的构构造造方方法法中中有有3个个参参数数,名名字字也也是是x、y和和radius。在在方方法中出现的法中出现的x、y和和radius指的是参数名,而不是成员变量名。指的是参数名,而不是成员变量名。如如果果要要访访问问这这些些同同名名的的成成员员变变量量,必必须须通通过过“当当前前对对象象”指指示示符符this来引用它。来引用它。this.x=x;this.y=y;this.radius=radius;第13页,本讲稿共94页thislthis表示的是当前对象本身,更准确地说,表示的是当前对象本身,更准确地说,this代表当前对象的一个引用。代表当前对象的一个引用。l对象的引用可以理解为对象的另一个名字,通对象的引用可以理解为对象的另一个名字,通过引用可以顺利地访问到对象,包括访问、修过引用可以顺利地访问到对象,包括访问、修改对象的成员变量、调用对象的方法。改对象的成员变量、调用对象的方法。第14页,本讲稿共94页l方法体方法体方法体是对方法的实现。它包括局部变量的声明以方法体是对方法的实现。它包括局部变量的声明以及所有合法的及所有合法的Java指令。指令。方法体中可以声明该方法中所用到的局部变量,它方法体中可以声明该方法中所用到的局部变量,它的作用域只在该方法内部,当方法返回时,局部变的作用域只在该方法内部,当方法返回时,局部变量也不再存在。量也不再存在。如果如果局部变量的名字局部变量的名字和和类的成员变量的名字类的成员变量的名字相同,相同,则则类的成员变量被隐藏。类的成员变量被隐藏。第15页,本讲稿共94页【例【例6-4】成员变量和局部变量的作用域示例。】成员变量和局部变量的作用域示例。classVariableintx=0,y=0,z=0;/类的成员变量类的成员变量voidinit(intx,inty)this.x=x;this.y=y;intz=5;/局部变量局部变量System.out.println(*ininit*);System.out.println(x=+x+y=+y+z=+z);publicclassVariableTestpublicstaticvoidmain(Stringargs)Variablev=newVariable();System.out.println(*beforeinit*);System.out.println(x=+v.x+y=+v.y+z=+v.z);v.init(20,30);System.out.println(*afterinit*);System.out.println(x=+v.x+y=+v.y+z=+v.z);第16页,本讲稿共94页6.2.5方法重载方法重载l方法重载即指多个方法可以享有相同的名字。方法重载即指多个方法可以享有相同的名字。但是这些方法的参数必须不同,或者是参数个但是这些方法的参数必须不同,或者是参数个数不同,或者是参数类型不同。数不同,或者是参数类型不同。第17页,本讲稿共94页【例例】方法重载应用举例。方法重载应用举例。classMethodOverloadingvoidreceive(inti)System.out.println(Receiveoneintdata);System.out.println(i+i);voidreceive(intx,inty)System.out.println(Receivetwointdatum);System.out.println(x=+x+y=+y);voidreceive(doubled)System.out.println(Receiveonedoubledata);System.out.println(d=+d);voidreceive(Strings)System.out.println(Receiveastring);System.out.println(s=+s);publicclassMethodOverloadingTestpublicstaticvoidmain(Stringargs)MethodOverloadingmo=newMethodOverloading();mo.receive(1);mo.receive(2,3);mo.receive(12.56);mo.receive(veryinteresting,isntit?);第18页,本讲稿共94页void receive(int i)void receive(int x,int y)void receive(double d)void receive(String s)-receive(1)-receive(2,3)-receive(12.56)-receive(very interesting,isnt it?)重载重载调用调用 图图 重载与调用关系重载与调用关系第19页,本讲稿共94页6.2.6构造方法构造方法l被自动调用的专门的初始化方法称为构造方法被自动调用的专门的初始化方法称为构造方法.l构造函数是类的一种特殊方法,其特殊性如下:构造函数是类的一种特殊方法,其特殊性如下:构造函数的方法名与类名相同。构造函数的方法名与类名相同。构造函数没有返回值。构造函数没有返回值。构造函数的作用是对类的对象初始化。构造函数的作用是对类的对象初始化。在创建一个类的新对象的同时,系统会自动调用该在创建一个类的新对象的同时,系统会自动调用该类的构造函数。类的构造函数。第20页,本讲稿共94页l构造函数是与类同名的方法,创建对象的语句用构造函数是与类同名的方法,创建对象的语句用new运运算符开辟了新建对象的内存空间后,将调用构造函数初始化这算符开辟了新建对象的内存空间后,将调用构造函数初始化这个新建对象。个新建对象。一般将构造方法声明为公共的一般将构造方法声明为公共的public型,如果声明为型,如果声明为private型,那型,那么就不能够创建对象的实例了,因为构造方法是在对象的外部么就不能够创建对象的实例了,因为构造方法是在对象的外部被默认地调用。被默认地调用。Java语言为每一个类提供了一个默认的构造方法,也就是说,每语言为每一个类提供了一个默认的构造方法,也就是说,每个类都有构造方法,用来初始化该类的一个新的对象。如果不定个类都有构造方法,用来初始化该类的一个新的对象。如果不定义一个构造方法,义一个构造方法,Java语言将调用它提供的默认的构造方法对一语言将调用它提供的默认的构造方法对一个新的对象进行初始化。个新的对象进行初始化。在构造方法的实现中,也可以进行方法重载。在构造方法的实现中,也可以进行方法重载。第21页,本讲稿共94页【例例】构造方法的实现。构造方法的实现。classpointintx,y;point()/定义构造方法定义构造方法x=0;y=0;point(intx,inty)/构造方法的重载构造方法的重载this.x=x;this.y=y;第22页,本讲稿共94页6.2.7main()方法方法lmain()方法是方法是Java应用程序必须具备的方法。应用程序必须具备的方法。格式是:格式是:public static void main(String args)l所有所有Java的独立应用程序都从的独立应用程序都从main()开始执行。开始执行。把把static放在方法名前就使方法变为静态的方法,放在方法名前就使方法变为静态的方法,即类方法而非实例方法。即类方法而非实例方法。第23页,本讲稿共94页6.2.8finalize()方法方法l在对对象进行垃圾收集前,在对对象进行垃圾收集前,Java运行时系统会运行时系统会自动调用对象的自动调用对象的finalize()方法来释放系统资源,方法来释放系统资源,如打开的文件或如打开的文件或socket。该方法的声明必须如。该方法的声明必须如下所示:下所示:protected void finalize()throws throwablel注意如果不定义注意如果不定义finalize方法,方法,Java将调用它提将调用它提供的默认的供的默认的finalize方法进行扫尾工作。方法进行扫尾工作。第24页,本讲稿共94页【例例】finalize方法举例。方法举例。classmyclassintm_DataMember1;floatm_DataMember2;publicmyClass()/构造函数构造函数m_DataMember1=1;/初始化变量初始化变量m_DataMember2=7.25;voidfinalize()/定义定义finalize方法方法m_DataMember1=null;/释放内存释放内存m_DataMember2=null;第25页,本讲稿共94页6.3对象对象l对象是类的实例化,对象的创建是通过对象构对象是类的实例化,对象的创建是通过对象构造方法来实现的;造方法来实现的;l我们可以生成多个对象,通过消息传递来进行我们可以生成多个对象,通过消息传递来进行交互,最终完成复杂的任务;交互,最终完成复杂的任务;l消息传递是指激活指定的某个对象的方法,以消息传递是指激活指定的某个对象的方法,以改变它的状态或使其产生一定的动作。改变它的状态或使其产生一定的动作。l一个对象的生命期包括三个阶段:创建、使用一个对象的生命期包括三个阶段:创建、使用和清除。和清除。第26页,本讲稿共94页6.3.1对象的创建对象的创建l对象的创建包括声明、实例化和初始化三方面的内容。对象的创建包括声明、实例化和初始化三方面的内容。l一般格式为:一般格式为:type ObjectName=new type(paramlist);type objectName声声明明了了一一个个类类型型为为type的的对对象象,其其中中type是是引引用用类类型型(包括类和接口包括类和接口),对象的声明并不为对象分配内存空间。,对象的声明并不为对象分配内存空间。运运算算符符new为为对对象象分分配配内内存存空空间间,实实例例化化一一个个对对象象。new调调用用对对象象的的构构造造方方法法,返返回回对对该该对对象象的的一一个个引引用用(即即该该对对象象所所在在的的内内存存地地址址)。生成对象的最后一步是执行构造方法,进行初始化。由于对构造方法可以生成对象的最后一步是执行构造方法,进行初始化。由于对构造方法可以进行重写,所以通过给出不同个数或类型的参数会分别调用不同的构造方进行重写,所以通过给出不同个数或类型的参数会分别调用不同的构造方法。如果类中没有定义构造方法,系统会调用缺省的空构造函数。法。如果类中没有定义构造方法,系统会调用缺省的空构造函数。第27页,本讲稿共94页【例例】定义类并创建类的对象。定义类并创建类的对象。classComputerStringOwner;/成员变量成员变量publicstaticvoidmain(Stringargs)voidset_Owner(Stringowner)/成员方法成员方法Owner=owner;voidshow_Owner()System.out.println(这台电脑是这台电脑是:+Owner+的的);classDemoComputerpublicstaticvoidmain(Stringargs)System.out.println(使用类使用类);ComputerMyComputer=newComputer();/生成类的对象生成类的对象Mycomputer.set_Owner(知识工程教研室知识工程教研室);Mycomputer.show_Owner();第28页,本讲稿共94页ComputerMyComputer=newComputer();l等价于:等价于:ComputerMyComputer;MyComputer=newComputer();其其中中MyComputer是是对对象象的的名名称称,它它是是一一个个属属于于Coputer类类的的对对象象,能能够够调调用用Computer类类中中的的set_Owner()、show_Owner()方法。方法。第29页,本讲稿共94页6.3.2对象的使用对象的使用l要访问或调用一个对象的成员变量或方法,首要访问或调用一个对象的成员变量或方法,首先访问该对象,然后用成员运算符先访问该对象,然后用成员运算符“.”可以可以实现对变量的访问和方法的调用。实现对变量的访问和方法的调用。例如:例如:Mycomputer.set_Owner(“知识工程教研室知识工程教研室”);Mycomputer.show_Owner();第30页,本讲稿共94页6.3.3对象的清除对象的清除l对象的清除,即系统内无用单元的收集。对象的清除,即系统内无用单元的收集。lJava运行时系统通过垃圾收集周期性地释放无用对象所使用运行时系统通过垃圾收集周期性地释放无用对象所使用的内存,完成对象的清除。的内存,完成对象的清除。lJava采用自动垃圾收集进行内存管理,使程序员不需要跟踪采用自动垃圾收集进行内存管理,使程序员不需要跟踪每个生成的对象,这是每个生成的对象,这是Java的一大优点。的一大优点。l当下述条件满足时,当下述条件满足时,Java内存管理系统将自动完成收集内存内存管理系统将自动完成收集内存工作。工作。(1)当堆栈中的存储器数量少于某个特定水平时;当堆栈中的存储器数量少于某个特定水平时;(2)当程序强制调用系统类的方法时;当程序强制调用系统类的方法时;(3)当系统空闲时。当系统空闲时。第31页,本讲稿共94页6.4访问控制符访问控制符l访问控制符是一组限定类、成员变量或方法是访问控制符是一组限定类、成员变量或方法是否可以被程序里的其它部分访问和调用的修饰否可以被程序里的其它部分访问和调用的修饰符。符。l类的访问符只有类的访问符只有public。l成员变量和方法的访问控制符有三个:成员变量和方法的访问控制符有三个:publicprivateprotected第32页,本讲稿共94页6.4.1类的访问控制符类的访问控制符l1公共访问控制符公共访问控制符public Java中类的访问控制符只有一个:中类的访问控制符只有一个:public,即公共类。一个类被声,即公共类。一个类被声明为公共类,声明它可以被所有其他类所访问和引用,这里的访明为公共类,声明它可以被所有其他类所访问和引用,这里的访问和引用是指这个类作为整体是可见和可使用的。问和引用是指这个类作为整体是可见和可使用的。Java的类是通过包来组织,处于同一包中的类可以不需任何说明而方的类是通过包来组织,处于同一包中的类可以不需任何说明而方便的互相访问和引用,而对于处于不同包中的类,缺省的它们是互相便的互相访问和引用,而对于处于不同包中的类,缺省的它们是互相之间不可见的。之间不可见的。但是,当一个类被声明为但是,当一个类被声明为public时,它就具有了被其它包中类访问的时,它就具有了被其它包中类访问的可能性,只要这些包中的类在程序中使用可能性,只要这些包中的类在程序中使用import语句引入语句引入public类,类,就可访问它了。就可访问它了。一个类作为整体可见,并不能代表类中的成员变量和方法也一一个类作为整体可见,并不能代表类中的成员变量和方法也一定可见,除非它们也被声明为定可见,除非它们也被声明为public。第33页,本讲稿共94页l2.2.缺省访问控制符缺省访问控制符 若一个类没有访问控制符,说明它具有缺省的访问若一个类没有访问控制符,说明它具有缺省的访问控制特性。该访问控制规定这样的类只能被同一个控制特性。该访问控制规定这样的类只能被同一个包中的类访问和引用,而不能被其他包中的类使用,包中的类访问和引用,而不能被其他包中的类使用,这种访问特性又称包访问性。通过声明类的访问控这种访问特性又称包访问性。通过声明类的访问控制符可以使整个程序结构清晰、严谨,减少可能产制符可以使整个程序结构清晰、严谨,减少可能产生的类之间的干扰和错误。生的类之间的干扰和错误。第34页,本讲稿共94页6.4.2对类成员的访问控制对类成员的访问控制l当一个类可以被访问时,对类内的成员变量和当一个类可以被访问时,对类内的成员变量和成员方法而言,其应用范围可以通过施以一定成员方法而言,其应用范围可以通过施以一定的访问权限来限定。的访问权限来限定。同一个类中同一个类中同一个包中同一个包中不同包中的子不同包中的子类类不同包中的非不同包中的非子类子类(任意类任意类)privatedefaultprotectedpublic第35页,本讲稿共94页l私有访问控制符私有访问控制符用用private修饰的成员变量或方法只能被该类自修饰的成员变量或方法只能被该类自身所访问和修改,而不能被任何其它类(包括身所访问和修改,而不能被任何其它类(包括该类的子类)来获取和引用。该类的子类)来获取和引用。private修饰符提供了最高的保护级别。修饰符提供了最高的保护级别。classAlphaprivateintiamprivate;/private成员变量成员变量privatevoidprivateMethod()/private成员方法成员方法System.out.println(privateMethod);classBetavoidaccessMethod()Alphaa=newAlpha();a.iamprivate=10;/非法非法a.privateMethod();/非法非法第36页,本讲稿共94页l缺省访问控制符缺省访问控制符类中不加任何防问权限限定的成员属于缺省的类中不加任何防问权限限定的成员属于缺省的(default)访问状态,可以被这个类本身和同一个包访问状态,可以被这个类本身和同一个包中的类所访问。这个访问级别是假设在相同包中的中的类所访问。这个访问级别是假设在相同包中的类是互相信任的。类是互相信任的。第37页,本讲稿共94页packageGreek;publicclassAlphaintiamprivate;voidpackageMethod()System.out.println(packageMethod);packageGreek;classBetavoidaccessMethod()Alphaa=newAlpha();a.iamprivate=10;/合法合法a.protectedMethod();/合法合法Alpha类可以访问自己的成员,同时所有定义在与类可以访问自己的成员,同时所有定义在与Alpha同一个包中的类同一个包中的类也可以访问这些成员。也可以访问这些成员。如如Alpha和和Beta都定义为都定义为Greek包的一部分,则包的一部分,则Beta可以合法访问可以合法访问Alpha的的成员。成员。第38页,本讲稿共94页l保护访问控制符保护访问控制符protectedl用用protected修饰的成员变量和方法可以被三种修饰的成员变量和方法可以被三种类引用:类引用:该类自身;该类自身;与它在同一个包中的其它类;与它在同一个包中的其它类;在其它包中的该类的子类。在其它包中的该类的子类。l使用使用protected修饰符的主要作用是允许包中的修饰符的主要作用是允许包中的类和其它包中的子类来访问父类的特定属性。类和其它包中的子类来访问父类的特定属性。第39页,本讲稿共94页l公共访问控制符公共访问控制符public被定义为被定义为public的方法是这个类对外的接口部分,的方法是这个类对外的接口部分,程序的其它部分通过调用程序的其它部分通过调用public方法达到与当前类方法达到与当前类交换信息、甚至影响当前类的目的。交换信息、甚至影响当前类的目的。用用public修饰的成员变量被称为公共成员变量,如修饰的成员变量被称为公共成员变量,如果一个公共成员变量属于一个公共类,则它可被所果一个公共成员变量属于一个公共类,则它可被所有其它类所引用。有其它类所引用。public修饰符会造成安全性和数据封装性下降,所修饰符会造成安全性和数据封装性下降,所以一般应减少以一般应减少public成员变量的使用。成员变量的使用。第40页,本讲稿共94页访问控制符小结访问控制符小结l公共访问控制符(公共访问控制符(public):):public类:公共类,可以被其他包中类引入后访问。类:公共类,可以被其他包中类引入后访问。public方法:是类的接口,用于定义类中对外可用的功能方法。方法:是类的接口,用于定义类中对外可用的功能方法。public变量:可以被其他类访问。变量:可以被其他类访问。l缺省访问控制符的类、变量、方法:具有包访问性(只能缺省访问控制符的类、变量、方法:具有包访问性(只能被同一个包中的类访问)。被同一个包中的类访问)。l私有访问控制符(私有访问控制符(private):修饰变量或方法,只能被该):修饰变量或方法,只能被该类自身所访问。类自身所访问。l保护访问控制符(保护访问控制符(protected):修饰变量或方法,可以):修饰变量或方法,可以被类自身、同一包中的类、任意包中该类的子类所访问。被类自身、同一包中的类、任意包中该类的子类所访问。第41页,本讲稿共94页6.5包包l利用利用Java语言开发实际系统时,可以利用语言开发实际系统时,可以利用“包包”来管理类。来管理类。包是类和接口的集合,为了方便编程和管理,通常把需要在包是类和接口的集合,为了方便编程和管理,通常把需要在一起工作的类放在一个包里。一起工作的类放在一个包里。l为为Java创建一个源码文件的时候,它通常叫做一个创建一个源码文件的时候,它通常叫做一个“编辑单编辑单元元”,每个编辑单元必须有一个以,每个编辑单元必须有一个以java结尾的名字。结尾的名字。l缺省情况下,系统为每个缺省情况下,系统为每个.java源文件创建一个无名包,源文件创建一个无名包,该文件中定义的所有类都隶属于该包,但由于该包无名该文件中定义的所有类都隶属于该包,但由于该包无名字,所以不能被其它包引用。为了解决这个问题,就要字,所以不能被其它包引用。为了解决这个问题,就要创建有名包。创建有名包。第42页,本讲稿共94页l标准的标准的Java包列表包列表 包包功能描述功能描述java.applet包含一些用于创建包含一些用于创建Java小应用程序的类小应用程序的类java.awt包包含含一一些些编编写写平平台台无无关关的的图图形形用用户户界界面面(GUI)应应用用程程序序的的类类。它包含几个子包,包括它包含几个子包,包括java.awt.peer和和java.awt.imagejava.io包含一些用作输入输出包含一些用作输入输出(I/O)处理的类。数据流就包含在这里处理的类。数据流就包含在这里java.1ang包包含含一一些些基基本本Java类类。java.1ang是是被被隐隐式式地地引引入入的的,所所以以用用户户不不必引入它的类必引入它的类包包含含用用于于建建立立网网络络连连接接的的类类。与与java.io同同时时使使用用以以完完成成与与网网络络有有关的读和写关的读和写java.util包含一些其他的工具和数据结构,如编码、解码、向量和堆栈等包含一些其他的工具和数据结构,如编码、解码、向量和堆栈等第43页,本讲稿共94页6.5.1包的创建包的创建l用用package关键字创建包,而且该语句是关键字创建包,而且该语句是.java源文件的第源文件的第一个语句,前面不能有注释和空格。格式为一个语句,前面不能有注释和空格。格式为:package 包名;包名;例如:例如:package SubClass;package MyClass.SubClass;l实际上,创建包就是在当前目录下创建一个子目录实际上,创建包就是在当前目录下创建一个子目录SubClass,以便存放这个包中包含的所有类的,以便存放这个包中包含的所有类的.class文件。文件。l上面的第二个语句中的上面的第二个语句中的“.”代表了目录分隔符。即包中的类放代表了目录分隔符。即包中的类放在当前目录下的在当前目录下的SubClass子目录下的子目录下的MyClass子目录下。子目录下。第44页,本讲稿共94页package myclass.graphics;这条语句指定这个包中的文这条语句指定这个包中的文件存储在目录件存储在目录 path/myclass/graphics 下。下。包层次的根目录包层次的根目录path是由环境变量是由环境变量CLASSPATH来确定来确定的。的。package myclass.graphics;class Square;class Circle;class Triangle;Square.java第45页,本讲稿共94页6.5.2 编译和运行包编译和运行包l在前面在前面Square.java中已定义了中已定义了 myclass.graphics,编,编译时可以采用如下方式:译时可以采用如下方式:javac-d destpath Square.java 则编译器会自动在则编译器会自动在destpath目录下建立子目录目录下建立子目录myclass/graphics,并将生成的,并将生成的.class文件都放到文件都放到destpath/myclass/graphics下。下。destpath应该是环境应该是环境变量变量CLASSPATH中的一个。中的一个。第46页,本讲稿共94页6.5.3包的引用包的引用l缺省的情况下,一个类只能引用同一个包中的缺省的情况下,一个类只能引用同一个包中的类,如果需要使用其它包中的类,如果需要使用其它包中的public类,可使类,可使用如下的方法用如下的方法:l1使用包名、类名前缀使用包名、类名前缀对于同一个包中的其它类,只需在要使用的属性或对于同一个包中的其它类,只需在要使用的属性或方法名前加上类名作为前缀,对于其它包中的类,方法名前加上类名作为前缀,对于其它包中的类,则需要在类名前缀的前面再加上包名前缀。则需要在类名前缀的前面再加上包名前缀。例如:例如:packageGraphic.Rectangle rectG;java.awt.Rectangle rectA=new java.awt.Rectangle();第47页,本讲稿共94页l2import语句语句加前缀的方法使用起来非常麻烦,可以使用加前缀的方法使用起来非常麻烦,可以使用import语句加载需要使用语句加载需要使用的类或包。的类或包。import语句的格式为:语句的格式为:import packagel.package2.(classname|*);其中其中packagel.package2表明包的层次,与表明包的层次,与package语句相同,它语句相同,它对应于文件目录,对应于文件目录,classname则指明所要引入的类。则指明所要引入的类。如果要从一个包中引入多个类,则可以用星号如果要从一个包中引入多个类,则可以用星号(*)代替。代替。例如:例如:import java.awt.*;import java.util.Date;第48页,本讲稿共94页6.6继承与多态继承与多态第49页,本讲稿共94页l当一个类拥有另一个类的数据和操作时,就称当一个类拥有另一个类的数据和操作时,就称这两个类之间具有继承关系,被继承的类称为这两个类之间具有继承关系,被继承的类称为父类父类或或超类超类,继承的类称为,继承的类称为子类子类。l一个父类可以同时拥有多个子类,该父类实际一个父类可以同时拥有多个子类,该父类实际上是所有子类的公共成员变量和公共方法的集上是所有子类的公共成员变量和公共方法的集合,而子类是父类的特殊化,可对公共成员变合,而子类是父类的特殊化,可对公共成员变量和方法在功能、内涵方面加以扩展和延伸。量和方法在功能、内涵方面加以扩展和延伸。第50页,本讲稿共94页l面向对象的继承特性中,还有一个关于单继承面向对象的继承特性中,还有一个关于单继承和多继承的概念。和多继承的概念。单继承是指任何类都只有