《类对象和接口》PPT课件.ppt
类、对象和接口类、对象和接口-李冉J2EE网络编程课件1修饰符修饰符类修饰符类修饰符类修饰符类修饰符修饰符修饰符修饰符修饰符含含含含 义义义义publicpublicabstractabstractfinalfinal可以从其他包中访问可以从其他包中访问可以从其他包中访问可以从其他包中访问本类不能被实例化本类不能被实例化本类不能被实例化本类不能被实例化不能再声明子类不能再声明子类不能再声明子类不能再声明子类变量修饰符变量修饰符变量修饰符变量修饰符修饰符修饰符修饰符修饰符含含含含 义义义义publicpublicprotectedprotectedprivateprivatestaticstaticfinalfinal可以从所有的类中访问它可以从所有的类中访问它可以从所有的类中访问它可以从所有的类中访问它只能从本类及其子类中访问它只能从本类及其子类中访问它只能从本类及其子类中访问它只能从本类及其子类中访问它只能从本类中访问它只能从本类中访问它只能从本类中访问它只能从本类中访问它类变量类变量类变量类变量必须对它赋予初值并且不能修改它(常量)必须对它赋予初值并且不能修改它(常量)必须对它赋予初值并且不能修改它(常量)必须对它赋予初值并且不能修改它(常量)局部变量修饰符局部变量修饰符局部变量修饰符局部变量修饰符修饰符修饰符修饰符修饰符含含含含 义义义义finalfinal必须对它赋予初值并且不能修改它(常量)必须对它赋予初值并且不能修改它(常量)必须对它赋予初值并且不能修改它(常量)必须对它赋予初值并且不能修改它(常量)2方法重载方法重载n n方法重载方法重载方法重载方法重载是指一个类中可以有多个方法具有相同的名是指一个类中可以有多个方法具有相同的名是指一个类中可以有多个方法具有相同的名是指一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,即或者是参数的个字,但这些方法的参数必须不同,即或者是参数的个字,但这些方法的参数必须不同,即或者是参数的个字,但这些方法的参数必须不同,即或者是参数的个数不同,或者是参数的类型不同。(类的构造方法)数不同,或者是参数的类型不同。(类的构造方法)数不同,或者是参数的类型不同。(类的构造方法)数不同,或者是参数的类型不同。(类的构造方法)n nclass Areaclass Area float getArea(float r)float getArea(float r)return 3.14f *r*r;return 3.14f *r*r;double getArea(float x,int y)double getArea(float x,int y)return x*y;return x*y;float getArea(int x,float y)float getArea(int x,float y)return x*y;return x*y;double getArea(float x,float y,float z)double getArea(float x,float y,float z)return(x*x+y*y+z*z)*2.0;return(x*x+y*y+z*z)*2.0;注:方法的返回类型和参注:方法的返回类型和参数的名字不参与比较。数的名字不参与比较。3n n每次创建一个实例都需要初始化所有变量,每次创建一个实例都需要初始化所有变量,每次创建一个实例都需要初始化所有变量,每次创建一个实例都需要初始化所有变量,JavaJava允许允许允许允许对象在创建时就初始化。而这种自动初始化是通过使对象在创建时就初始化。而这种自动初始化是通过使对象在创建时就初始化。而这种自动初始化是通过使对象在创建时就初始化。而这种自动初始化是通过使用构造方法(用构造方法(用构造方法(用构造方法(ConstructorConstructor)来实现的。)来实现的。)来实现的。)来实现的。n n构造方法的名字与包含它的类相同,在语法上类似于构造方法的名字与包含它的类相同,在语法上类似于构造方法的名字与包含它的类相同,在语法上类似于构造方法的名字与包含它的类相同,在语法上类似于一个方法。构造方法没有返回值,甚至连一个方法。构造方法没有返回值,甚至连一个方法。构造方法没有返回值,甚至连一个方法。构造方法没有返回值,甚至连voidvoid修饰符修饰符修饰符修饰符都没有。因为一个类的构造方法返回值应是该类本身。都没有。因为一个类的构造方法返回值应是该类本身。都没有。因为一个类的构造方法返回值应是该类本身。都没有。因为一个类的构造方法返回值应是该类本身。构造方法构造方法4(1 1)构造函数的方法名与类名相同;)构造函数的方法名与类名相同;(2 2)构造函数没有返回类型;)构造函数没有返回类型;(3 3)如果类中没有定义构造函数,编译器会自动创建一)如果类中没有定义构造函数,编译器会自动创建一 个缺省的、不带参数的构造函数;个缺省的、不带参数的构造函数;(4 4)构造函数的主要作用是完成对类对象的初始化工作;)构造函数的主要作用是完成对类对象的初始化工作;(5 5)构造函数不能由程序显式地直接调用;)构造函数不能由程序显式地直接调用;(6 6)在创建一个类的新对象的同时,系统会自动调用该)在创建一个类的新对象的同时,系统会自动调用该 类的构造函数为新对象初始化。类的构造函数为新对象初始化。构造方法的特殊性构造方法的特殊性5一个对象的生命周期是:一个对象的生命周期是:一个对象的生命周期是:一个对象的生命周期是:创建创建创建创建使用使用使用使用销毁。销毁。销毁。销毁。n n创建对象时执行构造方法创建对象时执行构造方法创建对象时执行构造方法创建对象时执行构造方法n n4.3.4 4.3.4 对象的销毁时使用析构方法对象的销毁时使用析构方法对象的销毁时使用析构方法对象的销毁时使用析构方法finalize()finalize()销毁一个对象销毁一个对象销毁一个对象销毁一个对象n nJavaJava的垃圾回收机制自动判断对象是否在使用,并能够自的垃圾回收机制自动判断对象是否在使用,并能够自的垃圾回收机制自动判断对象是否在使用,并能够自的垃圾回收机制自动判断对象是否在使用,并能够自动销毁不再使用的对象,收回对象所占的资源。动销毁不再使用的对象,收回对象所占的资源。动销毁不再使用的对象,收回对象所占的资源。动销毁不再使用的对象,收回对象所占的资源。对象生命周期对象生命周期6为什么要有为什么要有为什么要有为什么要有thisthisthisthis和和和和supersupersupersuper引用?引用?引用?引用?在子类继承父类的过程中,子类新增的成员变量与成在子类继承父类的过程中,子类新增的成员变量与成在子类继承父类的过程中,子类新增的成员变量与成在子类继承父类的过程中,子类新增的成员变量与成员方法的名称与父类的可能一样。或者在同一个类中员方法的名称与父类的可能一样。或者在同一个类中员方法的名称与父类的可能一样。或者在同一个类中员方法的名称与父类的可能一样。或者在同一个类中的成员方法的参数和成员变量的名字相同。的成员方法的参数和成员变量的名字相同。的成员方法的参数和成员变量的名字相同。的成员方法的参数和成员变量的名字相同。thisthis、supersuper引用和引用和引用和引用和instanceofinstanceof对象运算符对象运算符对象运算符对象运算符7 this this this this 代表当前对象本身(当前对象的引用),以代表当前对象本身(当前对象的引用),以代表当前对象本身(当前对象的引用),以代表当前对象本身(当前对象的引用),以区分于同名的局部变量和其他同名的方法。区分于同名的局部变量和其他同名的方法。区分于同名的局部变量和其他同名的方法。区分于同名的局部变量和其他同名的方法。有时方法体中定义的变量和成员变量名字相同,有时方法体中定义的变量和成员变量名字相同,有时方法体中定义的变量和成员变量名字相同,有时方法体中定义的变量和成员变量名字相同,还有时方法的入口参数和成员变量名字相同,这就需还有时方法的入口参数和成员变量名字相同,这就需还有时方法的入口参数和成员变量名字相同,这就需还有时方法的入口参数和成员变量名字相同,这就需要将三者区别清楚,可以使用要将三者区别清楚,可以使用要将三者区别清楚,可以使用要将三者区别清楚,可以使用 this this this this 专门指明当前对专门指明当前对专门指明当前对专门指明当前对象的成员变量或当前对象的方法。象的成员变量或当前对象的方法。象的成员变量或当前对象的方法。象的成员变量或当前对象的方法。Class ThreeNumber int x,y,z;ThreeNumber(int x,int y,int z)this.x=x;this.y=y;this.z=z;this关键字关键字8 在在在在 java java java java 中父类可以派生子类,子类的成员变量、子类的方法中父类可以派生子类,子类的成员变量、子类的方法中父类可以派生子类,子类的成员变量、子类的方法中父类可以派生子类,子类的成员变量、子类的方法可以和父类的成员变量、父类的方法同名。当需要调用父类的同名可以和父类的成员变量、父类的方法同名。当需要调用父类的同名可以和父类的成员变量、父类的方法同名。当需要调用父类的同名可以和父类的成员变量、父类的方法同名。当需要调用父类的同名成员变量或方法时,可以在子类中使用关键字成员变量或方法时,可以在子类中使用关键字成员变量或方法时,可以在子类中使用关键字成员变量或方法时,可以在子类中使用关键字 super super super super 作前缀,指明作前缀,指明作前缀,指明作前缀,指明父类的成员变量或方法。父类的成员变量或方法。父类的成员变量或方法。父类的成员变量或方法。super()super()super()super()表示调用父类的构造函数表示调用父类的构造函数表示调用父类的构造函数表示调用父类的构造函数 super.f()super.f()super.f()super.f()表示调用在父类中声明的方法表示调用在父类中声明的方法表示调用在父类中声明的方法表示调用在父类中声明的方法 f()f()f()f()。super.number super.number super.number super.number 表示调用父类中的成员变量表示调用父类中的成员变量表示调用父类中的成员变量表示调用父类中的成员变量 number number number number。程序程序supersuper关键字关键字关键字关键字9使用使用super调用父类的构造方法调用父类的构造方法n n子类不继承父类的构造方法,因此,子类如果想使用父类的构造子类不继承父类的构造方法,因此,子类如果想使用父类的构造子类不继承父类的构造方法,因此,子类如果想使用父类的构造子类不继承父类的构造方法,因此,子类如果想使用父类的构造方法,必须在子类的方法,必须在子类的方法,必须在子类的方法,必须在子类的构造方法构造方法构造方法构造方法中使用,并且必须使用关键字中使用,并且必须使用关键字中使用,并且必须使用关键字中使用,并且必须使用关键字supersuper表示,而且表示,而且表示,而且表示,而且supersuper必须是子类构造方法中的必须是子类构造方法中的必须是子类构造方法中的必须是子类构造方法中的头一条头一条头一条头一条语句。语句。语句。语句。n n需要注意的是,如果在子类的构造方法中,没有显示使用需要注意的是,如果在子类的构造方法中,没有显示使用需要注意的是,如果在子类的构造方法中,没有显示使用需要注意的是,如果在子类的构造方法中,没有显示使用supersuper关关关关键字调用父类的某个构造方法,那么默认地有键字调用父类的某个构造方法,那么默认地有键字调用父类的某个构造方法,那么默认地有键字调用父类的某个构造方法,那么默认地有 super()super();语句,即调用父类的不带参数的构造方法。如果父类没有提供不语句,即调用父类的不带参数的构造方法。如果父类没有提供不语句,即调用父类的不带参数的构造方法。如果父类没有提供不语句,即调用父类的不带参数的构造方法。如果父类没有提供不带参数的构造方法,就会出现错误。带参数的构造方法,就会出现错误。带参数的构造方法,就会出现错误。带参数的构造方法,就会出现错误。10使用使用super操作被隐藏的成员变量和方法操作被隐藏的成员变量和方法n n如果我们在子类中想使用被子类隐藏了的父类的成员变如果我们在子类中想使用被子类隐藏了的父类的成员变如果我们在子类中想使用被子类隐藏了的父类的成员变如果我们在子类中想使用被子类隐藏了的父类的成员变量或方法就可以使用关键字量或方法就可以使用关键字量或方法就可以使用关键字量或方法就可以使用关键字supersuper。比如。比如。比如。比如super.xsuper.x、super.playsuper.play()()就是被子类隐藏的父类的成员变量就是被子类隐藏的父类的成员变量就是被子类隐藏的父类的成员变量就是被子类隐藏的父类的成员变量x x和方法和方法和方法和方法play()play()。11n n对象运算符对象运算符对象运算符对象运算符instanceofinstanceof用来测试一个指定对象是指定类用来测试一个指定对象是指定类用来测试一个指定对象是指定类用来测试一个指定对象是指定类(或它的子类)的实例,若是则返回(或它的子类)的实例,若是则返回(或它的子类)的实例,若是则返回(或它的子类)的实例,若是则返回truetrue,否则返回,否则返回,否则返回,否则返回falsefalse。instanceof对象运算符对象运算符12访问权限访问权限n n使用修饰符使用修饰符使用修饰符使用修饰符privateprivate、protectedprotected和和和和publicpublic来说明访问权限。来说明访问权限。来说明访问权限。来说明访问权限。4.7.1 4.7.1 私有变量和私有方法私有变量和私有方法私有变量和私有方法私有变量和私有方法 修饰符:修饰符:修饰符:修饰符:privateprivate class Tom class Tom private float weight;/weight private float weight;/weight被修饰为私有的被修饰为私有的被修饰为私有的被修饰为私有的 private float f(float a,float b)/private float f(float a,float b)/方法方法方法方法f f是私有方法是私有方法是私有方法是私有方法 13补充补充补充补充权限修饰符允许的访问级别权限修饰符允许的访问级别权限修饰符允许的访问级别权限修饰符允许的访问级别权权权权限修限修限修限修饰饰饰饰符符符符同一同一同一同一类类类类同一包同一包同一包同一包不同包的子不同包的子不同包的子不同包的子类类类类所有所有所有所有类类类类公有的公有的公有的公有的(public)(public)保保保保护护护护的的的的(protected)(protected)默默默默认认认认的的的的 私有的私有的私有的私有的(private)(private)14类的继承类的继承n n4.8.1 4.8.1 创建子类创建子类创建子类创建子类n n4.8.2 4.8.2 子类的继承性子类的继承性子类的继承性子类的继承性n n4.8.3 4.8.3 成员变量的隐藏和方法的重写成员变量的隐藏和方法的重写成员变量的隐藏和方法的重写成员变量的隐藏和方法的重写n n4.8.4 final4.8.4 final类类类类finalfinal方法方法方法方法15继承是一种由已有类创建新类的机制。实现代码的复用继承是一种由已有类创建新类的机制。实现代码的复用继承是一种由已有类创建新类的机制。实现代码的复用继承是一种由已有类创建新类的机制。实现代码的复用和事物的抽象和事物的抽象和事物的抽象和事物的抽象图示图示图示图示 继承性继承性继承性继承性 16创建子类创建子类n n在类的声明中,通过使用关键字在类的声明中,通过使用关键字在类的声明中,通过使用关键字在类的声明中,通过使用关键字extendsextends来创建一个类的子来创建一个类的子来创建一个类的子来创建一个类的子类,格式如下:类,格式如下:类,格式如下:类,格式如下:n nclass class 子类名子类名子类名子类名 extends extends 父类名父类名父类名父类名 例如:例如:例如:例如:class Students extends People class Students extends People 17子类的继承性子类的继承性1.1.子类和父类在同一个包中的继承性子类和父类在同一个包中的继承性子类和父类在同一个包中的继承性子类和父类在同一个包中的继承性2.2.如果子类和父类在同一个包里,那么子类自然地继承如果子类和父类在同一个包里,那么子类自然地继承如果子类和父类在同一个包里,那么子类自然地继承如果子类和父类在同一个包里,那么子类自然地继承了其父类了其父类了其父类了其父类3.3.中不是中不是中不是中不是privateprivate的成员变量作为自己的成员变量,方法同样。的成员变量作为自己的成员变量,方法同样。的成员变量作为自己的成员变量,方法同样。的成员变量作为自己的成员变量,方法同样。2.2.子类和父类不在同一个包中的继承性子类和父类不在同一个包中的继承性子类和父类不在同一个包中的继承性子类和父类不在同一个包中的继承性 如果子类和父类不在同一个包中,那么子类继承了父类的如果子类和父类不在同一个包中,那么子类继承了父类的如果子类和父类不在同一个包中,那么子类继承了父类的如果子类和父类不在同一个包中,那么子类继承了父类的protectedprotected、publicpublic成员变量作为子类的成员变量,方法类成员变量作为子类的成员变量,方法类成员变量作为子类的成员变量,方法类成员变量作为子类的成员变量,方法类似于变量。子类不能继承父类的友好变量和友好方法。似于变量。子类不能继承父类的友好变量和友好方法。似于变量。子类不能继承父类的友好变量和友好方法。似于变量。子类不能继承父类的友好变量和友好方法。18成员变量的隐藏和方法的重写成员变量的隐藏和方法的重写n n当我们在子类中定义的成员变量和父类中的成员变量同名时,则父类当我们在子类中定义的成员变量和父类中的成员变量同名时,则父类当我们在子类中定义的成员变量和父类中的成员变量同名时,则父类当我们在子类中定义的成员变量和父类中的成员变量同名时,则父类中的成员变量不能被继承,此时称中的成员变量不能被继承,此时称中的成员变量不能被继承,此时称中的成员变量不能被继承,此时称子类的成员变量隐藏了父类的成员子类的成员变量隐藏了父类的成员子类的成员变量隐藏了父类的成员子类的成员变量隐藏了父类的成员变量变量变量变量。n n当子类中定义了一个方法,并且这个方法的名字、返回类型及参数个当子类中定义了一个方法,并且这个方法的名字、返回类型及参数个当子类中定义了一个方法,并且这个方法的名字、返回类型及参数个当子类中定义了一个方法,并且这个方法的名字、返回类型及参数个数和类型同父类的某个方法完全相同时,父类的这个方法将被数和类型同父类的某个方法完全相同时,父类的这个方法将被数和类型同父类的某个方法完全相同时,父类的这个方法将被数和类型同父类的某个方法完全相同时,父类的这个方法将被隐藏隐藏隐藏隐藏。也就是说,我们也就是说,我们也就是说,我们也就是说,我们重写了父类的方法重写了父类的方法重写了父类的方法重写了父类的方法或或或或置换了父类的方法置换了父类的方法置换了父类的方法置换了父类的方法。19多态性多态性多态(多态(多态(多态(polymorphismpolymorphism):在一个类中,可以定义多个同名的方法,只要保证它们的参数个在一个类中,可以定义多个同名的方法,只要保证它们的参数个在一个类中,可以定义多个同名的方法,只要保证它们的参数个在一个类中,可以定义多个同名的方法,只要保证它们的参数个数和类型不同即可,这就叫类的多态。数和类型不同即可,这就叫类的多态。数和类型不同即可,这就叫类的多态。数和类型不同即可,这就叫类的多态。好处:使得程序简洁给程序员带来方便。当程序要实现多个相近好处:使得程序简洁给程序员带来方便。当程序要实现多个相近好处:使得程序简洁给程序员带来方便。当程序要实现多个相近好处:使得程序简洁给程序员带来方便。当程序要实现多个相近的功能时,就给相应的方法起一个相同的名字,用不同的参数代表不的功能时,就给相应的方法起一个相同的名字,用不同的参数代表不的功能时,就给相应的方法起一个相同的名字,用不同的参数代表不的功能时,就给相应的方法起一个相同的名字,用不同的参数代表不同的功能。这样在使用时,不论传递什么参数,只要能被程序识别就同的功能。这样在使用时,不论传递什么参数,只要能被程序识别就同的功能。这样在使用时,不论传递什么参数,只要能被程序识别就同的功能。这样在使用时,不论传递什么参数,只要能被程序识别就可以得到确定的结果。可以得到确定的结果。可以得到确定的结果。可以得到确定的结果。实现类的多态性有两种方法:实现类的多态性有两种方法:实现类的多态性有两种方法:实现类的多态性有两种方法:重载重载重载重载和和和和覆盖覆盖覆盖覆盖20方法的覆盖方法的覆盖n n子类继承超类中所有可被子类访问的成员方法,如果子类方法与超类子类继承超类中所有可被子类访问的成员方法,如果子类方法与超类子类继承超类中所有可被子类访问的成员方法,如果子类方法与超类子类继承超类中所有可被子类访问的成员方法,如果子类方法与超类方法同名,则不能继承,此时子类的方法称作方法同名,则不能继承,此时子类的方法称作方法同名,则不能继承,此时子类的方法称作方法同名,则不能继承,此时子类的方法称作覆盖覆盖覆盖覆盖(overrideoverride)了超)了超)了超)了超类中的那个方法。类中的那个方法。类中的那个方法。类中的那个方法。n n在进行覆盖时,应注意以下在进行覆盖时,应注意以下在进行覆盖时,应注意以下在进行覆盖时,应注意以下3 3点:点:点:点:n n子类子类子类子类不能不能不能不能覆盖超类中声明为覆盖超类中声明为覆盖超类中声明为覆盖超类中声明为finalfinal或或或或staticstatic的方法。的方法。的方法。的方法。n n子类子类子类子类必须必须必须必须覆盖超类中声明为覆盖超类中声明为覆盖超类中声明为覆盖超类中声明为abstractabstract的方法,或者子类也声明为的方法,或者子类也声明为的方法,或者子类也声明为的方法,或者子类也声明为abstractabstract。n n子类覆盖超类中同名方法时,子类方法声明必须与超类被覆盖方子类覆盖超类中同名方法时,子类方法声明必须与超类被覆盖方子类覆盖超类中同名方法时,子类方法声明必须与超类被覆盖方子类覆盖超类中同名方法时,子类方法声明必须与超类被覆盖方法的声明一样。法的声明一样。法的声明一样。法的声明一样。21abstract类和类和abstract方法方法n n用关键字用关键字用关键字用关键字abstractabstract修饰类称为修饰类称为修饰类称为修饰类称为abstractabstract类(抽象类)类(抽象类)类(抽象类)类(抽象类)n n格式:格式:格式:格式:abstract class Aabstract class A 例如:例如:例如:例如:abstract class D1 abstract class D1/合法,合法,合法,合法,D1D1为抽象类为抽象类为抽象类为抽象类 class D2 extends D1 class D2 extends D1 /合法,合法,合法,合法,D2D2可以为抽象类的子类可以为抽象类的子类可以为抽象类的子类可以为抽象类的子类 D1 vd1=new D1()D1 vd1=new D1()/非法,抽象类不能实例化非法,抽象类不能实例化非法,抽象类不能实例化非法,抽象类不能实例化 D2 vd2=new D2()D2 vd2=new D2()/合法,抽象类可由其子类创建对象合法,抽象类可由其子类创建对象合法,抽象类可由其子类创建对象合法,抽象类可由其子类创建对象22abstract类和类和abstract方法(续)方法(续)n nabstractabstract方法只允许声明,不允许实现。如方法只允许声明,不允许实现。如方法只允许声明,不允许实现。如方法只允许声明,不允许实现。如 abstract void draw();abstract void draw();n n如果一个类是一个如果一个类是一个如果一个类是一个如果一个类是一个abstractabstract类的子类,它必须具体实现父类的类的子类,它必须具体实现父类的类的子类,它必须具体实现父类的类的子类,它必须具体实现父类的abstractabstract方法。方法。方法。方法。n n如果一个类中含有如果一个类中含有如果一个类中含有如果一个类中含有abstractabstract方法,那么这个类必须用方法,那么这个类必须用方法,那么这个类必须用方法,那么这个类必须用abstractabstract来修饰(来修饰(来修饰(来修饰(abstract abstract 类可以没有类可以没有类可以没有类可以没有abstract abstract 方法)。方法)。方法)。方法)。n n一个一个一个一个abstractabstract类只关心它的子类是否具有某种功能,并不关心功能的类只关心它的子类是否具有某种功能,并不关心功能的类只关心它的子类是否具有某种功能,并不关心功能的类只关心它的子类是否具有某种功能,并不关心功能的具体行为,功能的具体行为由子类负责实现。具体行为,功能的具体行为由子类负责实现。具体行为,功能的具体行为由子类负责实现。具体行为,功能的具体行为由子类负责实现。23接口接口n nJavaJava只支持单继承机制,不支持多继承,即一个类只能有一个父只支持单继承机制,不支持多继承,即一个类只能有一个父只支持单继承机制,不支持多继承,即一个类只能有一个父只支持单继承机制,不支持多继承,即一个类只能有一个父类。单继承性使得类。单继承性使得类。单继承性使得类。单继承性使得JavaJava结构简单,层次清楚,易于管理,更安全结构简单,层次清楚,易于管理,更安全结构简单,层次清楚,易于管理,更安全结构简单,层次清楚,易于管理,更安全可靠。可靠。可靠。可靠。n nJavaJava提供了接口用于实现多重继承,一个类可以实现多个接口。提供了接口用于实现多重继承,一个类可以实现多个接口。提供了接口用于实现多重继承,一个类可以实现多个接口。提供了接口用于实现多重继承,一个类可以实现多个接口。这样,既实现了多重继承的功能,同时又避免了这样,既实现了多重继承的功能,同时又避免了这样,既实现了多重继承的功能,同时又避免了这样,既实现了多重继承的功能,同时又避免了C+C+中因多重继中因多重继中因多重继中因多重继承而存在的安全隐患。承而存在的安全隐患。承而存在的安全隐患。承而存在的安全隐患。24接口的声明与使用接口的声明与使用1.1.接口声明接口声明接口声明接口声明n n接口(接口(接口(接口(interfaceinterface)从数据结构上看接口是一种特殊的类。是没有实现)从数据结构上看接口是一种特殊的类。是没有实现)从数据结构上看接口是一种特殊的类。是没有实现)从数据结构上看接口是一种特殊的类。是没有实现的方法和变量的集合。格式为:的方法和变量的集合。格式为:的方法和变量的集合。格式为:的方法和变量的集合。格式为:n n interface interface 接口名接口名接口名接口名 方法方法方法方法1 1;方法方法方法方法2 2;可以是可以是public或者省略,省或者省略,省略时接口只能被他同处一包略时接口只能被他同处一包的成员访问,当是的成员访问,当是public时,时,接口可被任何地方的类成员接口可被任何地方的类成员访问。访问。25说明说明n n例如:例如:例如:例如:interface Myinterfaceinterface Myinterface void method1();void method1();n n注意:注意:注意:注意:n n接口定义用关键字接口定义用关键字接口定义用关键字接口定义用关键字interfaceinterface,而不是,而不是,而不是,而不是classclass。n n修饰符修饰符修饰符修饰符publicpublic用来指示任意一个类都可以调用此接口,如果没有用来指示任意一个类都可以调用此接口,如果没有用来指示任意一个类都可以调用此接口,如果没有用来指示任意一个类都可以调用此接口,如果没有publicpublic修饰则该接口只能被那些与本接口在同一个包里的类访问。修饰则该接口只能被那些与本接口在同一个包里的类访问。修饰则该接口只能被那些与本接口在同一个包里的类访问。修饰则该接口只能被那些与本接口在同一个包里的类访问。n n接口中的方法都是抽象方法,即默认的都是用接口中的方法都是抽象方法,即默认的都是用接口中的方法都是抽象方法,即默认的都是用接口中的方法都是抽象方法,即默认的都是用publicpublic和和和和abstractabstract修修修修饰符修饰的,即使没有写出来这两个修饰符也是如此。饰符修饰的,即使没有写出来这两个修饰符也是如此。饰符修饰的,即使没有写出来这两个修饰符也是如此。饰符修饰的,即使没有写出来这两个修饰符也是如此。n n如果接口声明为默认,接口中的变量全部隐含为如果接口声明为默认,接口中的变量全部隐含为如果接口声明为默认,接口中的变量全部隐含为如果接口声明为默认,接口中的变量全部隐含为finalfinal和和和和staticstatic,并,并,并,并且即使接口的定义中没有说明他们为且即使接口的定义中没有说明他们为且即使接口的定义中没有说明他们为且即使接口的定义中没有说明他们为finalfinal和和和和staticstatic时也是如此,它时也是如此,它时也是如此,它时也是如此,它们不能被实现接口的类改变,且必须设置初值。们不能被实现接口的类改变,且必须设置初值。们不能被实现接口的类改变,且必须设置初值。们不能被实现接口的类改变,且必须设置初值。n n接口接口接口接口没有没有没有没有构造方法。构造方法。构造方法。构造方法。n n接口也有接口也有接口也有接口也有继承性继承性继承性继承性,可以通过,可以通过,可以通过,可以通过extendsextends关键字声明接口的父接口,而关键字声明接口的父接口,而关键字声明接口的父接口,而关键字声明接口的父接口,而且可以有一个以上的父接口。且可以有一个以上的父接口。且可以有一个以上的父接口。且可以有一个以上的父接口。26 Java Java允许多个类实现同一个接口,这些类之间可以是毫允许多个类实现同一个接口,这些类之间可以是毫允许多个类实现同一个接口,这些类之间可以是毫允许多个类实现同一个接口,这些类之间可以是毫无联系的,每个类各有自己实现方法的细节。这一点与继承无联系的,每个类各有自己实现方法的细节。这一点与继承无联系的,每个类各有自己实现方法的细节。这一点与继承无联系的,每个类各有自己实现方法的细节。这一点与继承机制不同。机制不同。机制不同。机制不同。同时一个类也能实现多个接口,这就解决了多重继承的问同时一个类也能实现多个接口,这就解决了多重继承的问同时一个类也能实现多个接口,这就解决了多重继承的问同时一个类也能实现多个接口,这就解决了多重继承的问题,如下所示:题,如下所示:题,如下所示:题,如下所示:2.接口体(续)接口体(续)273.接口的使用接口的使用n n实现接口的类声明的格式是:实现接口的类声明的格式是:实现接口的类声明的格式是:实现接口的类声明的格式是:修饰符修饰符修饰符修饰符 classclass类名类名类名类名 extendsextends超类名超类名超类名超类名 implementsimplements接口名接口名接口名接口名1 1,接口名,接口名,接口名,接口名2 2,注意:注意:注意:注意:n n类的修饰符可以是类的修饰符可以是类的修饰符可以是类的修饰符可以是publicpublic或者是默认的。或者是默认的。或者是默认的。或者是默认的。n n在类中,用在类中,用在类中,用在类中,用implementsimplements关键字调用接口,一个类可以调用多个接口,这关键字调用接口,一个类可以调用多个接口,这关键字调用接口,一个类可以调用多个接口,这关键字调用接口,一个类可以调用多个接口,这时要在时要在时要在时要在implementsimplements后用逗号隔开多个接口的名字。后用逗号隔开多个接口的名字。后用逗号隔开多个接口的名字。后用逗号隔开多个接口的名字。n n如果实现某接口的类不是如果实现某接口的类不是如果实现某接口的类不是如果实现某接口的类不是abstractabstract修饰的抽象类,则在类的定义部分必须修饰的抽象类,则在类的定义部分必须修饰的抽象类,则在类的定义部分必须修饰的抽象类,则在类的定义部分必须实现指定接口的所有抽象方法,而且方法头部分应该与接口中的定义完实现指定接口的所有抽象方法,而且方法头部分应该与接口中的定义完实现指定接口的所有抽象方法,而且方法头部分应该与接口中的定义完实现指定接口的所有抽象方法,而且方法头部分应该与接口中的定义完全一致,另外所有的方法用全一致,另外所有的方法用全一致,另外所有的方法用全一致,另外所有的方法用publicpublic修饰。修饰。修饰。修饰。n n如果实现某接口的类是如果实现某接口的类是如果实现某接口的类是如果实现某接口的类是abstractabstract修饰的抽象类,则他可以不实现该接口中修饰的抽象类,则他可以不实现该接口中修饰的抽象类,则他可以不实现该接口中修饰的抽象类,则他可以不实现该接口中的所有方法。但是对于这个抽象类的任何一个非抽象的子类而言,他们的所有方法。但是对于这个抽象类的任何一个非抽象的子类而言,他们的所有方法。但是对于这个抽象类的任何一个非抽象的子类而言,他们的所有方法。但是对于这个抽象类的任何一个非抽象的子类而言,他们父类所实现的接口中的所有抽象方法都必须有实在的方法体,不允许存父类所实现的接口中的所有抽象方法都必须有实在的方法体,不允许存父类所实现的接口中的所有抽象方法都必须有实在的方法体,不允许存父类所实现的接口中的所有抽象方法都必须有实在的方法体,不允许存在未被实现的接口方法。在未被实现的接口方法。在未被实现的接口方法。在未被实现的接口方法。n n接口的抽象方法的访问限制符都已被指定为接口的抽象方法的访问限制符都已被指定为接口的抽象方法的访问限制符都已被指定为接口的抽象方法的访问限制符都已被指定为 public public,所以类在实现这些,所以类在实现这些,所以类在实现这些,所以类在实现这些抽象方法时,必须显式的使用抽象方法时,必须显式的使用抽象方法时,必须显式的使用抽象方法时,必须显式的使用 public public 修饰符。修饰符。修饰符。修饰符。28例例例例4.2 4.2 实现接口的类。实现接口的类。实现接口的类。实现接口的类。interface Student_info interface Student_info /学生情况接口学生情况接口学生情况接口学生情况接口 int year=2002;int year=2002;int age();int age();void output();void output();public class Stu1 implements Student_info public class St