第3章类与对象幻灯片23.1基本概念⑴对象(object)对象的概念是面向对象技术的核心,在现实世界里,我们面对的所有事物都是对象。在面向对象的程序设计中,对象是一个由信息及对信息进行处理的描述所组成的包,是对现实世界的抽象。幻灯片3虽然人们对对象的描述可能不完全相同,但都是从两点来描述对象的:一是对象的状态,如电视机的外形、尺寸等;二是对象的行为,如电视机的开、关等。同样在面向对象的程序设计中,状态和行为是对象的主要属性。对象的状态又称为对象的静态属性,主要指对象内部所包含的各种信息;行为又称为对象的操作,主要描述对象的动态属性,作用是设置或改变对象的状态。幻灯片4⑵类(class)类是同种对象的集合与抽象。在面向对象的程序设计中,用类的概念来表述同种对象的公共属性和特点。幻灯片5⑶实例(instance)实例是由某个特定的类所描述的一个对象,是对类的具体实现。对象是以类为模板的具体实例。幻灯片6⑷域(field)域是类和对象的静态属性,它可以是基本数据类型的变量,也可以是其他类(系统类或用户自定义类)的对象。因此,定义类时定义域的操作就是说明变量或创建对象的操作。幻灯片7⑸方法(method)方法是类的动态属性,标志了类所具有的功能和操作。幻灯片83.2类的定义Java中的类可以分为两种,一种是系统定义的类,即Java类库中的类(如System);另一种是用户自定义的类。定义类包括定义类头和类体两个步骤,其中类体用一对大括号括起来,类体由域和方法组成。类定义的一般格式:[类修饰符]class类名[extends父类名][implements接口名]{域方法}幻灯片9方方法法定定义义的的一一般般格格式式::[[修修饰饰符符]]返返回回类类型型方方法法名名((参参数数类类型型参参数数11,,……)){{方方法法体体}}返返回回值值类类型型在在一一般般情情况况下下必必须须指指定定,,如如果果方方法法指指定定了了非非vvooiidd的的返返回回值值类类型型,,则则在在方方法法体体中中必必须须有有完完备备的的rreettuurrnn语语句句返返回回需需要要的的返返回回值值。。幻灯片103.3创建对象与构造方法创建对象的一般格式:类名对象名=new构造方法名(参数);Students1=newStudent();Students2=newStudent();幻灯片11构造方法,也称为构造函数,主要作用是在创建对象的同时调用这个对象的构造方法来完成对象的初始化。Student(Stringn,inta){name=n;age=a;}Students1=newStudent(王五,18);幻灯片12注:①构造方法的方法名与类名相同。②构造方法没有返回类型,也不能写void。③构造方法的主要作用是完成类对象的初始化工作。④构造方法一般不能直接调用,而是系统在创建一个类的新对象时自动调用,来对新对象进行初始化。⑤一个类可以有一个或多个构造方法,只要形式参数不同即可。⑥如果在定义类对象时没有定义任何构造方法,系统会自动产生一个构造方法,无需定义,它称为默认构造方法。默认构造方法不带形式参数,并且方法体为空。幻灯片13classStudent{Stringname;intage;Student(Stringn,inta){//调用对象Student的构造方法来完成该对象的初始化。name=n;age=a;}voidsetStudent(Stringn,inta){name=n;age=a;}voidprintStudent(){System.out.println(姓名:+name+;年龄:+age);}}幻灯片14publicclasstest{publicstaticvoidmain(Stringargs[]){Studenta=newStudent(王五,18);a.printStudent();}}幻灯片153.4包3.4.1package⑴包的概念包(package)定义了软件单元,它能够独立发布,并能够与其它包组成应用程序,包的成员是一些相关联的类、接口以及子包,也可包含包中的类所使用的附加资源文件。定义包的语句形式:package包名;幻灯片16在实际代码的存放形式中,包表现为一个具体的文件夹或者是诸如jar压缩文件,而类则是文件夹或者压缩文件中的某个文件。如:packagemyclass;…幻灯片17在命令窗口操作假假设设““tteesstt..jjaavvaa””位位于于DD::\\tteemmpp目目录录中中编编译译jjaavvaacc--dddd::\\tteemmppdd::\\tteemmpp\\tteesstt..jjaavvaa设设置置临临时时环环境境变变量量sseettccllaassssppaatthh==dd::\\tteemmpp如如果果是是追追加加方方式式,,就就可可用用sseettccllaassssppaatthh==%%ccllaassssppaatthh%%;;dd::\\tteemmpp运运行行jjaavvaammyyccllaassss..tteesstt幻灯片18⑵包的主要作用①包将相互关联的接口和类结合成组。②包创建了命名空间来避免类型之间的命名冲突。在一个包中的接口和类可以使用流行的公共名字来命名,而这些命名只在一个包内的上下文才有意义,在不同的包之间则可以有相同的命名。③包机制为开发应用提供了保护域。包内的代码通过访问标志可以相互协作,而这些标志对外部代码是不可用的。幻灯片19⑶说明①如果package未指定,则所有的类都被组合到一个未命名的缺省包中,不能被其他包中的类使用。②package必须是Java的第一条有效语句。幻灯片20⑷使用扩展包扩展包是.jar文件,它们存放在用户安装JDK时创建的\jdk\jre\lib\ext目录下。放在ext目录下的.jar存档中的类和包在编译或运行Java程序的时候自动成为可访问的资源,不需要设置CLASSPATH环境变量。幻灯片213.4.2import当一个类中需要使用另一个包中定义的类的时候,需要使用import语句来显式说明。幻灯片22⑴导入类型的方式①使用类型的完全限定名。例如,String类的全限定名是java.lang.String。②使用import关键字将包的部分或全部内容导入。例如使用g3ds.joop.ch5包的程序员可以将下面这行代码放在源文件的首部:importg3ds.joop.ch5.*;幻灯片23⑵如何解决潜在的冲突命名package机制和import机制使程序员可以控制潜在的冲突命名。例如在javax.swing包和java.util包都有一个名为Timer的类,那么想要同时在一个源文件中使用这两个类型的程序员可以有几种选择:①使用类型的完全限定名,如javax.swing.Timer和java.util.Timer。②仅导入javax.swing.Timer和javax.util.*,那么对于javax.swing.Timer就可以使用简单名Timer来引用,而用完全限定名来引用java.util.Timer。幻灯片24③反过来:仅导入java.util.Timer或java.swing.*,使用简单名Timer来表示java.util.Timer,而使用完全限定名来表示javax.swing.Timer。④将这两个包javax.swing.*和java.util.*都导入进来,并在自己的代码中使用完全限定名javax.swing.Timer和java.util.Timer(如果在按需导入的两个包中,有同名类型出现,对任何一个都不能使用简单名)。幻灯片253.4.3类的打包Student.javapackagemyclass;publicclassStudent{publicvoidprint(){System.out.println(ok);}}幻灯片26test.javaimportmyclass.Student;publicclasstest{publicstaticvoidmain(String[]args){Students=newStudent();s.print();}}幻灯片27打包—jar运行jar-cvfmypackage.jarmyclass生成mypackage.jar在环境变量classpath中添加mypackage.jar的路径。幻灯片283.5访问控制符Java中定义了四种对类成员访问权限修饰符。访问权限控制由弱到强的顺序是public、protected、(default)、private。public访问权限意味着在任何地方,只要能访问到该类,即可访问到该成员。protected访问权限意味着类中的成员允许同一个包或该类的扩展子类访问。缺省的访问权限不需要任何关键字,但通常称为Friendly。它意味着类中的成员只能由同一个包中的其它类访问。private访问权限意味着该类中的成员只能由自己的成员调用,而无法被该类以外的其它类访问。声明局部变量不能包含访问权限修饰符,否则编译时将检查出错。幻灯片293.6非访问控制符非访问控制符用来说明成员的性质:static、final和abstract。幻灯片30⑴static当当一一个个类类成成员员被被ssttaattiicc修修饰饰时时,,则则声声明明这这个个成成员员的的存存在在形形式式是是静静态态的的,,无无论论通通过过这这个个类类创创建建多多少少个个实实例例,,这这个个成成员员都都不不会会在在各各个个实实例例中中被被额额外外分分配配空空间间保保存存,,而而是是各各个个实实例例都都维维护护一一个个指指向向这这个个静静态态成成员员的的引引用用。。静静态态成成员员最最本本质质的的特特点点就就是是它它属属于于类类的的域域,,而而不不归归任任何何一一个个类类的的实实例例所所有有。。静静态态成成员员变变量量((类类成成员员变变量量)),,它它在在类类加加载载时时完完成成初初始始化化,,并并且且保保持持到到该该类类被被清清除除为为止止,,此此期期间间类类及及其其实实例例共共享享着着同同样样一一份份数数据据。。幻灯片31publicclasstest{staticStringstr=aaa;test(){str=ccc;}publicstaticvoidmain(String[]args){System.out.print(str);}}类加载时,以上语句已被执行,因此进入main方法后输出结果为aaa。注意:构造方法test()并没有被执行。幻灯片32实际使用中要访问一个静态成员,可以通过实例对象,也可通过类名。publicclassTest{publicstaticvoidmain(Stringargs[]){MyStringa=newMyString();System.out.println(a.toString(小王,18));System.out.println(MyString.toString(小李,28));}}classMyString{publicstaticStringtoString(Stringname,intage){return(name+的年龄是+age);}}幻灯片33⑵finalffiinnaall用用来来修修饰饰一一个个不不可可再再次次更更改改的的定定义义。。如如果果ffiinnaall用用来来修修饰饰::类类,,这这个个类类不不能能被被继继承承。。方方法法,,这这个个方方法法不不能能在在子子类类中中被被覆覆盖盖。。变变量量,,这