《jaa程序设计》PPT课件.ppt

上传人:M****1 文档编号:569367004 上传时间:2024-07-29 格式:PPT 页数:140 大小:1.58MB
返回 下载 相关 举报
《jaa程序设计》PPT课件.ppt_第1页
第1页 / 共140页
《jaa程序设计》PPT课件.ppt_第2页
第2页 / 共140页
《jaa程序设计》PPT课件.ppt_第3页
第3页 / 共140页
《jaa程序设计》PPT课件.ppt_第4页
第4页 / 共140页
《jaa程序设计》PPT课件.ppt_第5页
第5页 / 共140页
点击查看更多>>
资源描述

《《jaa程序设计》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《jaa程序设计》PPT课件.ppt(140页珍藏版)》请在金锄头文库上搜索。

1、Java语言程序设计第三章 类与对象finalclassTrangledoublesideA,sideB,sideC;voidsetSide(doublea,doubleb,doublec)sideA=a;sideB=b;sideC=c;doublegetSideA()returnsideA;doublegetSideB()returnsideB;doublegetSideC()returnsideC;booleanisOrNotTrangle()if(sideA+sideBsideC&sideA+sideCsideB&sideB+sideCsideA)returntrue;elseretur

2、nfalse;类修类修饰符饰符类声明类声明成员变量成员变量成员函数成员函数v类声明类声明u类名须遵守的原则类名须遵守的原则符合标识符规定符合标识符规定若使用拉丁字母若使用拉丁字母,首字母大写首字母大写若由几个单词复合而成若由几个单词复合而成,每个单词的首字母大写每个单词的首字母大写u类修饰符类修饰符public该类可以被任何其它类使用该类可以被任何其它类使用abstract该类是抽象类(包含抽象方法)该类是抽象类(包含抽象方法)abstract不能和不能和final叠用修饰类叠用修饰类不能有不能有private成员变量和方法成员变量和方法final该类不能被继承该类不能被继承缺省(友好类)缺省

3、(友好类)该类仅可被同一包中的类使用该类仅可被同一包中的类使用static内部类内部类才允许声明为静态类才允许声明为静态类v静态内部类静态内部类u可直接作为一个普通类来使用,而不需实例可直接作为一个普通类来使用,而不需实例一个外部类一个外部类classOuterClspublicstaticclassInnerClsInnerCls()System.out.println(thisisinnerclass!);publicclassInnerStaticpublicstaticvoidmain(Stringargs)OuterCls.InnerClsic=newOuterCls.InnerCl

4、s();v类声明(续)类声明(续)u说明继承的父类说明继承的父类class 类名类名extends 父类名父类名 所有类都是所有类都是Object的直接或间接子类的直接或间接子类u 说明实现的接口说明实现的接口 class 类名类名 implements interface1,interface2,; 多个类可共享相同的接口多个类可共享相同的接口一个类可实现多个接口一个类可实现多个接口 类的成员变量类的成员变量v实例变量与类变量实例变量与类变量u实例变量实例变量在在对象创建对象创建时分配内存空间,对象的空间回收时释时分配内存空间,对象的空间回收时释放内存空间放内存空间对于每个对象都有不同的存储

5、空间对于每个对象都有不同的存储空间只能通过对象名访问只能通过对象名访问u类变量类变量static类被加载到内存时类被加载到内存时为类变量分配存储空间,为类变量分配存储空间,程序退程序退出运行出运行释放空间释放空间该类的所有对象共享类变量该类的所有对象共享类变量可通过可通过类名类名或对象名访问或对象名访问v实例变量与类变量(续)实例变量与类变量(续)u静态初始化器静态初始化器static初始化语句初始化语句;与构造函数的区别与构造函数的区别构造函数是对每个新创建的构造函数是对每个新创建的对象初始化对象初始化,而静,而静态初始化器是对态初始化器是对类自身的静态域进行初始化类自身的静态域进行初始化。

6、构造函数是在用构造函数是在用newnew运算符运算符产生新对象产生新对象时由系统时由系统自动执行,而静态初始化器则是在它所属的自动执行,而静态初始化器则是在它所属的类类加载到内存加载到内存时由系统调用执行。时由系统调用执行。静态初始化器不是方法,没有方法名、返回值静态初始化器不是方法,没有方法名、返回值和参数列表且和参数列表且仅执行一次仅执行一次。不能出现不能出现非静态域非静态域或或调用非静态方法调用非静态方法classPointstaticintnumberOfPoints;intx;inty;intserialNumber;staticnumberOfPoints=0;publicPoin

7、t(intnewX,intnewY)x=newX;y=newY;numberOfPoints+;serialNumber=numberOfPoints;voidprintStates()System.out.println(x=+x+,y=+y+,序号:序号:+serialNumber);importjava.io.*;classPointDemopublicstaticvoidmain(Stringargs)Pointp1=newPoint(23,94);p1.printStates();System.out.println(现在一共有现在一共有+Point.numberOfPoints+个

8、点个点);Pointp2=newPoint(34,67);p2.printStates();System.out.println(“现在一现在一共有共有+Point.numberOfPoints+个点个点);x=23,y=94,序号:序号:1现在一共有现在一共有1个点个点x=34,y=67,序号:序号:2现在一共有现在一共有2个点个点Point类类NumberOfPoints类的其它代码和静态域类的其它代码和静态域0 1 2xyserialNumber2394P1xyserialNumber3467P212v成员变量的非访问控制符成员变量的非访问控制符ustatic静态域静态域ufinal最终

9、域最终域(常量)(常量)需说明常量的数据类型且必须需说明常量的数据类型且必须初始化初始化且且仅一次仅一次初始化必须在初始化必须在定义处定义处或或构造函数构造函数中中其值一经初始化就其值一经初始化就不可改变不可改变(对于对象和数组来说(对于对象和数组来说是是引用引用不可改变)不可改变)由于所有类对象的常量成员,其数值都固定一由于所有类对象的常量成员,其数值都固定一致,致,为了节省空间,常量通常声明为为了节省空间,常量通常声明为staticuvolatile易失域易失域在被几个并发线程共享时,可被几个线程控制和修在被几个并发线程共享时,可被几个线程控制和修改改utransient暂时域暂时域当一个

10、对象被串行化的时候,当一个对象被串行化的时候,transient型变量的值型变量的值不包括在串行化的表示中不包括在串行化的表示中示例示例1示例示例转向转向publicfinalclassFinallyTestprivatefinalintpublicFinallyTest()publicFinallyTest(intpara)publicstaticvoidmain(Stringargs)FinallyTestft=newFinallyTest();System.out.println(ft.params);在构造函数在构造函数中初始化中初始化this(5);params=5;params=p

11、ara;params;params=5;this.setParams(para);publicvoidsetParams(intp)params=p;仅能初始仅能初始化一次化一次! !不能调用函数不能调用函数进行初始化进行初始化无初始化无初始化返回返回u在当前的在当前的Java内存模型下,线程可以把变量保内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。是直接在主存中进行读写。容易造成共享变量容易造成共享变量的不一致性的不一致性。uvolatile指示指示JVM,这个变量是这个变量是不稳定不稳定的,不的,不能保存

12、它的能保存它的私有拷贝私有拷贝,而应直接与,而应直接与主存中主存中的共的共享成员变量交互。享成员变量交互。uvolatile强迫强迫重读重读和和回写回写u当要访问的共享变量已在当要访问的共享变量已在synchronized代码块代码块中,中,或者为或者为常量常量时,不必使用时,不必使用共享变量共享变量主存主存6线程线程1线程线程2寄存器寄存器寄存器寄存器688共享变量共享变量主存主存6线程线程1线程线程2688volatile6888publicclassTestRaceConditionprivatevolatileinti=1;publicvoidincrease()i+;publicin

13、tgetValue()returni;线程线程1线程线程2共享变量共享变量 volatile1线程线程3线程线程42 3 4通过同步机制或硬件通过同步机制或硬件原语原语CAS来解决来解决!返回返回publicclassLoggingInfoimplementsjava.io.SerializableprivateDateloggingDate=newDate();privateStringuid;privatetransientStringpwd;LoggingInfo(Stringuser,Stringpassword)uid=user;pwd=password;publicStringto

14、String()Stringpassword=null;if(pwd=null)password=NOTSET;elsepassword=pwd;returnlogoninfo:n+user:+uid+nloggingdate:+loggingDate.toString()+npassword:+password;publicclassB6publicstaticvoidmain(Stringargs)LoggingInfologInfo=newLoggingInfo(MIKE,MECHANICS);System.out.println(logInfo.toString();tryObject

15、OutputStreamo=newObjectOutputStream(newFileOutputStream(logInfo.out);o.writeObject(logInfo);o.close();catch(Exceptione)/dealwithexceptiontryObjectInputStreamin=newObjectInputStream(newFileInputStream(logInfo.out);LoggingInfologInfo1=(LoggingInfo)in.readObject();System.out.println(logInfo1.toString()

16、;catch(Exceptione)/dealwithexceptionloggingDateuidpwd当前日期当前日期MIKEMECHANICSlogInfowritelogInfo.out当前日期当前日期MIKENULLread当前日期当前日期MIKENULLlogInfo1v在方法中使用在方法中使用final型参数型参数u可防止在方法中对形参的修改影响到实参可防止在方法中对形参的修改影响到实参u方法的内部类在用到方法中的形参时,此形方法的内部类在用到方法中的形参时,此形参也必须声明为参也必须声明为final才可使用才可使用publicclassINClassvoidinnerClass

17、(finalStringstr)classIClassIClass()System.out.println(str);IClassic=newIClass();publicstaticvoidmain(Stringargs)INClassinc=newINClass();inc.innerClass(Hello);示例示例类的成员方法类的成员方法v成员方法的非访问控制符成员方法的非访问控制符u抽象方法抽象方法abstract仅有方法声明而无方法实现仅有方法声明而无方法实现使所有子类对外具有一个统一的接口使所有子类对外具有一个统一的接口所有抽象方法必须存在于抽象类中所有抽象方法必须存在于抽象类中

18、abstract不能与不能与private、final、static叠用修饰方法叠用修饰方法u静态方法静态方法static实例方法实例方法属于对象属于对象,在不同对象空间中占用不同的,在不同对象空间中占用不同的空间;静态方法空间;静态方法属于类属于类,在类第一次被调用时被装,在类第一次被调用时被装载入内存,为类对象所共享载入内存,为类对象所共享类方法在类的字节码被类方法在类的字节码被加载到内存加载到内存时就分配了入口时就分配了入口地址,而实例方法是为地址,而实例方法是为类创建对象类创建对象后才被分配入口后才被分配入口地址地址子类子类不能重写不能重写父类的静态方法,但在子类中可以声父类的静态方法

19、,但在子类中可以声明与父类静态方法相同的方法明与父类静态方法相同的方法仅能操纵仅能操纵类变量类变量,不能操纵实例变量,不能操纵实例变量仅能调用仅能调用类方法类方法,不能调用实例方法,不能调用实例方法可以使用可以使用类名类名调用静态方法调用静态方法运行运行结果结果v成员方法的非访问控制符(续)成员方法的非访问控制符(续)u最终方法最终方法final当前类的子类当前类的子类不能覆盖不能覆盖此方法,从而防止子类修改此方法,从而防止子类修改父类的关键方法父类的关键方法所有所有private方法和包含在方法和包含在final类中的方法都默认为类中的方法都默认为是最终方法是最终方法定义为定义为final、

20、static、private的方法都可以得到运的方法都可以得到运行时效率的优化行时效率的优化inline机制可使机制可使final方法被调用时直接将方法主体方法被调用时直接将方法主体插入调用处插入调用处final方法可访问本类的方法可访问本类的非非final成员和方法成员和方法finalmethod.finalDatanotfinaldatachanged!OverrideMethod!u本地方法本地方法native无方法体,方法体是使用无方法体,方法体是使用其他语言其他语言在程序外部写成在程序外部写成的的可以利用已经存在的其他语言程序功能模块可以利用已经存在的其他语言程序功能模块可以嵌入执行

21、效率较高的语言满足特定要求可以嵌入执行效率较高的语言满足特定要求可能破坏跨平台特性可能破坏跨平台特性类的成员方法(续)类的成员方法(续)v成员方法的非访问控制符(续)成员方法的非访问控制符(续)u同步方法同步方法synchronized若是类方法,则被调用执行前,将把若是类方法,则被调用执行前,将把系统类系统类Class中对应当前类的对象中对应当前类的对象加锁加锁若是实例方法,则被调用执行前,将把若是实例方法,则被调用执行前,将把当前对象当前对象加加锁。锁。保证此方法不会被两个或以上线程同时执行,用于保证此方法不会被两个或以上线程同时执行,用于多线程间的多线程间的协调和同步协调和同步为什么要引

22、入包?为什么要引入包?v为了避免命名冲突为了避免命名冲突v包装相关功能的类包装相关功能的类v同一个包中的类之间有比较宽松的访问控制同一个包中的类之间有比较宽松的访问控制包包包名可区分不同包名可区分不同java源文件中名字相同的类源文件中名字相同的类v包语句包语句upackage 包名包名; 为源文件中定义的类指定包名,包存放在为源文件中定义的类指定包名,包存放在classpath包名包名路径下路径下包名可以是合法的标识符,也可以是若干个标识符包名可以是合法的标识符,也可以是若干个标识符加加“.”分隔而成分隔而成packagesunrise;;若使用了包名若使用了包名myjava.kafei,则

23、用户的目录结构必则用户的目录结构必须包含结构须包含结构myjavakafei(如(如e:myjavakafei)源文件必须保存在该目录下源文件必须保存在该目录下并在该目录下进行编译并在该目录下进行编译e:myjavakafeijavacHelloWorld.java运行程序时必须到上一层目录运行运行程序时必须到上一层目录运行e:javamyjava.kafei.HelloWorld若源程序中省略了若源程序中省略了package语句,系统为该源文件语句,系统为该源文件创建一个无名包,则源文件中所定义的类被隐含认创建一个无名包,则源文件中所定义的类被隐含认为是为是无名包无名包的一部分的一部分无名包

24、没有路径,一般情况下会把源文件中的类存无名包没有路径,一般情况下会把源文件中的类存储在储在当前目录当前目录(即存放(即存放Java源文件的目录)下源文件的目录)下package语句在语句在java源程序中源程序中只能有一条只能有一条,一个类,一个类只能属于一个包只能属于一个包packagemyjava.kafei;publicclassPackageExamplepublicstaticvoidmain(Stringargs)System.out.println(Ihavepackagename!);包(续)包(续)vimport语句语句uimport 包名包名;源程序中可有多个源程序中可有多

25、个import语句语句必须在必须在package语句和类定义之间语句和类定义之间可以引入自定义包中的类,但必须重新设置可以引入自定义包中的类,但必须重新设置ClassPathimport myjava.kafei.*; classpath=;.;e:如果在应用程序当前目录下建立自定义包的目录结如果在应用程序当前目录下建立自定义包的目录结构构,则不必修改则不必修改ClassPathclasspath=f:jdk1.6.0_02jrelibrt.jar;.; f:myjavakafei包(续)包(续)vimport语句(续)语句(续)u用户可以对一个单独的类进行编译,生成字用户可以对一个单独的类进

26、行编译,生成字节码文件,供其他类使用节码文件,供其他类使用packagemyjava.kafei;publicclassAprivateinta;publicA(intx)a=x;publicintget()returna;voidset(inty)a=y;importmyjava.kafei.*;publicclassBpublicstaticvoidmain(Stringargs)Amya=newA(3);System.out.println(mya.get();e:myjavakafeiA.javae:B.java包(续)包(续)vimport语句(续)语句(续)u一个源文件想使用无名包

27、中的类,要保证源一个源文件想使用无名包中的类,要保证源文件和被使用的类在同一目录中文件和被使用的类在同一目录中publicclassAApublicvoidf1()System.out.println(“thisisclassAA!”);publicclassBBpublicstaticvoidmain(Stringargs)AAaa=newAA();aa.f1();E:myjavakafeiAA.javaE:myjavakafeiBB.java包(续)包(续)vimport语句(续)语句(续)u区分有包名和无包名的类区分有包名和无包名的类importmyjava.kafei.A;同时使用无名

28、包中的同时使用无名包中的A类类Aa=newA();myjava.kafei.Aaa=newmyjava.kafei.A();u区分有包名的同名类区分有包名的同名类importmyjava.kafei.A;.A;myjava.kafei.Aa1=newmyjava.kafei.A();.Aa2=.A();若要同时使用有名包和无若要同时使用有名包和无名包的类名包的类, ,不能省略包名不能省略包名使用包名使用包名区分区分packagegraphics.twoD;publicclassRectanglepackagegraphics.twoD;publicclassPointimportgraphic

29、s.twoD.*;publicclassTestPackagepublicstaticvoidmain(Stringargs)c:workc:workc:worktest编译与运行步骤:编译与运行步骤:l将将c:mypkg添加到添加到classpath系统变量中,使该路径系统变量中,使该路径成为一个包根路径成为一个包根路径l将将c:work作为当前目录,输入作为当前目录,输入javac-dc:mypkgPoint.javaRectangle.java其中其中-d指定编译所产生类文件根路径指定编译所产生类文件根路径在在c:mypkggraphicstwoD目录下将产生目录下将产生Point.cl

30、ass和和Rectangle.class两个类文件两个类文件l进入进入TestPackage.java所在的目录所在的目录c:worktest,输入,输入javacTestPackage.javajavaTestPackage假如假如classpath环境变量按下面的值设置:环境变量按下面的值设置:classpath=c:jdk1.4.2lib;.;c:mypkg则则Java在编译在编译TestPackage.java和解释执行和解释执行TestPackage.class时,将会在下列路径下查时,将会在下列路径下查找找Point和和Rectangle类:类:nc:jdk1.4.2libgrap

31、hicstwoDPoint.classn.graphicstwoDPoint.classnc:mypkggraphicstwoDPoint.class包(续)包(续)v静态导入静态导入u导入导入有包名有包名的类的的类的类变量类变量和和类方法类方法importstatic包名包名.类名类名.*;或或importstatic包名包名.类名类名.类变量名字类变量名字;importstatic包名包名.类名类名.类方法名字类方法名字;packagemyjava.kafei;publicclassStaticExamplepublicstaticintx=56;publicstaticvoidprint

32、()System.out.println(x=+x);importstaticmyjava.kafei.StaticExample.*;publicclassMCpublicstaticvoidmain(Stringargs)x=43;print();vjar打包打包(JavaTMArchivefile)u输入是输入是.class文件文件ujarctxuvfm0Mijar-文件文件manifest-文文件件-C目录目录文件名文件名u-c创建新的存档创建新的存档-t列出存档内容的列表列出存档内容的列表-x展开存档中的命名的(或所有的展开存档中的命名的(或所有的文件文件-u更新已存在的存档更新已存

33、在的存档-v生成详细输出到标准输出上生成详细输出到标准输出上-f指定存档文件名指定存档文件名-m包含来自标明文件的标明信息包含来自标明文件的标明信息-0只存储方式;未用只存储方式;未用zip压缩格式压缩格式-M不产生所有项的清单(不产生所有项的清单(manifest文件文件-i为指定的为指定的jar文件产生索引信息文件产生索引信息-C改变到指定的目录,并且包含下列文件:改变到指定的目录,并且包含下列文件:如果一个文件名是一个目录,它将被递归处理。如果一个文件名是一个目录,它将被递归处理。清单(清单(manifest文件名和存档文件名都需要被指定,文件名和存档文件名都需要被指定,按按m和和f标志

34、指定的相同顺序。标志指定的相同顺序。Jar基本操作基本操作v创建创建jar文件文件ujarcfjar-fileinput-filesc创建一个创建一个jar文件文件f输出到文件而不是标准输出输出到文件而不是标准输出jarcfmyjar.jara.htmjarcvfmyjar.jara.htmv产生详细的输出产生详细的输出ujarcvfmyjar.jara.htmmydirectoryujarcv0fmyjar.jara.htmmydirectory0jar文件不需要被压缩文件不需要被压缩ujarcmfMANIFEST.mfmyjar.jara.txtm用来在一个已存在的清单文件中包含清单信息用

35、来在一个已存在的清单文件中包含清单信息ujarcMfMANIFEST.mfmyjar.jara.txtM默认的显示文件不应被产生默认的显示文件不应被产生ujarcvfmyjar.jar.*为当前目录下的所有内容创建为当前目录下的所有内容创建jar文件文件v例:将两个例:将两个.class文件存档到一个名为文件存档到一个名为classes.jar的存档文件中的存档文件中ujarcvfclasses.jarFoo.classBar.classv例:用一个存在的清单(例:用一个存在的清单(manifest)文件)文件mymanifest将将foo/目录下的所有文件目录下的所有文件存档到一个名为存档到

36、一个名为classes.jar的存档的存档文件中:文件中:ujarcvfmclasses.jarmymanifest-Cfoo/访问控制符访问控制符v类成员的访问控制符类成员的访问控制符 访问访问修饰符修饰符privateprotectedpublic默认默认同类同类同包同包不同包,子类不同包,子类 不同包,非子类不同包,非子类类是类是public类类访问控制符(续)访问控制符(续)v私有变量和私有方法私有变量和私有方法u只能在本类中访问只能在本类中访问u只能由本类方法直接访问,或由创建的对象只能由本类方法直接访问,或由创建的对象或由方法形参得到的对象进行访问或由方法形参得到的对象进行访问cl

37、assAAprivateintmoney;privateintgetMoney()returnmoney;voidsetMoney(AAa)a.money=100;money=60;voidprint()System.out.println(money);publicclassBBpublicstaticvoidmain(Stringargs)AAaa=newAA();AAbb=newAA();aa.money=70;System.out.println(aa.getMoney();aa.setMoney(bb);aa.print();bb.print();v公有变量和公有方法公有变量和公有方

38、法u可由程序的任何包,任何类访问可由程序的任何包,任何类访问packagemyjava.kafei;publicclassA1publicintpv;publicvoidprint()System.out.println(thisfunctionispublic!);importmyjava.kafei.*;publicclassB1publicstaticvoidmain(Stringargs)A1a1=newA1();a1.pv=32;System.out.println(a1.pv);a1.print();v保护变量和保护方法保护变量和保护方法u允许类本身、子类(相同包或不同包中)以允许

39、类本身、子类(相同包或不同包中)以及相同包中的其他类访问及相同包中的其他类访问packagemyjava.kafei;classA2protectedintx;publicA2(inta)x=a;protectedvoidprotectedF()System.out.println(thisisaprotectedfunction!+x=+x);publicclassB2publicstaticvoidmain(Stringargs)A2a2=newA2(100);a2.x=38;a2.protectedF();packagemyjava.kafei;publicclassA3protecte

40、dintx;publicA3(inty)x=y;protectedvoidprintX()System.out.println(x=+x);importmyjava.kafei.*;publicclassB3extendsA3publicB3(inty)super(y);voidf(A3a,B3b)b.x=70;b.printX();a.x=80;a.printX();publicstaticvoidmain(Stringargs)B3bb=newB3(15);A3aa=newA3(27);bb.f(aa,bb);E:B3.javaAprotectedintx;protectedvoidf()

41、;Bprotectedinty;protectedvoidg();Othera.x=3;a.f();b.x=2;b.f();x=3;f();b.x=2;b.f();a.x=3;a.f();u若类若类A、B同包同包B类的方法类的方法可可直接访问或通过直接访问或通过B对象名访问对象名访问B类从类从A类类继承下来继承下来的的protected成员变量和成员变量和B类类新增新增的的protected成员变量成员变量在主类在主类Other(与(与A、B同包)中通过同包)中通过B对象名对象名可可访访问问B类从类从A类类继承下来继承下来的的protected成员变量和成员变量和B类类新新增增的的protec

42、ted成员变量成员变量B类和类和Other类的方法类的方法可以可以通过通过A对象名访问对象名访问A的的protected成员变量成员变量Aprotectedintx;protectedvoidf();Bprotectedinty;protectedvoidg();Othera.x=3;a.f();b.x=2;b.f();x=3;f();b.x=2;b.f();a.x=3;a.f();u若类若类A、B异包异包B类的方法类的方法可可直接访问或通过直接访问或通过B对象名访问对象名访问B类从类从A类继承下来的类继承下来的protected成员变量和成员变量和B类新增的类新增的protected成员变量

43、成员变量在主类在主类Other(与(与B同包)中通过同包)中通过B对象名对象名可可访问访问B类新增的类新增的protected成员变量,但成员变量,但不可不可访问访问B类从类从A类继承下来的类继承下来的protected成员变量成员变量B类和类和Other类的方法类的方法不可不可通过通过A对象名访问对象名访问A的的protected成员变量成员变量v友好变量和友好方法友好变量和友好方法u允许同类或同一包中的类访问允许同类或同一包中的类访问packagemyjava.kafei;classA2intx;publicA2(inta)x=a;voidf()System.out.println(thi

44、sisafriendfunction!+x=+x);publicclassB2publicstaticvoidmain(Stringargs)A2a2=newA2(100);a2.x=38;a2.f();packagemyjava.kafei;publicclassA3intx;publicA3(inty)x=y;voidprintX()System.out.println(x=+x);publicvoidoutputX()System.out.println(“x=”+x);importmyjava.kafei.*;publicclassB3extendsA3publicB3(inty)su

45、per(y);staticvoidf(A3a,B3b)b.x=70;b.printX();a.x=80;a.printX();a.outputX();b.outputX();publicstaticvoidmain(Stringargs)B3bb=newB3(15);A3aa=newA3(27);f(aa,bb);E:B3.javaA:A:所有类所有类B:B:包中的类包中的类C:C:所有所有 子类子类D:D:本类本类类类属性与属性与方法方法publicprotectedprivate默认默认public默认默认ABDDB+CBBB对象对象v创建对象创建对象u对象的声明对象的声明类名类名对象名对

46、象名;u为声明的对象分配内存为声明的对象分配内存对象名对象名=new类名类名(实参表实参表);若类中无构造函数,系统调用若类中无构造函数,系统调用默认构造函数默认构造函数若类中已定义构造函数,系统不提供默认构造函数若类中已定义构造函数,系统不提供默认构造函数若类的成员变量在类定义体中没有指定初值,构造若类的成员变量在类定义体中没有指定初值,构造函数也没有进行初始化操作,则基本数据类型的成员函数也没有进行初始化操作,则基本数据类型的成员变量由系统给定变量由系统给定默认初值默认初值Personp;pp=newPerson();0nullnullnullagenamesexjobp 0xfb3cv使

47、用对象使用对象对象名对象名.成员变量名成员变量名;对象名对象名.成员方法名成员方法名(实参列表实参列表);Pointp1=newPoint(17,29);1729p1Pointp2=newPoint(6,23);0xFD9B623p2p1=p2;0xFD3A0xFD9Bp1方法的参数传递方法的参数传递v参数传值参数传值u基本数据类型参数的传值基本数据类型参数的传值向参数传递的值的级别不可以高于该参数的级别向参数传递的值的级别不可以高于该参数的级别u引用类型参数的传值引用类型参数的传值传递的是变量中存放的引用,而不是变量所引用的传递的是变量中存放的引用,而不是变量所引用的实体实体v可变参数可变参

48、数u声明方法时不给出参数列表中从某项直至最声明方法时不给出参数列表中从某项直至最后一项参数的名字和个数,但这些参数的类型后一项参数的名字和个数,但这些参数的类型必须相同必须相同public void f ( double a, int x);示例示例u参数代表可通过下标运算表示参数列表中的参数代表可通过下标运算表示参数列表中的具体参数具体参数x0 x1 u参数的个数参数的个数 x.lengthclassA5publicdoublef(doublea,int.x)doubleresult=0;intsum=0;for(inti=0;ix.length;i+)sum+=xi;result=a*su

49、m;returnresult;publicclassB5publicstaticvoidmain(Stringargs)A5a=newA5();doubler=a.f(3.27,-12,23,-6,79);System.out.println(resultis:+r);转向转向classPointintx;inty;publicPoint(intxx,intyy)x=xx;y=yy;classA4voidf(intx,Pointp)x=80;p.x=15;p.y=26;System.out.println(infunction+x=+x);System.out.println(infuncti

50、on+thepositionofpointis:+(+p.x+,+p.y+);值传递值传递引用传递引用传递publicclassB4publicstaticvoidmain(Stringargs)intx1=60;Pointp1=newPoint(43,29);A4a=newA4();System.out.println(beforethefunctionexecution+x=+x1);System.out.println(beforethefunctionexecution+thepositionofpointis:+(+p1.x+,+p1.y+);a.f(x1,p1);System.ou

51、t.println(afterthefunctionexecution+x=+x1);System.out.println(afterthefunctionexecution+thepositionofpointis:+(+p1.x+,+p1.y+);返回返回this关键字关键字u可出现在实例方法和构造方法中,但不能出可出现在实例方法和构造方法中,但不能出现在类方法中现在类方法中u由于句柄由于句柄通过编译器通过编译器秘密传递,故要在方法秘密传递,故要在方法内部获得句柄必须使用内部获得句柄必须使用this关键字关键字u当方法的形参与类的成员变量同名时,需用当方法的形参与类的成员变量同名时,需用t

52、his指明成员变量名指明成员变量名u可在构造函数内部通过可在构造函数内部通过this调用同类的另一构调用同类的另一构造函数造函数不能在一个构造函数中通过不能在一个构造函数中通过this调用调用两个两个构造函数构造函数对另一构造函数的调用必须置于对另一构造函数的调用必须置于最起始处最起始处publicclassAppledoubleprice;voidsetPrice(doubleprice)this.price=price;Appleinc()price=price+1;returnthis;voidprint()System.out.println(“price=”+price);voidi

53、ncAndPrint()inc();print();Applea=newApple();a.setPrice(1.36);Apple.setPrice(a,1.36);a.inc().inc().print();a.incAndPrint();this.inc();this.print();示例示例publicclassAppledoubleprice;Stringstrain;publicApple(doublep)price=p;System.out.println(Onlyinitializethepricedomain!);publicApple(Strings)/构造函数的重载构造函

54、数的重载strain=s;System.out.println(Onlyinitializethestraindomain!);publicApple(doublep,Stringstrain)this(p);/this(strain);this.strain=strain;System.out.println(Initializetwodomains!);publicApple()this(2.68,红富士红富士);System.out.println(theconstructorwithnoarguments!);voidprint()System.out.println(theprice

55、ofapple:+price+thestrainofapple:+strain);publicstaticvoidmain(Stringargs)Applea=newApple();a.print();构造方法构造方法u如果类中没有自定义构造方法,系统会提供如果类中没有自定义构造方法,系统会提供默认构造方法,该方法无参数且方法体为空默认构造方法,该方法无参数且方法体为空1publicclassObject23publicObject()4567publicclassEmployee8privateStringname;9privatedoublesalary=15000.00;10privat

56、eDatebirthDate;1112publicEmployee(Stringn,DateDob)13name=n;14birthDate=Dob;1516publicEmployee(Stringn)17this(n,null);181921PublicclassManagerextendsEmployee22privateStringdepartment;23publicManager(Stringn,Stringd)24super(n);25department=d;2627Finalize方法方法v垃圾收集器垃圾收集器u自动扫描对象的动态存储区,将没有引用的自动扫描对象的动态存储区,

57、将没有引用的对象作为垃圾收集,定期释放无用对象的空间对象作为垃圾收集,定期释放无用对象的空间u可在可在java程序中运行程序中运行System的的gc()方法运行垃方法运行垃圾收集程序,使圾收集程序,使JVM尽最大努力释放空间尽最大努力释放空间v撤消方法撤消方法u垃圾收集器销毁无用对象前调用垃圾收集器销毁无用对象前调用finalize方法,方法,完成对对象的完成对对象的清理工作清理工作ujava.lang.Object protected void finalize( ) throws Throwableu应用程序无法确定应用程序无法确定JVM何时何时做对象的清除工作做对象的清除工作u若在若在

58、finalize方法中抛出未捕获异常,该异常被方法中抛出未捕获异常,该异常被忽略忽略,对象的清理工作终止,对象的清理工作终止u一个类中只能定义一个一个类中只能定义一个finalize方法方法uJVM对给定对象仅执行对给定对象仅执行一次一次finalize方法方法示例示例classBookbooleancheckedout=false;Stringtitle;Book(booleancheckout,Strings)checkedout=checkout;title=s;voidcheckin()checkedout=false;protectedvoidfinalize()if(checked

59、out)System.out.println(title+Error:checkout);elseSystem.out.println(title+right:checkin);super.finalize();publicclassTestpublicstaticvoidmain(Stringargs)Booknovel=newBook(true,”A”);novel.checkin();newBook(false,”B”);Bookb=newBook(true,”C”);System.gc();b=null;novel=null;例例2基本类型的类包装基本类型的类包装byteByteint

60、IntegershortShortlongLongfloatFloatdoubleDoublecharCharacterv类包装类包装Byte(byte)、Integer(int)、Short(short)、Long(long)、Float(float)、Double(double)、Character(char)v类拆装类拆装byteValue()、intValue()、shortValue()、longValue()、floatValue()、doubleValue()、charValue()v自动装箱自动装箱u允许把基本数据类型的值直接赋给该基本数允许把基本数据类型的值直接赋给该基本数据

61、类型对应类的实例,但必须保证据类型对应类的实例,但必须保证类型一致类型一致Integer number=100; 或或 int m=100; Integer number=m; Integer number=new Integer(m);v自动拆箱自动拆箱u允许把基本数据类型相应的类实例直接赋给允许把基本数据类型相应的类实例直接赋给基本数据类型变量基本数据类型变量u允许把基本数据类型相应的类实例当作基本允许把基本数据类型相应的类实例当作基本数据类型使用数据类型使用int x=number+number; int x=number.intValue( )+number.intValue( );p

62、ublicclassDpublicstaticvoidmain(Stringargs)Integerx=100,y=12;Integerx=newInteger(100),y=newInteger(12);Integerm=x+y;Integerm=newInteger(x.intValue()+y.intValue();intok=m;intok=m.intValue();System.out.println(ok);装箱装箱先拆箱先拆箱再装箱再装箱拆箱拆箱Java语言程序设计第四章 继承与多态类的继承类的继承v子类继承父类的子类继承父类的所有所有成员成员v若子类和父类在同一包中,父类的所有

63、若子类和父类在同一包中,父类的所有非非私有私有域和方法在子类中的访问权限不变,域和方法在子类中的访问权限不变,私有私有域和方法在子类中不可访问域和方法在子类中不可访问v若子类和父类不在同一包中,父类的若子类和父类不在同一包中,父类的public、protected域和方法在子类中的访域和方法在子类中的访问权限不变。父类的问权限不变。父类的私有私有、友好友好域和方法域和方法在子类中不可访问在子类中不可访问类的继承类的继承v注意的几点注意的几点u若未指定基类,基类即若未指定基类,基类即Objectujava仅支持仅支持单继承单继承u父类的父类的构造函数构造函数不能被子类继承不能被子类继承u子类子类

64、继承继承父类的父类的除构造函数外除构造函数外的全部成员,的全部成员,但并不是所有成员在子类中都是可但并不是所有成员在子类中都是可访问访问的的成员变量的隐藏成员变量的隐藏v子类重新定义与从父类继承来的成员变量子类重新定义与从父类继承来的成员变量名称完全相同名称完全相同(类型类型可以不同)的变量可以不同)的变量v在子类对象中,父类继承来的成员变量在子类对象中,父类继承来的成员变量(即使在子类中不可访问)被隐藏后(即使在子类中不可访问)被隐藏后仍占仍占用空间用空间Aprivateinta;publicintb;protectedintc;Bpublicdoubleb;protectedfloatc;

65、aA.bA.cB.bB.cB B类对象类对象父类方法父类方法可以访问可以访问被覆盖被覆盖方法的重写方法的重写v子类中定义的方法与从父类继承来的方法子类中定义的方法与从父类继承来的方法完全相同完全相同(名称、参数个数、参数类型、(名称、参数个数、参数类型、返回类型)返回类型)v子类对象不拥有从父类继承来的被重写的子类对象不拥有从父类继承来的被重写的方法的方法的入口地址入口地址。v重写父类方法时重写父类方法时不能降低不能降低方法的访问权方法的访问权限,且父类方法访问权限限,且父类方法访问权限不能为不能为privatev子类若要使用被隐藏的方法必须使用子类若要使用被隐藏的方法必须使用superv静态

66、方法静态方法不支持运行时类型绑定不支持运行时类型绑定,注意静,注意静态方法的重写态方法的重写classAprivateinta;staticintb;protectedintc;voidf(intx,inty,intz)a=x;b=y;c=z;System.out.println(thisisffunctioninclassA!);System.out.println(a=+a+b=+b+c=+c);classBextendsAstaticintb;protectedintc;voidf(intx,inty,intz)super.f(x,y,z);System.out.println(this

67、isffunctioninclassB!);b=z+1;c=y+1;System.out.println(b=+b+c=+c);publicclassExp1publicstaticvoidmain(Stringargs)Aaa=newB();aa.f(1,2,3);thisisffunctioninclassA!a=1b=2c=3thisisffunctioninclassB!b=4c=3classAprivateinta;staticintb;protectedintc;voidf(intx,inty,intz)a=x;b=y;c=z;System.out.println(thisisff

68、unctioninclassA!);System.out.println(a=+a+b=+b+c=+c);classBextendsAstaticintb;protectedintc;voidf(intx,inty,intz,intw,intv)super.f(x,y,z);System.out.println(thisisffunctioninclassB!);b=w;c=v;System.out.println(b=+b+c=+c);publicclassExp1publicstaticvoidmain(Stringargs)Aaa=newB();aa.f(1,2,3);/aa.f(4,5

69、,6,7,8);thisisffunctioninclassA!a=1b=2c=3classAstaticintb;staticvoidf(intx)b=x;System.out.println(thisisffunctioninclassA!);System.out.println(“b=“+b);classBextendsAstaticintb;staticvoidf(intx)System.out.println(thisisffunctioninclassB!);b=x;System.out.println(b=+b);publicclassExp1publicstaticvoidma

70、in(Stringargs)Aaa=newB();aa.f(1);thisisffunctioninclassA!b=1Super关键字关键字v若在子类中父类的成员变量被隐藏或方法若在子类中父类的成员变量被隐藏或方法被重写时,可子类中可用被重写时,可子类中可用super.域名域名访问父访问父类被隐藏的域或用类被隐藏的域或用super.成员名成员名(实参列表实参列表) 被重写的方法。被重写的方法。u被隐藏的成员变量也要分配内存,但该内存被隐藏的成员变量也要分配内存,但该内存单元不属于任何对象,必须用单元不属于任何对象,必须用super访问访问u被隐藏的方法也要分配入口地址,但该入口被隐藏的方法也

71、要分配入口地址,但该入口地址仅对地址仅对super可见,必须由可见,必须由super调用调用Super关键字关键字v可在子类构造函数中用可在子类构造函数中用super (实参列表实参列表)调用父类的构造函数,必须是子类构造函调用父类的构造函数,必须是子类构造函数的数的第一个语句第一个语句u若子类构造函数没有显式使用若子类构造函数没有显式使用super调用父类调用父类的某个构造函数,则默认有的某个构造函数,则默认有super(),即调用即调用父类不带参数的构造函数父类不带参数的构造函数nowthepositionis:x=1.2y=3.5nowthepositionis:x=2.2y=5.8no

72、wthepositionis:x=2.17y=1.28nowthepositionofrectangleis:x=2.3y=3.4若父类中定义了一个或若父类中定义了一个或多个构造函数,多个构造函数,java不不提供默认构造方法提供默认构造方法多态性多态性v对象的上转型对象对象的上转型对象Animal a=new Tiger( );u上转型对象会失去原对象的一些上转型对象会失去原对象的一些特有的属性特有的属性和功能和功能u上转型对象不能操作子类上转型对象不能操作子类新增新增的成员变量和的成员变量和方法方法u上转型对象可以操作子类上转型对象可以操作子类继承或隐藏继承或隐藏的成员的成员变量变量u上转

73、型对象可以使用子类上转型对象可以使用子类继承或重写继承或重写的方的方法,若子类重写了父类的某个方法,上转型法,若子类重写了父类的某个方法,上转型对象调用该方法一定是调用了对象调用该方法一定是调用了子类的重写方子类的重写方法法。u可以将对象的上转型对象再可以将对象的上转型对象再强制转换强制转换为一个为一个子类对象,此时该子类对象又具备了子类子类对象,此时该子类对象又具备了子类所有所有的属性和功能的属性和功能Tiger t=(Tiger)a;classAintx;inty;A(inta,intb)x=a;y=b;voidf()System.out.println(thisisinclassA:x=

74、+x+y=+y);voidg()System.out.println(thisisafunctioninclassA!);classBextendsAintx,z;B(inta,intb,intc,intd)super(a,b);x=c;z=d;voidoutput()System.out.println(inclassB:x=+x+z=+z);System.out.println(inclassA:x=+super.x+y=+y);voidf()System.out.println(thisisinclassB!x=+x+“z=“+z);publicclassDuoTaipublicstat

75、icvoidmain(Stringargs)Aa=newB(1,2,3,4);a.x=6;a.y=7;a.z=8;(B)a).z=8;(B)a).x=9;a.output();(B)a).output();a.f();a.g();inclassB:x=9z=8inclassA:x=6y=7thisisinclassB!x=9z=8thisisafunctioninclassA!可通过调用可通过调用f()间间接访问接访问B类中的同类中的同名域和新增域名域和新增域A.xA.yB.xB.zB.f()的入口地址的入口地址A.g()的入口地址的入口地址B.output()的入口地址的入口地址B类对象类对

76、象B类对象的上转型对象类对象的上转型对象A.f()的入口地址的入口地址多态的实现多态的实现一个接口,多种实现一个接口,多种实现v运行时多态的实现运行时多态的实现u通过继承中通过继承中超类超类对象引用指向子类对象来实对象引用指向子类对象来实现现u通过通过抽象类抽象类对象引用指向子类对象来实现对象引用指向子类对象来实现u通过通过接口接口类型变量引用实现接口的类的对象类型变量引用实现接口的类的对象来实现来实现v参数多态的实现参数多态的实现u通过通过重载重载实现实现形参的形参的个数个数、类型类型或或顺序顺序不同不同梯形底的锥体积是梯形底的锥体积是536.022圆形底的锥体积是圆形底的锥体积是3343.

77、082639999999v多态可以让程序多态可以让程序对扩展开放,对修改关闭对扩展开放,对修改关闭,增强代码的可维护性增强代码的可维护性u应对抽象基类的修改应对抽象基类的修改“关闭关闭”若再增加一个抽象方法,则所有子类都要作出修若再增加一个抽象方法,则所有子类都要作出修改;改;u应对增加应对增加abstract的子类的子类“开放开放”在程序中再增加抽象基类的子类时,不需要修改在程序中再增加抽象基类的子类时,不需要修改其他重要的类其他重要的类动态绑定动态绑定v将对方法的调用连系到调用其的对象称为将对方法的调用连系到调用其的对象称为绑定绑定v若绑定是在若绑定是在编译或连接时编译或连接时确定的称作确

78、定的称作前绑前绑定定;在;在运行时运行时确定的称为确定的称为后绑定后绑定或或动态绑动态绑定定。v除了除了static与与final(private)方法,方法,Java中中所有的方法都采用后绑定所有的方法都采用后绑定vfinal(private)方法不能被重写;方法不能被重写;static方方法可以被重写,但不会发生后绑定法可以被重写,但不会发生后绑定thisisclassA!thisisclassB!构造函数与多态性构造函数与多态性v若在基类的构造函数中调用某个方法,而若在基类的构造函数中调用某个方法,而该方法又被子类重写,则该方法又被子类重写,则u创建子类对象调用基类构造函数时,调用的创建

79、子类对象调用基类构造函数时,调用的是类的继承层次中是类的继承层次中最后被重写的版本最后被重写的版本。u若子类中重写的方法用到了子类中定义的成若子类中重写的方法用到了子类中定义的成员变量,则注意员变量,则注意构造器的执行过程构造器的执行过程:装载程序加载主类装载程序加载主类自下而上装载父类自下而上装载父类自上而下执行自上而下执行static成员变量初始化成员变量初始化为子类对象分配空间并将成员清为子类对象分配空间并将成员清0调用父类构造器进行初始化调用父类构造器进行初始化执行子类构造器进行初始化执行子类构造器进行初始化u最好在构造函数中只调用最好在构造函数中只调用final或或private方法

80、方法AA()voidg();voidg();Bvoidg();Cvoidg();创建创建B类对类对象时调用象时调用创建创建C类对类对象时调用象时调用创建创建C类对类对象时调用象时调用classAintx;A(inta)setVal(a);System.out.println(ConstructorinclassA!);voidsetVal(inta)x=a;System.out.println(functionofclassA!x=+x);classBextendsAinty;voidsetVal(inta)System.out.println(functionofclassB!y=+y);y

81、=a;B(inta,intb)super(a);y=b;System.out.println(ConstructorinclassB!);voidoutput()System.out.println(x=+x+y=+y);publicclassFpublicstaticvoidmain(Stringargs)Bb=newB(1,2);b.output();functionofclassB!y=0ConstructorinclassA!ConstructorinclassB!x=0y=2接口接口v接口定义接口定义publicinterface接口名接口名extends父接口父接口名表名表常量声明

82、常量声明;方法声明方法声明;u方法一定是方法一定是publicabstract,常量一定是常量一定是publicstatic,但关键字可省略但关键字可省略v接口使用接口使用class类名类名implements 接口名列表接口名列表u若一个类使用了某接口,则必须实现该接口若一个类使用了某接口,则必须实现该接口的的所有所有方法方法公有接口公有接口v注意注意u用户可以自定义接口用户可以自定义接口uimport 语句不仅可以引入包中的类,也可以语句不仅可以引入包中的类,也可以引入包中的接口引入包中的接口u接口中的常量既可以被接口中的常量既可以被实现该接口的类对象实现该接口的类对象或类名或类名调用,也

83、可以用调用,也可以用接口名接口名直接调用。在实直接调用。在实现该接口的类内部可以现该接口的类内部可以直接直接访问。访问。upublic接口可以被接口可以被任何类任何类声明实现,声明实现,友好友好接口接口可以被与该接口在可以被与该接口在同一个包同一个包中的类声明实现中的类声明实现u若父类实现了某个接口,那么子类也就自然若父类实现了某个接口,那么子类也就自然实现了该接口,不必使用实现了该接口,不必使用implements声明声明u类在实现接口中的抽象方法时,必须用类在实现接口中的抽象方法时,必须用publicu若一个类未实现接口中的所有方法,则该类若一个类未实现接口中的所有方法,则该类必须是必须是

84、abstract类类为什么要使用接口为什么要使用接口?机动车机动车abstractvoid收取费用收取费用()abstractvoid调节温度调节温度()出租车出租车publicvoid收取费用收取费用()publicvoid调节温度调节温度()?拖拉机拖拉机publicvoid收取费用收取费用()publicvoid调节温度调节温度()公共汽车公共汽车publicvoid收取费用收取费用()publicvoid调节温度调节温度()飞机飞机publicvoid收取费用收取费用()publicvoid调节温度调节温度()电影院电影院publicvoid收取费用收取费用()publicvoid调节

85、温度调节温度()收费收费void收取费用收取费用()调温调温void调节温度调节温度()publicvoid收取费用收取费用()公共汽车公共汽车出租车出租车publicvoid收取费用收取费用()publicvoid调节温度调节温度()implementsimplementsimplements飞机飞机publicvoid收取费用收取费用()publicvoid调节温度调节温度()电影院电影院publicvoid收取费用收取费用()publicvoid调节温度调节温度()v接口带来的方便接口带来的方便u不同的类可以使用相同的接口,同一个类可不同的类可以使用相同的接口,同一个类可以实现多个接口以

86、实现多个接口u实现相同接口的类可以没有联系实现相同接口的类可以没有联系v接口回调与多态接口回调与多态u把实现某一接口的类创建的对象引用赋值给把实现某一接口的类创建的对象引用赋值给该接口声明的接口变量该接口声明的接口变量u接口变量回调接口方法接口变量回调接口方法时产生多态时产生多态u使用接口可以体现程序设计的使用接口可以体现程序设计的“开开闭闭”原原则则对接口的修改对接口的修改“关闭关闭”对增加实现该接口的类对增加实现该接口的类“开放开放”v接口做参数接口做参数u如果方法的参数是接口类型,用户可以将任如果方法的参数是接口类型,用户可以将任何实现该接口的类的对象引用传递给该接口参何实现该接口的类的

87、对象引用传递给该接口参数数vabstract类与接口的比较类与接口的比较u都可以有都可以有abstract方法方法uabstract类中可以有非类中可以有非abstract方法,但接口方法,但接口不可以不可以u接口中只可以有常量,不能有变量;接口中只可以有常量,不能有变量;abstract类中既可以有常量,也可以有变量类中既可以有常量,也可以有变量u类可以实现多个接口,但只能继承一个抽象类可以实现多个接口,但只能继承一个抽象类类area=52.38梯形的面积是梯形的面积是52.38area=326.68559999999997圆的面积是圆的面积是326.68559999999997Java的的

88、“多重继承多重继承”v既继承基本类又实现接口时,应先出现基既继承基本类又实现接口时,应先出现基本类再出现接口本类再出现接口importjava.util.*;interfaceCanFightvoidfight();interfaceCanSwimvoidswim();interfaceCanFlyvoidfly();classActionCharacterpublicvoidfight()System.out.println(“canfight!”);classHeroextendsActionCharacter implementsCanFight,CanSwim,CanFlypublic

89、voidswim()System.out.println(“canswim!”);publicvoidfly()System.out.println(“canfly!”); 不占据存不占据存储空间储空间publicclassAdventurestaticvoidt(CanFightx)x.fight();staticvoidu(CanSwimx)x.swim();staticvoidv(CanFlyx)x.fly();staticvoidw(ActionCharacterx)x.fight();publicstaticvoidmain(Stringargs)Heroi=newHero();t(

90、i);u(i);v(i);w(i);can fight!can swim!can fly!can fight!能上塑造型到能上塑造型到多个基础类多个基础类抽象类和接口的选择抽象类和接口的选择v假如想创建的基础类没有任何方法实现或假如想创建的基础类没有任何方法实现或者成员变量,那么无论如何都愿意使用接者成员变量,那么无论如何都愿意使用接口,而不要选择抽象类。口,而不要选择抽象类。v只有在必须使用方法实现或者成员变量的只有在必须使用方法实现或者成员变量的时候,才应考虑采用抽象类。时候,才应考虑采用抽象类。收费收费void收取费用收取费用()出租车出租车publicvoid收取费用收取费用()pub

91、licvoid调节温度调节温度()公共汽车公共汽车publicvoid收取费用收取费用()publicvoid调节温度调节温度()电影院电影院publicvoid收取费用收取费用()publicvoid调节温度调节温度()void调节温度调节温度()implementsimplementsimplements接口方法的增加导致所有实现该接口的类的改变接口方法的增加导致所有实现该接口的类的改变!?收费收费void收取费用收取费用()收费调温收费调温void调节温度调节温度()公共汽车公共汽车publicvoid收取费用收取费用()出租车出租车publicvoid收取费用收取费用()publicv

92、oid调节温度调节温度()电影院电影院publicvoid收取费用收取费用()publicvoid调节温度调节温度()implementsimplementsimplements接口的继承接口的继承v接口间可以继承,且允许接口间可以继承,且允许多继承多继承,可将几,可将几个接口合并为一个新接口个接口合并为一个新接口示例示例thisisffunctioninclassAA!thisisffunctioninclassAA!thisisgfunctioninclassAA!thisisffunctioninclassBB!thisisffunctioninclassBB!thisisgfuncti

93、oninclassBB!thisishfunctioninclassBB!thisisfucfunctioninclassBB!thisisffunctioninclassBB!thisisgfunctioninclassBB!thisishfunctioninclassBB!接口中的常数接口中的常数v接口中的常数定义时接口中的常数定义时必须进行初始化必须进行初始化,可,可初始化为初始化为非常数表达式非常数表达式v在首次装载接口之后,首次访问任何字段在首次装载接口之后,首次访问任何字段前获得初始化前获得初始化v在实现接口的类中,可直接访问接口中的在实现接口的类中,可直接访问接口中的常数;在实现

94、接口的类外部,可通过类常数;在实现接口的类外部,可通过类名、对象名或接口名访问接口中的常数。名、对象名或接口名访问接口中的常数。importjava.util.*;interfaceRandValsintrint=(int)(Math.random()*10);longrlong=(long)(Math.random()*10);floatrfloat=(float)(Math.random()*10);doublerdouble=Math.random()*10;publicclassTestRandValspublicstaticvoidmain(Stringargs)System.out

95、.println(RandVals.rint);System.out.println(RandVals.rlong);System.out.println(RandVals.rfloat);System.out.println(RandVals.rdouble);353.72099886.322790746731383内部类内部类v内部类内部类u内部类是在一个类的声明里声明的类,也称内部类是在一个类的声明里声明的类,也称为嵌套类为嵌套类classAclassB内部类的使用内部类的使用v内部类可以作为外包类的一个成员使用,内部类可以作为外包类的一个成员使用,可以访问外包类的所有成员可以访问外包类

96、的所有成员u包括包括static静态成员变量和方法静态成员变量和方法u包括包括private私有成员私有成员Thevalueofsize:1Thevalueofsize:2Thevalueofsize:3Thevalueofsize:40OutersizeiInnerOuter.this在内部类对象中保存了一个对其外包类对象的在内部类对象中保存了一个对其外包类对象的引用引用v非静态内部类非静态内部类u可隐藏不想让别人知道的操作可隐藏不想让别人知道的操作封装性封装性u在外部类作用范围之外得到内部类对象的一个在外部类作用范围之外得到内部类对象的一个方法,是利用其外部类的方法创建并返回方法,是利用其

97、外部类的方法创建并返回u非静态内部类对象有着非静态内部类对象有着指向其外部类对象的引指向其外部类对象的引用用Java编译器在创建内部类对象时,隐式的把其编译器在创建内部类对象时,隐式的把其外部外部类对象的引用类对象的引用也传了进去并一直保存着。也传了进去并一直保存着。u一个内部类对象可以访问创建它的外部类对象一个内部类对象可以访问创建它的外部类对象的内容的内容u如果内部类里的一个成员变量与外部类的一个如果内部类里的一个成员变量与外部类的一个成员变量成员变量同名同名,Java里用如下格式表达外部类里用如下格式表达外部类的引用:的引用:outerClass.thisu在任何非静态内部类中,都不能有

98、在任何非静态内部类中,都不能有静态数据静态数据,静态方法静态方法或者又一个或者又一个静态内部类静态内部类u在外部类中要访问内部类的成员,在外部类中要访问内部类的成员,必须通过必须通过内部类的对象内部类的对象,通过内部类对象甚至可以访问,通过内部类对象甚至可以访问到内部类的私有成员到内部类的私有成员v在外包类的语句块中定义内部类在外包类的语句块中定义内部类u内部类可以访问语句块中的局部变量内部类可以访问语句块中的局部变量u当语句块运行结束后,内部类对象将不能访当语句块运行结束后,内部类对象将不能访问所在语句块中的局部变量问所在语句块中的局部变量u但但final变量(常值局部变量)在方法运行结变量

99、(常值局部变量)在方法运行结束后仍然存在,所以内部类对束后仍然存在,所以内部类对带有带有final的局部的局部变量变量的访问不受限制的访问不受限制u内部类只能在定义它的语句块中创建该内部内部类只能在定义它的语句块中创建该内部类的对象类的对象Theobjectis#v在外包类以外的其他类中访问内部类在外包类以外的其他类中访问内部类u内部类的访问权限可以是内部类的访问权限可以是public、protected、default或或privateu在外包类之外访问内部类时,引用内部类名在外包类之外访问内部类时,引用内部类名必须使用必须使用外包类名外包类名. .内部类名内部类名Thesizevalueo

100、ftheOuterclass:1u在内部类对象中保存了一个对其外包类对象在内部类对象中保存了一个对其外包类对象的引用的引用外包类名外包类名.this.thissizeinInner.doStuff():11sizeintheInnerclass:1sizeintheOuterclass:1v内部类的特性内部类的特性u内部类可以使用内部类可以使用public、protected、default、private等等4种访问权限控制种访问权限控制u内部类可以被声明为内部类可以被声明为static,这样的内部类变,这样的内部类变成顶层类,相当于把它放在外面,不再是嵌套成顶层类,相当于把它放在外面,不再

101、是嵌套的内部类,并且的内部类,并且它的对象中将不包含指向外包它的对象中将不包含指向外包类对象的指针类对象的指针,所以不能再引用外包类对象,所以不能再引用外包类对象u内部类可以在成员方法中或代码块中定义,内部类可以在成员方法中或代码块中定义,该成员方法的局部变量及参数必须是该成员方法的局部变量及参数必须是final才能才能被内部类使用被内部类使用u内部类的类名只能用于定义它的类或语句块内部类的类名只能用于定义它的类或语句块之内,在外部引用时必须给出带有之内,在外部引用时必须给出带有外包类名的外包类名的完整名称完整名称,并且内部类的名字不许与外包类的,并且内部类的名字不许与外包类的名字相同名字相同

102、u内部类可以访问外包类的静态或实例成员变内部类可以访问外包类的静态或实例成员变量量u内部类可以是抽象类或接口,如果是接口,内部类可以是抽象类或接口,如果是接口,则可以由其他内部类实现则可以由其他内部类实现u一般内部类的成员不能被声明为一般内部类的成员不能被声明为static,只有,只有static内部类可以声明内部类可以声明static成员成员匿名类匿名类v和类有关的匿名类和类有关的匿名类ujava允许用户把类体与对象的创建组合在一起允许用户把类体与对象的创建组合在一起u基类可以是抽象类或接口基类可以是抽象类或接口u匿名类可以继承父类的方法,也可以重写父匿名类可以继承父类的方法,也可以重写父类

103、的方法类的方法u匿名对象的引用可以作为参数传递给方法匿名对象的引用可以作为参数传递给方法new基类名基类名()匿名类的类体匿名类的类体pickButton.addActionListener(newActionListener();当一个内部类的类声名只是在创建此类对象时用了一次,当一个内部类的类声名只是在创建此类对象时用了一次,而且要产生的新类需继承于一个而且要产生的新类需继承于一个已有的父类或实现一个已有的父类或实现一个接口接口,才能考虑用匿名类,由于匿名类本身无名,因此,才能考虑用匿名类,由于匿名类本身无名,因此它也就不存在构造方法,它需要显示地调用它也就不存在构造方法,它需要显示地调用

104、一个无参的一个无参的父类的构造方法父类的构造方法,并且,并且重写父类的方法重写父类的方法。 v与接口有关的匿名类与接口有关的匿名类ujava允许直接使用允许直接使用接口名和一个类体接口名和一个类体创建一个创建一个匿名对象匿名对象u类体必须实现接口中的全部方法类体必须实现接口中的全部方法u若某方法的参数是接口类型,用户可以使用若某方法的参数是接口类型,用户可以使用接口名和类体组合创建一个匿名对象,传递给接口名和类体组合创建一个匿名对象,传递给该方法的参数该方法的参数new接口名接口名()实现接口的匿名类的类体实现接口的匿名类的类体voidf(Computablex);f(newComputabl

105、e()实现实现Computable的匿名类的类体的匿名类的类体);v使用使用native方法将方法将Java同程序相连的实现同程序相连的实现步骤:步骤:u编写编写java程序,在程序,在java中声明中声明native方法方法packagecom.hode.hodeframework.modelupdate;publicclassCheckFilepublicnativevoiddisplayHelloWorld();staticSystem.loadLibrary(test);publicstaticvoidmain(Stringargs)newCheckFile().displayHell

106、oWorld();加载动态加载动态链接库文件链接库文件u将将CheckFile.java编译成编译成CheckFile.classu在在CheckFile.class的目录下执行的目录下执行javah-jnicom.hode.hodeframework.modelupdate.CheckFile,在该目录下生成在该目录下生成com_hode_hodeframework_modelupdate_CheckFile.hu编写编写com_hode_hodeframework_modelupdate_CheckFile.c#includeCheckFile.h”#include#includeJNIE

107、XPORTvoidJNICALLJava_com_hode_hodeframework_modelupdate_CheckFile_displayHelloWorld(JNIEnv*env,jobjectobj)printf(Helloworld!n);return;u编译生成编译生成DLL文件文件test.dllcl-I%java_home%include-I%java_home%includewin32-LDcom_hode_hodeframework_modelupdate_CheckFile.c-Fetest.dllu在运行时加参数在运行时加参数-Djava.library.path=dll存放存放的路径的路径

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号