2010-4-71第7章郭建民类与对象2010-4-72通过本章的学习,主要掌握以下知识点:包java类的基本概念对象的创建与使用对象的使用成员的调用本章的重点:创建类本章的难点:类修饰符成员变量与成员方法修饰符2010-4-737.0包java中引如了包(package)的概念来管理类名空间。就像文件夹把各种文件组织在一起,使硬盘更清晰、有条理一样,Java中的包把各种类组织在一起,使得程序功能清楚、结构分明。2010-4-747.0.1包的概念包就是Java提供的一种区别类名空间的机制,是类的组织方式,包对应一个文件夹,包中还可以再有包,称为包等级。2010-4-757.0.2使用package语句创建包格式:package包名1[.包名2[.包名3]…];2010-4-767.0.3目录布局与包的关系包对应于文件系统中的目录,用于指定把编译生产的.class文件放入该目录。示例:如果c:\shipping\objects\Hello.java中指定了packageshipping.objects;C:\javaworkjavac-dc:\workc:\shipping\objects\Hello.java生成的Hello.class文件将放在c:\work\shipping\objects中。运行:c:\workjavashipping.objects.Hello或者:c:\java-classpathc:\workshipping.objects.Hello2010-4-777.0.4利用import语句引用Java定义的包如果要使用Java包中的类,必须在源程序中用import语句导入所需要的类。import语句格式:import包名1[.包名2[.包名3…]].类名|*其中import是关键字,包名1[.包名2[.包名3…]]表示包的层次,与package语句相同,它对应于文件夹。2010-4-787.1Java的类1.系统定义的类类库2.用户自定义类如何定义类3创建对象使用new操作符创建对象4.构造方法(构造函数)构造方法的定义与使用2010-4-797.1.1系统定义的类Java语言:语法规则+类库(API)JDK(SUN提供)不同版本把一组相关的类组织在一起放在一个包中java.lang语言包java.io输入/输出包java.util实用工具包java.awt用于构建图形用户界面的包……2010-4-7107.1.1系统定义的类如何在程序中使用类库中的类除java.lang包中的类可直接使用外其余包中的类使用时必须通过import语句引入包或类(将已经存在的包引入到程序中)importjava.io.*;//引入整个包importjava.util.Collection;//引入单个类使用类库中的类可以创建相应类的对象通过继承系统类定义新的子类2010-4-7117.1.2用户定义的类针对特定问题的特定逻辑定义自己的类抽象出类并对其命名设计类的属性和方法使用Java语言书写类的源代码类头类修饰符classClassName{类体…//变量&方法}例子:PhoneCardPointRectangleStack注:类名中每个单词首字母都大写2010-4-712定义类[类修饰符]class类名称{声明成员变量[修饰符]数据类型成员变量名称;……[修饰符]返回值的数据类型方法名(参数1,参数2,……){语句序列;return[表达式];}……}1.类的一般结构2010-4-7132010-4-714类的修饰符类的访问修饰符(1)public(2)friendly(不加访问说明符时)类的其它修饰符(1)final(2)abstract2010-4-715类修饰符的含义修饰符含义public将一个类声明为公共类,它可以被任何对象访问,一个程序的主类必须是公共类。abstract将一个类声明为抽象类,没有实现的方法,需要子类提供方法的实现。final将一个类声明为最终类即非继承类,表示它不能被其他类所继承。friendly友元类型,默认的修饰符,只有在相同包中的对象才能使用这样的类。2010-4-716类修饰符的访问规则abstract类不能直接产生属于这个类的对象final类不能被其他任何类所继承(安全的考虑)public类不但可以被同一程序包中的其它类使用,别的程序包中的类也可以使用.friendly(缺省)类只能被本包中的其它类使用2010-4-717类修饰符抽象类(abstract)vs具体类没有具体实例的类抽象类往往是对多个具体类抽象公共特征得到的抽象类(鸟)具体类(鸽子、燕子、天鹅)抽象类(PhoneCard)具体类(PhoneCard201)最终类(final)不能再有子类的类(类树中的叶结点)用于定义有固定作用,完成标准功能的类例如:StringInteger……2010-4-718类修饰符(续)//数字类Number是IntegerDouble等的父类publicabstractclassNumber{……}//32位整数类Integer是一个最终类publicfinalclassIntegerextendsNumber{……}abstract与final是互斥的abstract和final可以和其他类修饰符合用(如public)2010-4-7192.成员变量格式:[修饰符]变量类型变量名[=初值]2010-4-720成员变量修饰符的含义修饰符含义public公共访问控制符。指定该变量为公共的,它可以被任何对象的方法访问。private私有访问控制符。指定该变量只允许自己类的方法访问,其他任何类(包括子类)中的方法均不能访问此变量。protected保护访问控制符。指定该变量可以被它自己的类及其子类访问,在子类中可以覆盖此变量。friendly默认的友元访问控制符,在同一个包中的其他类可以访问此变量,而其他包中的类不能访问该变量。final最终修饰符。指定此变量的值不能改变。static静态修饰符。指定该变量被所有对象共享,即所有的实例都可使用该变量。transient过渡修饰符。指定该变量是一个系统保留,暂无特别作用的临时性变量。volatile易失修饰符。指定该变量可以同时被几个线程控制和修改。2010-4-7213.成员方法声明方法的语法格式:[修饰符]返回值的数据类型方法名(参数1,参数2,……){语句序列;return[表达式];}2010-4-722成员方法修饰符的含义修饰符含义public公共访问控制符。指定该方法为公共的,它可以被任何对象的方法访问。private私有访问控制符。指定该方法只允许自己类的方法访问,其他任何类(包括子类)中的方法均不能访问此方法。protected保护访问控制符。指定该方法可以被它的类及其子类访问。friendly默认的友元访问控制符,在同一个包中的其他类可以访问此方法,而其他包中的类不能访问该方法。abstract抽象方法,指定该方法为抽象方法。final最终修饰符。指定该方法不能被重载。static静态修饰符。指定不需要实例化一个对象就可以激活的方法。synchronized同步修饰符。在多线程程序中,该修饰符用于在运行前,对它所属的方法加锁,以防止其他线程访问,运行结束后解锁。native本地修饰符。指定此方法的方法体是用其他语言(如C)在程序外部编写的。2010-4-723访问控制符(成员)当其类可以被访问时,对类的成员变量和成员方法而言,其应用范围可以通过施以一定的访问权限来限定。类内包内子类任意公共的(public)★★★★保护的(protected)★★★包访问(缺省)★★私有的(private)★当子类中的变量名与父类的相同,父类的变量被屏蔽。2010-4-724public访问规则变量和方法的修饰字public、protected、privatepublic:任何其它类、对象只要可以看到这个类的话,那么它就可以存取变量的数据或使用方法。classABC{publicintpub_i=5;publicvoidshow(){System.out.println(pub_i=+pub_i);}}2010-4-725public访问规则classDemo{publicstaticvoidmain(Stringargs[]){ABCabc=newABC();System.out.println(abc.pub_i=+abc.pub_i);abc.pub_i=10;abc.show();}}abc.pub_i=5pub_i=10;2010-4-726protected访问规则protected变量和方法如果一个类中变量或方法有修饰字protected,同一类,同一包可以使用。不同包的类要使用,必须是该类的子类可以存取变量或调用publicclassBCD{protectedintpro_i=5;protectedvoidshow(){System.out.println(pro_i=+pro_i);}}2010-4-727protected访问规则不同包中的类不能使用classDEF{publicstaticvoidmain(Stringargs[]){BCDbcd=newBCD();System.out.println(bcd.pro_i=+bcd.pro_i);bcd.pro_i=10;bcd.show();}}2010-4-728importtestpro.BCD;classDEFSUBextendsBCD{publicstaticvoidmain(Stringagrs[]){DEFSUBdef=newDEFSUB();System.out.println(def.pro_i);def.pro_i=10;def.show();}}pro_i=5pro_i=10protected访问规则不同包但是是子类2010-4-729private访问规则private不允许任何其他类存取和调用(示例AAA和BBB)friendly(前边没有修饰字的情况)在同一程序包中出现的类才可以直接使用它的数据和方法.2010-4-730变量覆盖访问规则当子类中的变量名与父类的相同,原来的变量被遮盖.classA{staticintdata_a=3;}classBextendsA{staticintdata_a=5;}classCextendsB{voidprint_out(){System.out.println(“data_a=”+data_a);System.out.println(“A.data_a=”+A.data_a);System.out.println(“B.data_a=”+B.data_a);}}data_a=5A.data_a=3B.data_a=5classVarDemo{publicstaticvoidmain(Stringargs[]){Cc=newC();c.print_out();}}2010-4-731访问权限小结2010-4-7324.非访问控制修饰符2010-4-733变量非访问控制修饰符静态变量-static仅属于类的变量类变量staticlonginstanceCount;多个对象共享静态变量最终变量(常量)finalstaticfinaldoublePI=3.1415926;常量必须初始化且只能赋值一次常量有类型、通常定义为静态变量(类变量)易失变量volatile同时被多个线程访问的变量staticvolatilelongnextCardNumber;2010-4-734方法(非访问控制修饰符)抽象方法abstract只有方法头,没有方法体(方法未实现)用于抽象对象行为的外在表现,不考虑内部实现只能在抽象类中定义抽象方法具体子类中必