05_包和接口
包和接口
包和接口是java程序的两个基本组成。一般来说java源程序可以包含以下四个内部部分的任何一个(或所有)。
- 单个接口声明(可选)
- 任意数目的引入语句(可选)
- 单个公共类声明(必须)[公共类就是和源文件名同名的类]
- 对包来说是私有的任意数目的类(可选)
包
包是类的容器,用来保存划分的类名空间
定义包
- package语句定义了一个存储类的名字空间,如果省略package语句,类名会被输入到一个默认的没有名称的包
- package声明的通用形式:
package mypkg;
这里的mypkg是包名;任何声明的mypkg中的一部分的类.class文件会被存储在一个mypkg目录中 - 可以创建包层次,只要将每个包名与它的上层包名用点号'.'分隔开就可以了,多级包的声明形式为:
package pkg1[.pkg2[.pkg3]];
访问保护
类和包都是封装和容纳名称空间和变量及方法范围的方法。包就像装载类和下级包的容器。类就像是数据和代码的容器。类是java最小的抽象单元。因为类和包的相互影响,java将类成员的可见度分为四种:
- 相同包中的子类
- 相同包中的非子类
- 不同包中的子类
- 既不在相同包又不在相同子类中的类
private、public、protected提供了多种方法来产生这些种类所需访问的多个级别,如下表:
、 | private成员 | 默认的成员 | protected成员 | public成员 |
---|---|---|---|---|
同一类中可见 | 是 | 是 | 是 | 是 |
同一个包中对子类可见 | 否 | 是 | 是 | 是 |
同一个包中对非子类可见 | 否 | 是 | 是 | 是 |
不同包中对子类可见 | 否 | 否 | 是 | 是 |
不同包中对非子类可见 | 否 | 否 | 是 | 是 |
引入包
- import声明通用形式:
import pkg1[.pkg2[.pkg3]].(classname|*);
- 所有Java包含的标准类都存储在名为java的包中
接口
使用关键字interface,可以从类的实现中抽象一个类的接口。也就是说,用interface,可以指定一个类必须做什么,而不是规定它如何去做
要实现一个接口,接口定义的类必须创建完整的一套方法。每个类都可以自由的决定他们自己实现的细节。
接口定义
下面是一个通用的接口形式:
access interface name{
return-type method-name1(parameter-list);
return-type method-name2(parameter-list);
type final-varname1=value;
type final-varname2=value;
//...
return-type method-nameN(parameter-list);
type final-varnameN=value;
}
这里的access要么是public,要么就没有用修饰符,没有用访问修饰符时,则是默认访问范围,而接口是包中定义的唯一的可以用于其他成员的东西。当它声明为public时,则接口可以被任何代码使用。
接口本质上是抽象方法,接口中指定的方法没有默认的实现,每个包含接口的类必须实现所有的方法。
接口中可以声明变量,它们一般是final和static型的,意思是它们的值不能通过 实现类 而改变。它们还必须以常量值初始化。
如果接口定义为public,所有的方法和变量都是public的
实现接口
接口一旦被定义,一个或多个类可以实现该接口。为实现一个接口,在类定义中包括implements子句,然后创建接口定义的方法,形式如下:
access class classname [extends superclass] [implements interface [,interface...]]{
//class-body
}
如果一个类实现多个接口,那么这些接口被逗号分隔
注意:当实现一个接口方法时,它必须声明称public
通过接口引用实现接口
可以把变量定义成使用接口的对象引用而不是类的类型,任何实现了所声明接口的类的实例都可以被这样一个变量引用。
interface Callback{
void callback(int param); //定义了一个接口
}
class Client implements Callback{
public void callback(int p){ //实现Callback接口的类
System.out.println("callback called with"+p);
}
}
class TestIface{
public static void main(String args[]){
Callback c=new Client(); //变量c被定义成接口类型Callback,并被一个Client实例赋值,c可以访问callback方法,但是不能访问Client类中任何其他成员
c.callback(42);
}
}
接口可以扩展
接口可以通过运用关键字extends被其他接口继承,语法与继承一样
当一个类实现一个继承了另一个接口的接口时,它必须实现接口继承链表中定义的所有方法