java程序设计教程第5章.ppt
《java程序设计教程第5章.ppt》由会员分享,可在线阅读,更多相关《java程序设计教程第5章.ppt(96页珍藏版)》请在三一办公上搜索。
1、,第5章 接口、内部类和包,5.1 接口5.2 内部类5.3 包5.4 Java API基础本章小结习题,5.1 接 口Java支持单重继承机制,不支持多重继承,即一个类只能有一个超类。单继承机制使得Java结构简单,层次清楚,易于管理,但在实际应用中也需要使用多重继承功能。为了实现像C+中的多继承性,Java中引入了接口概念,接口和单重继承相结合很好地实现了多重继承的功能。接口和类非常相似,接口用于定义几个类具有的但又不在这些类中定义的功能,通过在接口中设置这些方法,描述出共同的特性,然后由类本身定义如何实现。,5.1.1 接口定义接口是由常量和抽象方法组成的特殊类。接口定义由关键字inte
2、rface引导,分为接口的声明和接口体。其中,interface声明接口名,在接口体中定义常量和方法。在接口体中只进行方法的声明,不能进行方法的实现。具体定义语法如下:publicinterface接口名extends父接口名列表publicstaticfinal域类型 域名=常量值;常量域声明publicabstractnative返回值 方法名(参数列表)throw异常列表;抽象方法声明,有关接口的定义要注意以下几点:(1)interface是声明接口的关键字,可以把它看成一个特殊的类。(2)声明接口可给出访问控制符,用public修饰的是公共接口,可以被所有的类和接口使用。若接口声明为p
3、ublic,则接口中的方法和变量也全部为public。如果是默认修饰符的接口,则只能被同一个包中的其他类和接口使用。(3)接口名要求符合Java标识符的规定。,(4)接口也具有继承性,定义一个接口时,可以通过extends关键字声明该接口是某个已经存在的父接口的派生接口,它将继承父接口的所有属性和方法。一个接口还可以继承多个父接口,父接口间用逗号分隔。(5)系统默认接口中所有属性的修饰都是public static final。(6)系统默认接口中所有方法的修饰都是public abstract。,(7)在接口中对抽象方法声明时,只能给出这些抽象方法的方法名、返回值和参数列表,而不能定义方法体
4、,即这些接口仅仅是规定了一组信息交换、传输和处理的“接口”。以下是接口定义的一个示例,声明了一个接口Student_info,表示学生情况,其中有一个数据成员year,两个成员方法age和output。定义在接口中的变量全部隐含为final和static,因此成员变量year必须设置初值。接口在语句构成上与类相似,但是其中只有方法的声明,没有方法的实现。,【示例5-1】Student_info.java。public interface Student_info int year=2008;int age();void output();,5.1.2 实现接口接口是抽象类的一种,不能直接用于创
5、建对象。接口的作用在于规定了一些功能框架。接口的定义仅仅是实现某一特定功能的一组功能的对外接口和规范,具体功能的实现则由遵守该接口约束的类去完成,即由这些类来具体定义接口中各种抽象方法的方法体。因而在Java中,通常把对接口功能的“继承”称为“实现”。,一旦一个接口被定义,一个或多个类就可以实现该接口。用关键字implements声明一个类将实现一个接口。其声明格式如下:class extendsimplements,其中,可以是public,也可以省略。,有关接口的实现,应该注意以下问题:(1)一个类可以实现多个接口,用逗号分隔接口列表。(2)如果实现某接口的类不是abstract的抽象类,
6、则在类的定义部分必须实现指定接口的所有抽象方法,即为所有抽象方法定义方法体,而且方法头部分应该与接口中的定义完全一致,即有完全相同的返回值和参数列表。,(3)如果实现某接口的类是abstract的抽象类,则它可以不实现该接口所有的方法。但是对于这个抽象类的任何一个非抽象的子类而言,它们的父类所实现的接口中的所有抽象方法都必须有实在的方法体。这些方法体可以来自抽象的父类,也可以来自子类自身,但是不允许存在未被实现的接口方法。这主要体现了非抽象类中不能存在抽象方法的原则。(4)接口的抽象方法的访问限制符都已指定为public,一个类在实现一个接口时,必须实现接口中的所有方法,并且方法必须声明为pu
7、blic。,下面是一个类实现接口的示例,声明的类Student实现接口Student_info,其中Student类中有自己的三个成员变量name、sex和birth_year,实现接口方法age时使用了接口中的变量year值。,【示例5-2】Student.java。public class Student implements Student_info String name;String sex;int birth_year;public Student(String n,String s,int y)name=n;sex=s;birth_year=y;,public int age()
8、return year-birth_year;public void output()System.out.println(this.name+this.sex+this.age()+岁);public static void main(String args)Student stu=new Student(小红,女,1983);stu.output();,程序运行结果:小红 女 25岁从上例可以看出,一个类实现一个接口,必须给出接口中所有方法的实现。如果不能实现某方法,也必须写出一个空方法。此外,Java允许多个类实现同一个接口,这些类之间可以是无联系的,每个类各有自己实现方法的细节,这是与
9、继承机制的不同之处。,【示例5-3】transport.java。interface fee public void charge();class bus implements fee public void charge()System.out.println(“bus:全程1元”);,class car implements fee public void charge()System.out.println(“car:6元起价,1.70元/公里”);class transport public static void main(String args)bus 七路=new bus();c
10、ar 富康=new car();七路.charge();富康.charge();,程序运行结果:bus:全程1元car:6元起价,1.70元/公里在本例中,定义了一个接口fee,包括成员方法charge,而声明的类bus和类car都实现同一个接口fee,这样就完成了多个类实现同一个接口。,Java允许多个类实现同一个接口的同时,一个类也能实现多个接口,这样就解决了多重继承的问题。多重继承是指一个子类可以有多个直接父类,该子类可以全部或部分继承所有直接父类的数据成员及成员方法。Java中不允许类的多重继承,但允许接口的多重继承。可以把接口理解成为一种特殊的类,即由常量和抽象方法组成的特殊类。一个
11、类只能有一个父类,但是它可以同时实现若干个接口。在这种情况下,如果把接口理解成特殊的类,那么这个类利用接口实际上就获得了多个父类,即实现了多重继承,如图5-1所示。,图5-1 继承机制,下例是通过Java接口实现多重继承的示例,首先声明两个接口theShape和showShape,其中包括两个成员方法getArea和showInfor。【示例5-4】Circle.java。interface theShape double PI=3.14159;double getArea();,interface showShape void showInfor();public class Circle
12、implements theShape,showShape int r;Circle(int r)this.r=r;,public double getArea()return r*r*PI;public void showInfor()System.out.print(r=+r+t the area:+getArea();,public static void main(String args)Circle c=new Circle(10);c.showInfor();程序运行结果:r=10 the area:314.159,5.2 内 部 类在一个类中定义另外一个类,这个类就叫做内部类或内
13、置类(inner class),也称嵌套类,包含内部类的类称为外部类(outer class)。内部类与外部类存在逻辑上的所属关系,内部类的使用要依托外部类,内部类一般用来实现一些没有通用意义的逻辑功能。与一般的类相同,内部类可以具有数据成员和成员方法。通过建立内部类的对象,可以存取其数据成员和调用其成员方法。,以下是内部类定义的一个简单示例,本例中声明的Group类中包含有Student类。相对而言,Group类称为外部类,Student类称为内部类,内部类中也可以声明数据成员和成员方法。,【示例5-5】Group.java。public class Group int count;publ
14、ic class Student String name;public void output()System.out.println(this.name+zz);,与类的其他成员一样,内部类也分为static和非static,前者称为静态内部类,后者称为成员类(非静态内部类)。同时,内部类也可以在某个方法中定义,这种内部类称为局部内部类。另一种匿名内部类则是创建对象的同时定义类的实现,但是未规定类名。,5.2.1 成员类下面示例中,声明OuterOne外部类中包含有内部类InnerOne,其中外部类和内部类的其他成员处于同级位置,所以称为成员类。,【示例5-6】OuterOne.java。p
15、ublic class OuterOne private int x=3;InnerOne ino=new InnerOne();/外部类有一个属性指向创建的内部类的对象public class InnerOne/内部类private int y=5;public void innerMethod()System.out.println(y is+y);,public void innerMethod2()System.out.println(“x2 is”+x);/访问外部类变量/内部类结束public void OuterMethod()System.out.println(x is+x)
16、;ino.innerMethod();ino.innerMethod2();,public static void main(String arg)OuterOne my=new OuterOne();my.OuterMethod();程序运行结果:x is 3y is 5x2 is 3,需要注意的是,内部类是一个编译时的概念,编译成功后就会成为完全不同的两类。一个名为OuterOne的外部类和其内部定义的名为InnerOne的内部类经过编译后出现OuterOne$InnerOne.class和OuterOne.class 两类。内部类的命名除了不能与自己的外部类同名外,不必担心与其他类名的冲
17、突,因为其真实的名字上加了外部类名作为前缀。在内部类中可以访问外部类的成员。与外部类的成员一样,在内部类中可以使用访问控制符public、protected、private修饰。,在外部类中访问内部类一般通过在外部类的成员定义中创建内部类的对象,例如InnerOne ino=new InnerOne()。在内部类中使用this,this指内部类的对象,要访问外部类的当前对象须加上外部类名作前提。例如外部类OuterOne,内部类InnerOne,用OuterOne.this代表外部类的this对象。,5.2.2 静态内部类和普通的类一样,内部类也可以有静态的。定义为static的内部类称为静态
18、内部类。和非静态内部类相比,静态内部类没有了指向外部的引用。同时,非静态内部类不能声明静态成员,只有静态内部类才能声明静态成员。,静态内部类将自动转化为顶层类(top-levelclass),即它没有父类,而且不能引用外部类成员或其他内部类成员。当一个内部类不需要引用外部类成员,只需要隐藏在另一个类中时,可以将该内部类声明为静态的。以下是一个简单的例子,本例的类Test中声明的一个内部类Person是静态的、公用的,其中可以声明静态变量count。静态内部类Person中不能访问外部类成员。,【示例5-7】StaticTest.java。public class StaticTest publ
19、ic static class Person private int age;private String name;static int count=0;Person(String n,int a)name=n;age=a;count+;,public void display()System.out.println(count=+count+t+name+t+age);,public static void main(String args)StaticTest.Person person1=new StaticTest.Person(“Lily”,16);person1.display(
20、);StaticTest.Person person2=new StaticTest.Person(“Jason”,25);person2.display();StaticTest.Person person3=new StaticTest.Person(“Liming”,30);person3.display();,程序运行结果:count=1Lily16count=2Jason25count=3Liming30,5.2.3 局部内部类Java内部类也可以是局部的,它可以定义在一个方法甚至一个代码块之内。【示例5-8】Testpart.java。public class Testpart p
21、ublic static void main(String args)final int i=8;class person public String name;,public void show()System.out.println(i);System.out.println(this.name);person p=new person();p.name=“Zhangbei”;p.show();,程序运行结果:8Zhangbei上例中,在main方法中定义了类person,它是一个内部类。内部类方法show访问了main方法中定义的final类型的局部变量。其中,方法中内部类只能访问方法中
22、final类型的局部变量,而不能访问其他类型的局部变量,但可以访问外部类的所有数据成员和成员方法。,5.2.4 匿名内部类Java语言允许创建对象的同时定义类的实现,但是未规定类名,Java将其定义为匿名内部类。Java的匿名内部类同匿名数组一样,在只需要创建一个类的对象并且用不上它的名字时,或者说有的内部类只需要创建一个它的对象,以后不会用到这个类,在这种情况下一般使用匿名内部类比较合适。匿名内部类的语法规则如下:new interfacename();或new superclassname();下例中,先声明一个接口Contents。,【示例5-9】Contents.java。public
23、 interface Contents int value();下例中,方法cont()使用匿名内部类直接返回了一个实现了接口Contents的类的对象。,【示例5-10】Goods.java。public class Goods public Contents cont()return new Contents()private int i=11;public int value()return i;/在这里需要一个分号,示例5-10中,cont()方法将下面两个动作合并在一起:返回值的生成;表示这个返回值的类的定义。cont()方法创建了一个继承自Contents的匿名类的对象,通过new
24、表达式返回的引用被自动向上转型为Contents的引用。需要注意的是,匿名内部类因为没有名字,所以它没有构造方法(但是如果这个匿名内部类继承了一个只含有带参数构造方法的父类,创建它的时候就必须带上这些参数,并在实现的过程中使用super关键字调用相应的内容)。如果要初始化它的数据成员,可以采用下面几种方法:,(1)如果是一个方法的匿名内部类,通过这个方法传进需要的参数,同时这些参数必须被声明为final。(2)将匿名内部类改造成有名字的局部内部类,这样这个类就可以拥有构造方法。(3)在匿名内部类中使用初始化代码块。通过上面的讲述,可以看出,内部类是位于一个类中的代码,其访问权限和类中的方法一样
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 程序设计 教程
链接地址:https://www.31ppt.com/p-6510006.html