您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 冶金工业 > Java接口、内部类和包
接口、内部类和包A.2接口(Interface)•一个类一次只能继承一个类但可以实现若干个接口。•接口只说明应该做什么但不指定如何做。•当实现接口时,表明你同意遵守定义在该接口中的契约并履行该契约。•通过正确地、具体地重写接口定义的所有方法,就可以实现一个接口。A.3声明接口[public]interfaceMyInterface{[publicstaticfinal]intA=100;[publicabstract]voidadd(intx,inty);[publicabstract]voidvolume(intx,inty,intz);}A.4•编译如下:javacMyInterface.java•用关键字implements实现接口,例如:classdemoimplementsMyInterface{publicvoidadd(intx,inty){}publicvoidvolume(intx,inty,intz){}}A.5接口使用示例interfaceA{voidshow();}classBimplementsA{intg;publicvoidshow(){System.out.println(“g=“+g);}}必须为publicclassInterfaceTest{publicstaticvoidmain(Stringargs[]){Bb=newB();b.show();}}A.6接口的特点接口及接口中成员的访问权限都是public接口中的成员方法都是public、abstract的实例成员方法接口中的所有abstract方法必须全部被实现接口的具体类实现接口中的成员变量都是常量接口不能被实例化接口是引用数据类型Ag1=newB();A.7用接口实现多重继承一个类可以继承一个父类并实现多个接口父类继承子类2子类1继承(1)单重继承(2)多重继承父类继承子类接口1实现接口1实现类接口2实现(a)继承并实现接口(b)实现多个接口接口2实现A.8接口的继承图4.5接口的继承实现SolidGraphics1立体图形接口volume()计算体积Globe2球类覆盖area()方法,计算球的表面积覆盖perimeter()方法,返回0覆盖volume()方法,计算球的体积PlaneGraphics2平面图形接口area()计算面积perimeter()计算周长继承A.9接口与抽象类的区别相同点:两者都可以包含抽象方法。两者都不能被实例化。两者都是引用数据类型。不同点:抽象类约定多个子类之间共同使用的方法;接口约定多个互不相关类之间共同使用的方法。抽象类与子类之间采用单重继承机制;一个类实现多个接口则实现了多重继承的功能。抽象类及其类中成员具有与普通类一样的访问权限;接口的访问权限有public和默认两种,接口中成员的访问权限均是public。抽象类中可以包含非抽象方法,也可以声明构造方法;接口中的方法全部是抽象方法,不能声明构造方法。抽象类中可以声明成员变量,子类可以对该成员变量赋值;接口中只能声明常量。A.10内部类(InnerClasses)内部类允许在一个类中定义另一个类,即能够使一个类成为另一个类的成员。按照如何定义以及在哪里定义内部类,内部类分为几种形式:一般内部类局部方法内部类匿名内部类静态嵌套类内部类的主要优点之一:内部类的实例与外部类的实例共享一种“特殊关系”——内部类中的代码可以访问外部类的所有成员(甚至是那些标识为private的成员)A.11常规内部类(RegularInnerClasses)例:MyOuter.java定义实例化内部类在外部类中实例化内部类从外部类之外创建内部类对象如果希望创建内部类的一个实例,则必须有外部类的一个实例。内部类的实例总是拥有一个外部类的隐含引用。编译器将负责处理这种隐含关系。A.12局部方法内部类(Method-LocalInnerClasses)局部方法内部类在外部类的方法内定义为了使用内部类,必须实例化它,该实例必须发生在同一个方法内,但位于该类的定义代码之后局部方法内部类不能使用该方法内的局部变量,final变量除外。能够应用于局部方法内部类的修饰符只有abstract和final(两者不能同时使用)A.13匿名内部类(AnonymousInnerClasses)形式一:Food.java形式二:Cookable.java形式三:方法的参数列表中声明的匿名内部类MyClass.java特点:无名称,子类或实现器作为一条语句的一部分,“};”参数列表中声明的匿名内部类:“})”A.14静态嵌套类(StaticNestedClasses)ClassBigOuter{/*外部类的静态成员,Nested在BigOuter的作用域内,只能访问外部类的静态成员。*/staticclassNested{System.out.println(“hi”);}}访问方法:BigOuter.Nestedn=newBigOuter.Nested();n.go();A.15内部类特性内部类的类特性内部类不能与外部类同名。内部类具有封装性。内部类具有继承性。内部类具有抽象性。内部类能访问外部类成员。内部类的成员特性使用点运算符“.”引用内部类。例如:MyOuter.MyInner内部类具有静态特性。A.16•使用嵌套类来反映并实施两个类之间的关系。当嵌套类只在包含它的类中有意义时,或者它依赖于包含它的类来实现功能时,应该在另一个类中定义这个类。•关于内部类的争论:•正方:在非常特定的情形下具有某些功能强大的、有效的应用(易于阅读和维护)•反方:滥用会导致象麦田迷宫一样虽然清晰但难于理解、重用的代码该如何使用内部类?A.17包•在Java中,包主要有以下用途:有助于避免命名冲突包允许将类组合成较小的单元包允许在更广的范围内保护类、数据和方法•包可以是类、接口和枚举(enum)等的集合A.18使用已有的包importjava.lang.*;importjava.io.*;importjava.util.*;注:常用包java.lang是系统自动导入的A.19使用自定义包•如果没有使用package语句,那么你的类或接口被放在默认包中,默认包是一个没有名称的包。默认包一般用于小的应用程序或用在刚开始进行开发时。否则,类和接口应该属于某个有名称的包。•创建包•packagemypackage;•导入包•importmypackage.*A.20使用自定义包默认情况下,编译器和解释器搜索包含Java平台类文件的压缩文档和当前目录。如果需要引入的包不在此范围内,则需设置包的搜索路径•设置classpath环境变量•例:有关访问权限\one、two文件夹中的例程•多个源文件属于同一个包•创建包等级•例:PackageTest(包测试)\PackageTestA.21访问控制权限修饰符访问控制private成员缺省的成员protected成员public成员同一类中成员同一包中其他类×不同包中子类××不同包中非子类×××类只能用public或缺省的访问控制权限修饰符有关访问权限\one、two文件夹中的例程A.22java.lang包2-1•该包中包含的类是Java编程的基础•其中比较重要的类包括:-Object-Class-封装类类体系结构的根封装对象或接口运行时的状态封装基本数据类型,为基本数据类型建立对象表达式A.23java.lang包2-2-Math类-String和StringBuffer-ClassLoader-Process-Runtime-SecurityManager-System提供一些常用的数学运算的方法提供常用的字符串运算提供“系统操作”,可以管理类的动态加载、外部进程的创建、主机环境查询(如一天中的时间)及安全策略的执行等A.24Object类•Object类是类体系结构的根•Java系统中的每个类都是Object类直接或间接的子类•此类定义了所有对象都具备的基本状态和行为•常用方法(结合API文档)A.25Object类的常用方法方法描述booleanequals(Objectobj)指示其他某个对象是否与此对象“相等”。voidfinalize()当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。inthashCode()返回该对象的哈希码值。voidnotify()唤醒在此对象监视器上等待的单个线程。voidnotifyAll()唤醒在此对象监视器上等待的所有线程。voidwait()在其他线程调用此对象的notify()方法或notifyAll()方法前,导致当前线程等待。StringtoString()返回该对象的字符串表示。A.26equals()•用于比较两个对象的引用是否相等,相等返回true。publicbooleanequals(Objectobj){return(this==obj);}•如果自己定义了一个类,且需要比较该类的对象是否相等时,通常需要重写Object类中的equals()方法,按照自己需要的方式进行比较例://比较两个复数是否相等publicbooleanequals(ComplexNumberc){returnthis.realPart==c.realPart&&this.imaginaryPart==c.imaginaryPart;}A.27toString()•toString用于返回对象的字符串表示。publicStringtoString(){returngetClass().getName()+@+Integer.toHexString(hashCode());}•建议所有子类都覆盖此方法。//将一个复数显示为字符串publicStringtoString(){returnthis.realPart+++this.imaginaryPart+i;}A.28toString()•使用“+”运算符将对象同一个字符串连接,Java编译器会自动调用toString方法,获取对象的字符串表现形式。Derivedd=newDerived();System.out.println(Derived的toString():+d);自动调用d.toString方法,获取对象的字符串表示形式A.29字符串池•Java程序常常涉及许多字符串•为了高效地使用内存,JVM开辟一块特殊的“字符串常量池”存放程序中所有字符串常量。•当编译器遇到字符串常量时,它检查池内是否已经存在该值。如果找到,则将新的字符串常量的引用指向现有的字符串常量,而不再创建新的String对象。SundayMondayHelloAptechWorld1234NStringday=Monday;Stringweekday=Monday;字符串常量池A.30比较下面的语句:Strings=“abc”;Strings=newString(“abc”);例:AboutString.javaA.31比较:1、Strings;System.out.println(s);2、Strings=null;System.out.println(s);3、Strings=null;System.out.println(s.charAt(1));A.32总结•final修饰符可应用于类、方法和变量。•定义抽象类的目的是提供可由其子类共享的一般形式。•接口就是需要由其他类实现的行为模板。•包•访问控制修饰符为:-public-protected-Private-默认A.33关键字2-1•基本数据类型-byte-short-int-long-float-double-char-boolean•循环关键字-do-while-for-break-continue•分支关键字-if-else-switch-case-default-
本文标题:Java接口、内部类和包
链接地址:https://www.777doc.com/doc-3613524 .html