280 likes | 503 Views
第 7 章 包和接口. 软 件 学 院 朱士明副教授. 本章主要内容. 包 接口 抽象类 Java 常用类 应用举例. 7.1 包( package). 一组相关的类和接口集合称为包。包体现了 Java 语言面向对象特性中的封装机制,包将 java 语言的类和接口有机地组织成层次结构,这个层次结构与具体的文件系统的目录树结构层次一致。因此, Java 包就是具有一定相关性在文件系统中可准确定位的 Java 文件的集合。. 7.1.1 创建包 包由包语句 package 创建,其语法格式如下:
E N D
第7章 包和接口 软 件 学 院 朱士明副教授
本章主要内容 • 包 • 接口 • 抽象类 • Java常用类 • 应用举例
7.1 包(package) • 一组相关的类和接口集合称为包。包体现了Java语言面向对象特性中的封装机制,包将java语言的类和接口有机地组织成层次结构,这个层次结构与具体的文件系统的目录树结构层次一致。因此,Java包就是具有一定相关性在文件系统中可准确定位的Java文件的集合。
7.1.1 创建包 • 包由包语句package创建,其语法格式如下: • package [包名1[.包名2[.[...]]]] • 关键字package后是不同层次的包名,在包名1下允许有次一级的子包-包名2,包名2下可以有更次一级的子包-包名3等等。各级包名之间用“.”号分隔。通常情况下,包名称的元素被整个地小写。 • 在Java程序中,package语句必须是程序的第一条非空格、非注释语句。通过package语句,可将Java程序分层次地存放在不同的目录下,目录名称与包的名称相同。 • 【例7.1】P133
7.1.2 使用包 • 将类组织为包的目的是为了更好地利用包中的类。一般情况下,一个类只能引用与它在同一个包中的类。 • 在Java程序中,若要用到某些包中的类或接口,一种方法是在程序的开始部分写出相应的引入(import)语句,指出要引入哪些包的哪些类。另一种方法不用引入语句,直接在要引入的类和接口前给出其所在包名。无论采用哪种方法,使用系统类的前提是这个系统类应该是用户程序可见的类。
1.使用import语句 • import语句用于灵活地实现在编译单元中使用外部类和接口的引入机制,引入语句不必考虑类和接口的引入顺序和是否被多次引入。 • import语句的格式如下: • import 包名; • import 包名.标识符; • import 包名.*; • 2.直接使用包 • 这种方法一般用在程序中引用类和接口次数较少的时候,在要引入的类和接口前直接给出其所在包名。 • 例如:java.applet.Applet ap = new java.applet.Applet();
例7.2、例7.3 P134 • 3.常用系统包 • (1)java.lang • (2)java.io • (3)java.awt • (4)java.swing • (5)java.util • (6)java.net • (7)java.Applet • (8)java.sql • (9)java.rmi • (10)java.security
类成员的访问权限 • Java将类的成员可见性(可访问性)划分为五种情况,按照可见性的范围大小从小到大列出如下: • (1)仅在本类内可见。 • (2)在本类及其子类可见。 • (3)在同一包内可见。 • (4)在同一包内及其子类(不同包)可见。 • (5)在所有包内可见。 • 声明为private的类成员仅能在本类内被访问;声明为protected的类成员可以在本类、本包、本类的子类被访问;声明为private protected的类成员可以在本类、本类的子类被访问;声明为public的类成员可以在所有包内被访问;未用修饰符声明的类成员,则隐含为在本包内可被访问。 • 例7.4 P135-136
7.2 接口(interface) • 7.2.1 接口的概述 • 接口是若干完成某一特定功能的没有方法体的方法(抽象方法)和常量的集合。接口仅提供了方法协议的封装。为了获取接口功能和真正实现接口功能需要使用类来继承该接口。在继承接口的类中,通过定义接口中抽象方法的方法体(即抽象方法的覆盖)来实现接口功能。 • Java语言使用接口来实现类间多重继承的功能,从而弥补了Java语言只支持类间单重继承,描述复杂实际问题处理不方便的不足。
7.2.2 接口的定义和实现 • 1.接口的定义 • 在Java语言中,用关键字interface来定义接口。接口有类似类的结构,其定义格式如下: • [修饰符] interface 接口名 • [extends 父接口名表]{ • // 接口体 • } • 接口定义包括定义接口名和接口体。接口名是一合法的标识符。接口体同抽象类相似,为变量和抽象方法的集合,但没有构造方法和静态初始化代码。接口体中定义的变量均为终极(final)的、静态(static)的和公共(public)的。接口体中定义的方法均为抽象的和公共的。由于接口所有成员均具有这些特性,相关的修饰符可以省略。
2.接口的实现 • 在某个继承接口的派生类中为接口中的抽象方法书写语句并定义实在的方法体称为实现这个接口。派生类实现哪个或哪些接口用implements说明,不能用extends说明。 • 派生类在实现接口时,还要注意:若实现接口的类不是抽象类,则在该类的定义部分必须实现指定接口的所有抽象方法。方法体可以由java语言书写,也可以由其他语言书写。因为是覆盖方式,所以方法头部分应该与接口中的定义完全一致,即有完全相同的参数表和返回值。
【例5.17】接口的实现。 • interface Irect{ • double w=3,l=4; • void compute(); • } • class Crect implements Irect{ • public void compute(){ • System.out.println( • "边长分别为3和4的长方形面积为:"+w*l); • } • } • public class InterfaceDemo{ • public static void main(String args[]){ • Crect r = new Crect(); • r.compute(); • } • }
程序运行结果如下: • 边长分别为3和4的长方形面积为:12.0 • 7.2.3 接口的继承和组合 • 接口也可以通过关键字extends继承其他接口。子接口将继承父接口中所有的常量和抽象方法。此时,子接口的非抽象派生类不仅需实现子接口的抽象方法,而且需实现继承来的抽象方法。不允许存在未被实现的接口方法。 • 【例】接口的继承。 • interface A{ • String a = "在接口A中"; • void showA(); • }
interface B extends A{ • String b = "在接口B中"; • void showB(); • } • interface C extends B{ • String c = "在接口C中"; • void showC(); • } • class InterfaceABC implements C{ • public void showA(){ • System.out.println(a); • } • public void showB(){ • System.out.println(b); • }
public void showC(){ • System.out.println(c); • } • } • public class UseInterface2{ • public static void main(String args[]){ • InterfaceABC i = new InterfaceABC(); • i.showA();i.showB();i.showC(); • } • } • 程序运行结果如下: • 在接口A中 • 在接口B中 • 在接口C中
7.2.4 接口的多态 • 接口的使用使得方法的描述说明和方法功能的实现分开考虑,这有助于降低程序的复杂性,使程序设计灵活,便于扩充修改。这也是Java面向对象程序设计方法中多态特性的体现。 • 【例】定义接口并实现接口,说明接口的多态。 • interface OneToN{ • int disp(int n); • } • class Sum implements OneToN{ • public int disp(int n){ • int s = 0,i; • for(i = 1;i <= n;i ++)s += i; • return s; • } • }
class Pro implements OneToN{ // 继承接口 • public int disp(int n){ // 实现接口中的disp方法 • int m = 1,i; • for(i = 1;i <= n;i ++)m *= i; • return m; • } • } • public class UseInterface{ • public static void main(String args[]){ • int n = 10; • Sum s = new Sum(); • Pro p = new Pro(); • System.out.println("1至n的和 = " + s.disp(n)); • System.out.println("1至n的积 = " + p.disp(n)); • } • }
程序的运行结果如下: • 1至n的和 = 55 • 1至n的积 = 3628800 • 7.2.5 接口类型的使用 • 接口可以作为一种引用类型来使用。任何实现接口的类的实例都可以存储在该接口类型的变量中。通过这些变量可以访问类所实现的接口中的方法。Java运行时系统动态地确定应该使用哪个类中的方法。
【例】接口类型的使用。 • public class UseInterface1{ • public static void main(String args[]){ • int n = 10; • OneToN otn; • Sum s = new Sum(); • otn = s; • System.out.println("1至n的和 = " + otn.disp(n)); • Pro p = new Pro(); • otn = p; • System.out.println("1至n的积 = " + otn.disp(n)); • } • }
7.2.6 Collection接口 • 1.含义 • 2.常用方法 P139
7.3 抽象类和抽象方法 • abstract修饰的抽象类需要子类继承,在派生类中实现抽象类中的抽象方法。抽象类被派生、抽象方法被子类实现后,才有实际意义。抽象方法是只有返回值类型、方法名、方法参数而不定义方法体的一种方法。抽象方法的方法体在子类中才编写实现。注意不能用abstract修饰构造方法、静态方法和私有(private)方法,也不能覆盖父类中的抽象方法。 • 抽象方法必须定义在抽象类中。抽象类是一种未实现的类,抽象类不能用new实例化一个对象。 • 【例】计算底面半径为2高为3的圆柱体体积和长、宽、高分别为3、2、4的长方形体积。 • abstract class Shape { // 定义抽象类Shape • double radius,length,width,height; • abstract double vol(); // 抽象方法vol
Shape(double r,double h){ // 定义构造方法 • radius = r; • height = h; • } • Shape(double l,double w,double h){ • length = l; • width = w; • height = h; • } • } • class Circle extends Shape{ • Circle(double r,double h){ • super(r,h); • }
double vol() { //在抽象类的子类中实现抽象方法 • return(3.1416 * radius * radius * height); • } • } • class Rectangle extends Shape { • Rectangle(double l,double w,double h){ • super(l,w,h); • } • double vol() { • return(length * width * height); • }
class AbstractClassDemo { • public static void main(String args[]) { • Circle c = new Circle(2,3); • Rectangle r = new Rectangle(3,2,4); • System.out.println("圆柱体体积 = "+ c.vol()); • System.out.println("长方体体积 = "+ r.vol()); • } • } • 程序的运行结果如下: • 圆柱体体积 = 37.6992 • 长方体体积 = 24.0
7.4 Java常用类 • 7.4.1 File类 • 7.4.2 String类 • 7.4.3 StringBuffer类 • 7.4.4 System类 • 7.4.5 Math类 • 7.4.6 Random类 • 7.4.7 Vector类