《Java面向对象编程进阶.ppt》由会员分享,可在线阅读,更多相关《Java面向对象编程进阶.ppt(42页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第5章 Java面向对象编程进阶 5.15.15.15.1 内部类和匿名类内部类和匿名类内部类和匿名类内部类和匿名类 (略略略略)5.2 5.2 5.2 5.2 抽象类抽象类抽象类抽象类 5.3 5.3 5.3 5.3 继承继承继承继承 5.4 5.4 5.4 5.4 包包包包 5.5 5.5 5.5 5.5 接口接口接口接口abstract class Shape /说明一般二维图形抽象类说明一般二维图形抽象类 abstract double area();/计算图形面积的方法计算图形面积的方法 abstract void draw();/绘制图形的方法绘制图形的方法 有时,由于有时,由于对
2、象高级抽象的需要,希望类只需要说明方法首部,而不对象高级抽象的需要,希望类只需要说明方法首部,而不需要或不可能说明其方法体,其方法体只能由其子类来完成,这样的类需要或不可能说明其方法体,其方法体只能由其子类来完成,这样的类需要使用需要使用abstractabstract关键字修饰,这种类被称为关键字修饰,这种类被称为抽象类抽象类。抽象类不能创建任何对象,抽象类只是用来由其子类继承。继承抽象抽象类不能创建任何对象,抽象类只是用来由其子类继承。继承抽象类的子类比它的父类更加具体化、特殊化。类的子类比它的父类更加具体化、特殊化。例例5-15-1 抽象类抽象类ShapeShape5.2 5.2 抽象类
3、抽象类 class Rectangle extends Shape /矩型类矩型类Rectangle继承了继承了Shape类类 int width;/矩形的宽矩形的宽 int length;/矩形的长矩形的长 punlic double area()return width*length/矩形类实现了矩形类实现了Shape类的抽象方法类的抽象方法area()public void draw()/这里要实现这里要实现Shape类的抽象方法类的抽象方法draw()5.3 5.3 继承继承5.3.1 继承概述继承概述 5.3.2 继承语法格式继承语法格式 5.3.3 子类对父类成员重载子类对父类成员
4、重载 5.3.4 null,this,super5.3.5 多态性多态性5.3.6 final类类(最终类最终类)在在Java编程语言中,通过继承可利用已有的类,并扩展它的属性编程语言中,通过继承可利用已有的类,并扩展它的属性和方法。这个已有的类可以是语言本身提供的、其他程序员编写的或程和方法。这个已有的类可以是语言本身提供的、其他程序员编写的或程序员原来编写的。序员原来编写的。如果在声明类如果在声明类A时,指明类时,指明类A继承了类继承了类B(类(类B是一个已定义了的类)是一个已定义了的类),则类,则类A通常就拥有了类通常就拥有了类B的成员变量和方法。此时,类的成员变量和方法。此时,类B称为
5、类称为类A的父的父类(类(superclass),父类也称为超类或基类;类父类也称为超类或基类;类A称为类称为类B的子类的子类(subclass),),子类也称为派生类。子类也称为派生类。Object类是类是Java中所有类的父类,中所有类的父类,也就是说也就是说Java中的类直接或间接有中的类直接或间接有Object类派生而来。类派生而来。Java中实行单继承,即一个类只能有一个父类。中实行单继承,即一个类只能有一个父类。5.3.1 继承概述继承概述 一个类只可继承一个父类,但一个类可以有被多个子类继承。一个类只可继承一个父类,但一个类可以有被多个子类继承。因而类之间的关系就形成了所谓的树形
6、层次结构:因而类之间的关系就形成了所谓的树形层次结构:类类A类类C1n类类C11类类Bm类类B2类类B1类类Cm1类类Cmn在在JavaJava中,中,java.lang.Objectjava.lang.Object类是类是JavaJava所有类的父类。所有类的父类。类继承语法形式如下:类继承语法形式如下:修饰符修饰符 class SubClassName extends SupperClassName extends是继承关键词。是继承关键词。SubClassName是新的子类名,是新的子类名,SupperClassName是继承的父类名。父类名是必需的,而且只能有一个,是继承的父类名。父类
7、名是必需的,而且只能有一个,因为因为Java中实行单继承。父类名所指定的类必须是在当前编译单元中可中实行单继承。父类名所指定的类必须是在当前编译单元中可以访问的类,否则会产生编译错误。以访问的类,否则会产生编译错误。5.3.2 继承语法格式继承语法格式 子类的特性子类的特性:子类拥有其父类的所有属性和方法。但父类中说明为子类拥有其父类的所有属性和方法。但父类中说明为private的属性和方法,子类不可直接访问。的属性和方法,子类不可直接访问。子类可以对父类的方法覆盖或重载。子类可以对父类的方法覆盖或重载。例例.5-2子类与父类子类与父类 class class A A private priv
8、ate int int a;a;protected protected int int b;b;public public intint c;c;public void public void setAsetA(intint aaaa)a=)a=aaaa;public public int getAint getA()return a;()return a;class class B B extends extends A A intint d;d;public static void main(String public static void main(String args args)B
9、 b1=new B();B b1=new B();b1.b1.setAsetA(10);b1.b=20;b1.c=30;(10);b1.b=20;b1.c=30;b1.d=b1.b1.d=b1.getAgetA()+b1.b+b1.c;()+b1.b+b1.c;System.out.print(b1.d);System.out.print(b1.d);子类可以对父类的方法覆盖或重载。子类可以对父类的方法覆盖或重载。方法覆盖方法覆盖:子类的方法首部与父类的方法首部相同,但是子类重新子类的方法首部与父类的方法首部相同,但是子类重新实现了该方法。实现了该方法。方法重载方法重载:Java中方法可重载中
10、方法可重载,就是方法名相同但形参列表不同之就是方法名相同但形参列表不同之方法。方法。子类的方法对父类的方法也可重载。子类的方法对父类的方法也可重载。5.3.3 5.3.3 子类对父类成员重载子类对父类成员重载 如果子类声明了一个与父类的成员变量同名的成员变量,则称父类如果子类声明了一个与父类的成员变量同名的成员变量,则称父类的该成员变量被的该成员变量被隐藏隐藏(Hiding),),如果子类声明了一个与父类的成员如果子类声明了一个与父类的成员方法同名的成员方法,则称父类的该成员方法被方法同名的成员方法,则称父类的该成员方法被重写重写(Overriding)。)。关键字关键字this和和super
11、分别用来指明子类和父类中同名的成员变量和方法。分别用来指明子类和父类中同名的成员变量和方法。当父类的成员变量、子类的成员变量和类的对象方法使用的局部变量三当父类的成员变量、子类的成员变量和类的对象方法使用的局部变量三者同名,或其中两个同名时,可以使用关键字者同名,或其中两个同名时,可以使用关键字this和和super来指定所要使来指定所要使用的变量。用的变量。继承是面向对象编程的主要优点之一,它对如何设计继承是面向对象编程的主要优点之一,它对如何设计JavaJava类有着直类有着直接的影响。继承有如下几点好处:接的影响。继承有如下几点好处:(1 1)它可以利用已有的类来创建自己的类,只需要指出
12、自己的类和已)它可以利用已有的类来创建自己的类,只需要指出自己的类和已有的其它的类有什么不同即可,而且还可以动态访问其它有关的类中的有的其它的类有什么不同即可,而且还可以动态访问其它有关的类中的信息。信息。(2 2)通过继承,可以利用)通过继承,可以利用JavaJava类库所提供的丰富而有用的类,这些类库所提供的丰富而有用的类,这些类都已经被很好地实现。类都已经被很好地实现。(3 3)当设计很大的程序时,继承可以使程序组织得更加层次清晰,有)当设计很大的程序时,继承可以使程序组织得更加层次清晰,有利于程序设计和减少错误的发生。利于程序设计和减少错误的发生。例例5-3 5-3 子类与父类的继承关
13、系子类与父类的继承关系 public class Point /定义定义Point类类 int x;int y;public Point()public Point()/构造方法构造方法,构造原点构造原点(0,0)(0,0)x=0;y=0;x=0;y=0;public Point(public Point(intint X,X,int int Y)Y)/构造方法构造方法,按给定的按给定的X X、Y Y 值值 x=X;y=Y;x=X;y=Y;/构成一个点(构成一个点(X,YX,Y)public double distance()public double distance()/定义方法定义方法,
14、求点到坐标原点的距离求点到坐标原点的距离 return Math.return Math.sqrtsqrt(x*x+y*y);(x*x+y*y);/调用调用MathMath类的方法类的方法sqrtsqrt()()public static void draw()public static void draw()/类方法类方法draw(),draw(),画点画点 System.out.System.out.printlnprintln(Point:a point.Point:a point.););class ColorPoint extends Point class ColorPoint e
15、xtends Point intint color;color;public static void draw()public static void draw()/复盖了父类的复盖了父类的draw()draw()方法方法 System.out.System.out.printlnprintln(“(“ColorPointColorPoint:a color point.”);:a color point.”);class MapPoint extendsclass MapPoint extends ColorPoint ColorPoint /定义类定义类,继承继承ColorPointCol
16、orPoint类类 /类类ObjectObject、PointPoint均是均是MapPointMapPoint的父类的父类,但都不是直接父类但都不是直接父类String name;String name;/地图上的点有自己的名字,如城市名地图上的点有自己的名字,如城市名 public static void draw()public static void draw()/复盖了父类的复盖了父类的draw()draw()方法方法 System.out.System.out.printlnprintln(MapPointMapPoint:a map color point.:a map colo
17、r point.););public classpublic class SuperSub SuperSub public static void main(String public static void main(String args args)Point.draw();Point.draw();ColorPoint ColorPoint.draw();.draw();MapPoint.draw();MapPoint.draw();此程序运行后将输出如下结果:此程序运行后将输出如下结果:Point:a point.ColorPoint:a color point.MapPoint:a
18、map color point.5.3.4 null、this、super JavaJava语言规范中,每个类均有这样语言规范中,每个类均有这样3 3个对象:个对象:nullnull、thisthis、supersuper nullnull “空空”变量,表示这个对象不存在相应的实例变量,表示这个对象不存在相应的实例 例如:例如:Rectangle Rectangle rectrect=nullnull;当一个对象不再有用时,应当清除它以释放所占用的内存空间,这当一个对象不再有用时,应当清除它以释放所占用的内存空间,这只要赋予它只要赋予它nullnull即可。即如:即可。即如:rectrect
19、=nullnull;this 代表对象本身代表对象本身 在类的方法中,如果要引用的变量名或方法名的成员变量名或成员在类的方法中,如果要引用的变量名或方法名的成员变量名或成员方法名相同,则可通过使用方法名相同,则可通过使用this 来代表对象本身,即引用对象自身。来代表对象本身,即引用对象自身。super 代表代表父类父类 当子类中有与当子类中有与父类同名的父类同名的变量或方法时,可加上变量或方法时,可加上super限定词来指明限定词来指明是是对父类的变量或方法的引用。对父类的变量或方法的引用。下面是下面是this和和super是是使用的例子。使用的例子。class class Rectangl
20、eRectangle intint width,length;width,length;Rectangle(Rectangle(intint width,width,intint length)length)/构造方法构造方法 this.width=width;this.width=width;/thisthis代表所创建的对象代表所创建的对象 this.length=length;this.length=length;public void public void drawRect drawRect()()System.out.System.out.printlnprintln(this i
21、s Rectangle!);(this is Rectangle!);例例5-45-4 用用thisthis表示引用自身表示引用自身 上面这个例子中,用上面这个例子中,用thisthis表示引用对象本身。表示引用对象本身。在构造方法中,可以使用在构造方法中,可以使用supersuper来引用父类的构造方法。来引用父类的构造方法。例例5-55-5 用用supersuper引用引用父类的构造方法父类的构造方法 classclass fillRectanglefillRectangle extends Rectangle extends Rectanglepublicpublic fillRecta
22、ngle fillRectangle(intint w,w,intint num)num)/构造方法构造方法 super(w,num);super(w,num);/调用父类的构造方法调用父类的构造方法 private Stringprivate String makeString makeString(char(char ch ch,intint num)num)StringBuffer str StringBuffer str=new=new StringBuffer StringBuffer();();for(for(intint i=num;i0;i-)i=num;i0;i-)str s
23、tr.append(.append(chch););return return str str.toStringtoString();();在在这个类的构造方法中并没有写新的程序,而是调用了父类的构造函数,这个类的构造方法中并没有写新的程序,而是调用了父类的构造函数,用于初始化实例变量。用于初始化实例变量。public voidpublic void drawRect drawRect()()for(for(intint i=length;i0;i-)i=length;i0;i-)/用字符用字符“#”#”绘制绘制(填满填满)一个矩形一个矩形 System.out.System.out.prin
24、glnpringln(makeStringmakeString(#,width);(#,width);例例.5-6.5-6 用用 super super 指明引用父类的变量指明引用父类的变量class class A A String String str str=aaaaaaaaaa;class class B B extends A extends A String String str str=bbbbbbbbbb;void f()void f()System.out.System.out.printlnprintln(父类变量父类变量strstr:+super.+super.strst
25、r););System.out.System.out.printlnprintln(子类变量子类变量strstr:+strstr););public static void main(String public static void main(String args args)B b1=new B();B b1=new B();b1.f();b1.f();例例.5-7.5-7 对象变量、静态变量的继承。对象变量、静态变量的继承。class class A A static int a;int b;static int a;int b;classclass B B extends A exte
26、nds Apublicpublic static void main(String static void main(String args args)A.a=10;B.a=20;A.a=10;B.a=20;System.out.println(A.a=+A.a+,B.a=+B.a);System.out.println(A.a=+A.a+,B.a=+B.a);A a1=new A();A a1=new A();B B b1=new b1=new B(),b2=new B();B(),b2=new B();a1.b=3;b1.b=4;b2.b=5;a1.b=3;b1.b=4;b2.b=5;Sy
27、stem.out.println(a1.b);System.out.println(a1.b);System.out.println(b1.b);System.out.println(b1.b);System.out.println(b2.b);System.out.println(b2.b);finalfinal修饰符可以定义一个不能被继承的类,即不能再有子类。修饰符可以定义一个不能被继承的类,即不能再有子类。java.lang.Systemjava.lang.System类就是类就是finalfinal类的一个例子,它是最终的类。类的一个例子,它是最终的类。finalfinal修修饰符通常
28、是出于安全的目的而使用的,因为不能继承饰符通常是出于安全的目的而使用的,因为不能继承finalfinal类,人们就类,人们就不能重载或覆盖它的任何方法。如果允许一个类被继承,其被重载或覆不能重载或覆盖它的任何方法。如果允许一个类被继承,其被重载或覆盖的方法可能会被改写。保证某个特定的方法在类层次关系上的某层以盖的方法可能会被改写。保证某个特定的方法在类层次关系上的某层以后只有一个定义,这对于那些安全性非常关键的类是非常必要的。后只有一个定义,这对于那些安全性非常关键的类是非常必要的。无论是用于修饰变量、方法还是类,无论是用于修饰变量、方法还是类,finalfinal关键字的目的都是一样的:关键
29、字的目的都是一样的:增强代码的安全性。增强代码的安全性。例例4.8 final4.8 final类说明类说明final class final class EndClassEndClass extends extends SupperClass SupperClass 5.3.5 final类类(最终类最终类)n5.4.1 包说明包说明 n5.4.2 包的层次结构包的层次结构 n5.4.3 包的使用包的使用 5.45.4 包包 包是为了解决设计较大规模的程序而引入的概念。一个大的系统,包是为了解决设计较大规模的程序而引入的概念。一个大的系统,往往包含多种对象,需要多个类来描述。这些类以逻辑方式
30、组合在一往往包含多种对象,需要多个类来描述。这些类以逻辑方式组合在一起,形成了所谓的包。起,形成了所谓的包。使用包可提供控制访问的范围。类、方法缺省访问权限时,就只可使用包可提供控制访问的范围。类、方法缺省访问权限时,就只可在它所属的包中被访问,说明为在它所属的包中被访问,说明为publicpublic的才可在其他包中被访问。的才可在其他包中被访问。一个一个JavaJava程序可以由多个包组成。程序可以由多个包组成。一个包可由一个或多个源程序一个包可由一个或多个源程序文件文件(.(.javajava文件文件)构成,有多个源程序文件时要分别建立。构成,有多个源程序文件时要分别建立。注意:每个注意
31、:每个源程序文件中最多只能有一个说明为源程序文件中最多只能有一个说明为publicpublic的类的类。包说明语句总是源程序文件中的第一个语句包说明语句总是源程序文件中的第一个语句(可省略),其格式如下:,其格式如下:package package 包名;包名;例例.5-8.5-8 包说明包说明上面的程序定义了一个包含上面的程序定义了一个包含3 3个类的包。个类的包。5.4.1 包说明包说明packagepackage SamplePackageSamplePackage;public class Class1 public class Class1 class Class2 class Cl
32、ass2 class Class3 class Class3 包中多个类之间包中多个类之间不可嵌套定义不可嵌套定义,但但前后位置无关前后位置无关。在在JavaJava中中,包采用如下的层次结构:包采用如下的层次结构:子包子包 类文件和接口文件类文件和接口文件(一个类或一个接口编译后都产生一个相应的字节码文件)(一个类或一个接口编译后都产生一个相应的字节码文件)由于包的层次结构类似文件夹的层次结构,所以,为了实现上的简单,由于包的层次结构类似文件夹的层次结构,所以,为了实现上的简单,JavaJava对包的存储作了一定的规定。系统中所有的对包的存储作了一定的规定。系统中所有的JavaJava包、类
33、的源文件、字包、类的源文件、字节码文件都必须存放在单一文件夹下或它的子文件夹中。在实际的节码文件都必须存放在单一文件夹下或它的子文件夹中。在实际的JavaJava开发开发环境中,通常提供了一个名为环境中,通常提供了一个名为CLASSPATHCLASSPATH的环境变量,这个环境变量中包的环境变量,这个环境变量中包含了一系列的路径名,它们就是存储含了一系列的路径名,它们就是存储JavaJava类、接口和包的路径。系统将按照类、接口和包的路径。系统将按照环境变量环境变量CLASSPATHCLASSPATH中路径出现的先后顺序逐个搜索,来寻找某个类、接中路径出现的先后顺序逐个搜索,来寻找某个类、接口
34、或包。以下是一个口或包。以下是一个Windows Windows 环境变量的例子:环境变量的例子:CLASSPATH=C:JDKlib;C:JDKCLASSPATH=C:JDKlib;C:JDKsrcsrc;5.4.2 包的层次结构包的层次结构1.1.用户自己定义的包的使用用户自己定义的包的使用例例5-95-9 包的使用包的使用5.4.3 包的使用包的使用/文件文件:packonepackone ClassBeUsedClassBeUsed.java.javapackagepackage packonepackone;/定义包定义包packonepackonepublic class publ
35、ic class ClassBeUsedClassBeUsed private private int int counts;counts;ClassBeUsed ClassBeUsed()()/无参构造方法无参构造方法 setcountssetcounts(0);(0);ClassBeUsedClassBeUsed(intint i)i)/有参构造方法有参构造方法 setcountssetcounts(i);(i);protected void protected void setcounts setcounts(intint i)i)counts=i;counts=i;public pub
36、lic int getcounts int getcounts()()return counts;return counts;上面的程序中创建了两个包上面的程序中创建了两个包packone和和packtwo。在在packone 包包中定中定义了一个义了一个 public类类 classBeUsed,在,在packtwo包中定义了一个包中定义了一个 public类类 UsingClass。/文件:文件:packtwopacktwo UsingClassUsingClass.java.javapackagepackage packtwopacktwo;/定义包定义包packtwopacktwopu
37、blic classpublic class UsingClass UsingClass public static void main(String public static void main(Stringargsargs)ClassBeUsed cbClassBeUsed cb=new=new ClassBeUsed ClassBeUsed(2);(2);/创建包创建包 packonepackone的的ClassBeUsedClassBeUsed类的实例类的实例cb cb System.out.System.out.printlnprintln(cbcb.getcountsgetcou
38、nts();();packtwo的的UsingClass类的类的main方法中的语句:方法中的语句:ClassBeUsed cb=new ClassBeUsed(2);是要创建包是要创建包packone的的ClassBeUsed类的实例类的实例cb。编译里例编译里例5-95-9中的程序,则会产生如下的错误:中的程序,则会产生如下的错误:Undefined name Undefined name ClassBeUsedClassBeUsed Cannot find definition for class Cannot find definition for class ClassBeUsedC
39、lassBeUsed原因何在原因何在?仔细地观察程序:仔细地观察程序:packagepackage packonepackone;public classpublic class ClassBeUsed ClassBeUsed private private int int counts;counts;ClassBeUsed ClassBeUsed()()/无参构造方法无参构造方法 setcountssetcounts(0);(0);ClassBeUsedClassBeUsed(intint i)i)/有参构造方法有参构造方法 packagepackage packtwopacktwo;pub
40、lic classpublic class UsingClass UsingClass public static void main(String public static void main(Stringargsargs)ClassBeUsed cb ClassBeUsed cb=new=new ClassBeUsed ClassBeUsed(2);(2);System.out.System.out.printlnprintln(cbcb.getcountsgetcounts();();/文件:文件:packonepackone ClassBeUsedClassBeUsed.java.j
41、avapackagepackage packonepackone;public classpublic class ClassBeUsed ClassBeUsed private private int int counts;counts;public public ClassBeUsed ClassBeUsed()/()/构造方法声明为构造方法声明为publicpublic setcounts setcounts(0);(0);public public ClassBeUsed ClassBeUsed(intint i)/i)/构造方法声明为构造方法声明为publicpublic setco
42、unts setcounts(i);(i);现在对例现在对例5-95-9程序做一些修改,改正后的程序如下:程序做一些修改,改正后的程序如下:/文件文件:packtwopacktwo UsingClassUsingClass.java.javapackagepackage packtwopacktwo;importimport packone packone.ClassBeUsedClassBeUsed;/引入包引入包packtwopacktwo的类的类ClassBeUsedClassBeUsedpublic classpublic class UsingClass UsingClass pub
43、lic static void main(String public static void main(String args args)ClassBeUsed cbClassBeUsed cb=new=new ClassBeUsed ClassBeUsed(2);(2);System.out.System.out.printlnprintln(cbcb.getcountsgetcounts();();/文件文件:packtwopacktwo UsingClassUsingClass.Java.Javapackagepackage packtwopacktwo;public classpubl
44、ic class UsingClass UsingClass public static void main(String public static void main(String args args)packonepackone.ClassBeUsed cbClassBeUsed cb=new=new packone packone.ClassBeUsedClassBeUsed(2);(2);System.out.System.out.printlnprintln(cbcb.getcountsgetcounts();();也可如下修改:也可如下修改:2.2.系统包的使用系统包的使用 Ja
45、vaJava系统中建立了很多非常有用的包,供用户使用。系统中建立了很多非常有用的包,供用户使用。这些包以这些包以“java.”java.”开头,作为开头,作为java java 的一个标准部分发布的。的一个标准部分发布的。其使用方法与用户其使用方法与用户自定义的包一样,只需要在程序开始处自定义的包一样,只需要在程序开始处(包定义语句后包定义语句后)加上加上import import 语语句引入所需包中的类即可。其格式如下:句引入所需包中的类即可。其格式如下:importimport 包名包名.类名;类名;或:或:import import 包名包名.*.*;学习学习JavaJava,必须学习必
46、须学习Java Java 常用包中的类。从第六章开始,将叫详常用包中的类。从第六章开始,将叫详细地介绍细地介绍JavaJava常用包的使用。常用包的使用。引入某包的一个类引入某包的一个类引入某包的所有类引入某包的所有类 一个一个JavaJava程序可以由多个包组成。程序可以由多个包组成。如果想使一个类能被其它包引用如果想使一个类能被其它包引用,那么该类必须是由那么该类必须是由publicpublic修饰的类(公共类),其构造方法也必须声明为修饰的类(公共类),其构造方法也必须声明为publicpublic。要创建一个非本包的公共类的实例时,可以使用两种方法要创建一个非本包的公共类的实例时,可以
47、使用两种方法:(1 1)在类名前带上包名加以限定)在类名前带上包名加以限定 (2 2)在程序头部)在程序头部(包定义语句后包定义语句后)使用使用import import 语句引入所需语句引入所需包中的类。包中的类。包小结包小结5.5 5.5 接口接口5.5.1 接口的概念接口的概念 5.5.2 接口的说明接口的说明 5.5.3 接口的使用接口的使用 类体的结构:一个类的类体由一些成员变量和一些成员方法组成。类体的结构:一个类的类体由一些成员变量和一些成员方法组成。如果一个类的类体中如果一个类的类体中仅含有仅含有finalfinal修饰的成员变量修饰的成员变量(即常量即常量)和一些抽象的和一些
48、抽象的成员方法成员方法(方法框架,即方法体只是个分号方法框架,即方法体只是个分号),则这样的类就改叫做接口,则这样的类就改叫做接口(interface)interface),而不再叫做类而不再叫做类,即接口就是一些常量和抽象方法的定义的集合即接口就是一些常量和抽象方法的定义的集合,它是一个设计框架。它是一个设计框架。接口中的方法只是一个定义框架而没有具体的实现代码接口中的方法只是一个定义框架而没有具体的实现代码,所以接口是不所以接口是不能象类一样建立实例,而只能再用类来实现接口中的方法,然后我们再引能象类一样建立实例,而只能再用类来实现接口中的方法,然后我们再引用这样的类。用这样的类。5.5.
49、1 接口的概念接口的概念 接口是面向对象的一个重要思想接口是面向对象的一个重要思想,利用接口的利用接口的“设计与实现分离设计与实现分离”的的特性,使利用接口的程序不受不同接口实现的影响,不受接口实现改变的特性,使利用接口的程序不受不同接口实现的影响,不受接口实现改变的影响。软件设计者在设计程序时,也许只想设计一个框架,如只提供一个影响。软件设计者在设计程序时,也许只想设计一个框架,如只提供一个类的抽象的接口,而不希望去具体实现它。使用接口就可以很完美地解决类的抽象的接口,而不希望去具体实现它。使用接口就可以很完美地解决这个问题。这个问题。接口可以继承接口可以继承 和类不同,一个接口可以继承多个
50、其它的接口,也就是说,和类不同,一个接口可以继承多个其它的接口,也就是说,接口是支持多继承的接口是支持多继承的。接口中的方法要用类来实现接口中的方法要用类来实现 一个类说明实现一个接口,就是承诺它将一个类说明实现一个接口,就是承诺它将实现接口中声明的所有方法。实现接口中声明的所有方法。一个类可以实现多个接口一个类可以实现多个接口 一个接口也可以被多个类实现一个接口也可以被多个类实现 接口可以多继承,即一个接口可以有多个父接口,但和类的继承不同,子接口只是从接口可以多继承,即一个接口可以有多个父接口,但和类的继承不同,子接口只是从父接口那里继承了方法的说明,而不会有方法的实现和实例变量的说明。这