Download presentation
Presentation is loading. Please wait.
Published byΠλούτων Πατρίκιος Βασιλειάδης Modified 6年之前
1
中国矿大计算机学院杨东平 jsxhbc@163.com
第5章 接口和包 中国矿大计算机学院杨东平
2
第5章 接口和包 本章主要讲述如下内容 : 接口的定义和使用; 接口与抽象类的异同点; 包的定义和使用;
3
接口概述 引入接口的原因 在程序设计中经常遇到这样一个问题:有些类互不相关,但却具有相似的方法。并且这些方法在各个类中的实现互不相同。我们不能为这些类定义一个共同的父类,但又希望在程序中体现出它们共同的接口。
4
接口的定义和应用 接口是一系列常量和空方法的集合,它提供了多个类共同的方法,但不限制每个类如何实现这些方法。
5
接口的定义和应用 (续) Java接口允许多继承其他接口,声明一个接口的语法格式:
[public] interface interfaceName [extends super-interface-List]{ type constantName=value; type methodName( parameter lists); …… } 接口中变量的默认修饰符为:public final static 接口中方法的默认修饰符为:public abstract 接口中不能声明任何实例变量和构造方法。
6
接口的定义和应用 (续) Java允许一个类同时实现多个接口,相当于实现多继承的功能;
7
接口的定义和应用(续) 声明一个接口的语法格式:
[public] interface interfaceName [extends super-interface-List]{ type ConstantName=value; type MethodName( Parameter lists); }
8
接口的定义和应用(续) 如果一个类实现多个接口,应该在接口名之间用逗号隔开。
当一个类实现接口时,必须实现接口中给出的空方法,若实现接口的类是一个抽象类,可以把实现接口的任务交给子类去实现。 例5-1:接口的定义与实现 源程序 运行
9
接口的定义和应用(续) 接口中定义的变量实际上是常量,必须给出它们的初始值,实现接口的类可以自由引用这些常量。
例5-2: 接口的定义与实现 源程序 运行
10
接口的定义和应用(续) 在类中实现接口中方法时,方法的特征必须和接口中声明的方法特征保持一致; 实现方法时必须在方法前加上public;
若一个类没有对接口中的方法具体实现,那么必须将该类声明为abstract类。 例:
11
接口的定义和应用(续) interface inter { // 接口 void methodA( ); } abstract class Derived1 implements inter { // 此处不需要写出methodA( )的原型 } class Derived2 extends Derived1{ public void methodA( ) { // 实现方法 System.out.println("Hi,methodA");
12
接口和抽象类的异同点 接口和抽象类的相同点: 都有空的方法,都必须在子类中实现这些方法; 都不能用new关键字来创建这两种类型的对象;
都可以具有继承关系; 接口和类一样可以具有public属性;
13
接口和抽象类的异同点(续) 接口和抽象类的不同点: 在抽象类中,空的方法必须加abstract关键字,而在接口中不需要;
在抽象类中,除空的方法外,可以定义实例变量和非空的方法,而在接口中,只能定义常量和空的方法; 接口允许多继承,类仅支持单继承;
14
包 包的功能:包用于防止名字空间的冲突。 包的含义:包是一组类和接口的集合,同一个包内的类不能重名,但不同包内的类可以重名。包实际上提供了一种命名机制和可见性限制机制。每个类名和接口名都包含在某个包中。 名字空间的全限定访问:全限定名的组成方式为: packageName.className.variableName packageName.className.methodName(parameter-lists) 包名由分离的字段组成,段与段之间用“.”隔开。
15
包(续) 在Java中可以将自己写的类,按一定的方法归属于不同的子目录中(包);
Java中的包与C++中的名字空间相似;
16
package语句 package语句告诉编译器当前类属于哪个包。如果没有package语句,类就存放在无名的缺省包中(即当前目录中);
格式: package pkgl[ .pkg2[ .pkg3]];
17
import语句 有三种方法使用包中的成员:用全限定名、引入包和引入类; 用全限定名:
如: graphics.Rectangle myRect=new graphics.Rectangle(); 用import语句装入包中的某个类或接口,格式: import pgk1.[pkg1…].className|interfaceName; 如: import graphics.Circle; … Circle myRect=new Circle();
18
import语句(续) 引入包中的所有成员,格式: import pkg1.[pkg2…].*; 如: import graphics.*
…… Circle myRect=new Circle(); Rectangle myRectangle=new Rectangle(); *只代表这个包中的类和接口,不包括该包的子包; 采用*号不影响程序的运行性能,但会影响编译速度。指明具体类比引入整个包更为合理。 Java总是隐含地引入java.lang包
19
包应用举例 例1: package Base; // 将该类存放在d:\myjava\Base包中 public class Base {
int friend_data=1; // 友元成员 public int public_data=2; // public成员 private int private_data=3; // private成员 protected int protected_data=4; // protected成员 }
20
包应用举例 (续) 例2 package Derived; // 将Base类存放在Derived包中
import Base.*; // 需要使用Base包中的类 public class Derived extends Base{ Base a=new Base( ); // 为了让testData类能调用该方法,修改为public public void dataUse( ) { // System.out.println(a.friend_data); // 不能访问 System.out.println(a.public_data ); // System.out.println(a.private_data); // 不能访问 // System.out.println(a.protected_data); // 不能访问 }
21
包应用举例 (续) 例3: // testData.java文件的内容如下:
import Derived.*; //需要使用Derived包中的类 // 该类位于工作目录,不需要package语句 public class testData { public static void main(String args[ ]) { Derived d=new Derived( ); d.dataUse( ); }
Similar presentations