可以将一组相关的类或接口封装在包(package)里,从而更好地管理已经开发的Java代码。这里的包(package)也可以称作软件包

包声明语句的格式是:

package 包名;

包声明语句要求是定义类或者接口、枚举类型的Java源程序文件的第一条语句,且必须是该文件的第一条语句。

包名可以是一个标识符,也可以由若干个标识符通过句点“.”连接而成。其中包名的前几个标识符是所在单位的Internet域名的倒序,最后一个标识符是一个可以概括该软件包功能的标识符。例如:package cn.edu.tsinghua.universityOrganization;

如果需要使用在软件包中的类或者接口或者枚举等,则需要导入包的语句。导入包的语句一般是在Java源程序文件中除了包声明语句之外的最前面的若干条语句。导入包语句的格式有三种,分别为:

(1)import 包名.*;   //将整个包的类或者接口或者枚举等导入到当前的程序中

(2)import 包名.类型名;  //将指定的类型导入到当前的程序中

(3)import static 包名.类型名.静态成员方法名; //将指定的静态成员方法导入

导入包语句的使用原则是尽量使用比较后面的导入包语句形式,否则会增加程序的内存开销,并在一定程度上降低程序的编译效率。导入包时,当前路径下不能包含有相应后缀为‘.java’的Java源程序文件以及编译生成的后缀为“.class”的文件。

每个软件包都有一个包名,而且在包与包之间没有嵌套关系,即任何包都不会包含其他包。例如,软件包 cn.edu.tsinghua.univers  不是软件包 cn.edu.tsinghua 的子软件包。导入包语句 import cn.edu.tsinghua.* 不能代替导入包语句 import cn.edu.tsinghua.univers.* 在导入软件包的过程中,软件包根路径由系统变量classpath确定。

在Java系统提供的软件包中,有一个软件包比较特殊,即 软件包“java.lang”。它是Java语言的基本软件包。即使不通过导入语句,Java语言也会为所有的Java程序自动导入该软件包。软件包“java.lang”提供Java程序所需要的最基本的类和接口,其中比较常用的类包括Object、Boolean、Byte、Character、Double、Float、Integer、Long、Short、Math、String、StringBuffer、Sysem等。

类Object:是在Java语言中除Object本身之外所有类的父类。

类Boolean、Byte、Character、Double、Float、Integer、Long和Short分别是Java八种基本数据类型的包装类。

类Math:提供各种数学计算方法。

类StringBuffer:用来编辑自丈夫序列。

类System:提供各种与标准输入和标准输出相关的功能,访问外部定义的属性和环境变量的功能,加载文件和库的功能,以及进行快速数组复制等功能。



封装性

类成员的访问控制模式及其允许访问范围

访问控制模式

在同一个类内

在同一个包内

子类

所有类

公共模式(public)

允许访问

允许访问

允许访问

允许访问

保护模式(protected)

允许访问

允许访问

允许访问

 

默认模式(default)

允许访问

允许访问

 

 

私有模式(private)

允许访问

允许访问

 

 

 



修饰词

三个常用修饰词:abstract(抽象)、static(静态)和final(最终)。abstract不能和其他两个修饰词组合在一起。

修饰词abstractJava允许类、接口或成员方法具有抽象属性,但不允许成员域或者构造方法具有抽象属性。无法通过抽象类的构造方法生成抽象类的实例对象。不管定义接口的修饰词是否含有关键字abstract,接口总是具有抽象属性

抽象类的应用方法:在定义抽象类型后,可以将该分类中的各个类型定义成为该抽象类型的子类型。这样,如果要生成抽象类型的实例对象,则可以通过这些子类型的构造方法来实现。如果抽象类型的子类型不是抽象类型,在要求在该子类型的定义中必须定义覆盖抽象类型的所有抽象方法。这里的覆盖指的是在多态性中的覆盖,即定义除封装性之外相同声明的成员方法。这样根据动态多态性,可以通过抽象类型的表达式访问抽象类型的成员域以及调用这些被覆盖的成员方法。

 

         抽象成员方法定义格式为:

[方法修饰词列表]  返回类型  方法名(方法的参数列表);

抽象成员方法修饰词列表中含有关键字abstract,且该方法只能定义在抽象类的类体或定义接口的接口体中。

抽象成员方法定义格式与不具抽象属性的成员方法的定义格式之间的区别:除了是否含有修饰词abstract之外,抽象成员方法的定义以分号结束,而且不含方法体;而不具有抽象属性的成员方法的定义在成员方法声明之后不能立即出现分号,而且必须含有方法体。

 

修饰词static

具有关键字 static(静态)的成员域或成员方法,成为静态成员域或静态成员方法。例如,作为Java应用程序入口的main成员方法是一个静态成员方法。类本身也可以看做一种对象,简称为类对象。类的静态成员隶属于该对象,可通过类名直接调用。格式是:

类名.静态成员域名     或   类名.静态成员方法名


修饰词final

关键字final(最终)可用来修饰不具有抽象属性的类、类的成员域、接口的成员域以及类的不具有抽象属性的成员方法。具有最终属性的类不能作为父类,不能派生出子类。如:类java.lang.System的声明是

public final class Sysem extends Object  说明java.lang.System具有最终属性,因此类java.lang.System不具有子类。



内部类(inner class)

在类体内部定义的类,内部类坐在的类称为外部类。按照内部类是否含有显示的类名,分为“实名内部类”和“匿名内部类”,实名内部类定义格式是:

[类修饰词列表] class 类名 [extends 父类名] [implements 接口名称列表]

{

         类体

}

含有关键字static的内部类,称为静态实名内部类。对于不具有静态属性的实名内部类,如果它的成员域具有静态属性,则必须同时具有最终(final)属性。不具有静态属性的实名内部类不能含有具有静态属性的成员方法。

 

匿名内部类不具有类名,不能具有抽象和静态属性,并且不能派生出子类。定义匿名内部类的定义可以采用格式:

new 父类型名(父类型的构造方法的调用参数列表)

{

         类体

}

匿名内部类不含类型,所以在匿名内部类的类体中一般不能显示地定义构造方法。匿名内部类的定义格式定义并创建了匿名内部类的实例对象,它所调用的构造方法实际是父类型的与其调用参数相匹配的构造方法,或者是由Java虚拟机自动生成的不含任何参数的构造方法。

 

 



接口

Java语言规定任何子类只能有一个直接父类,但Java语言允许一个类实现多个接口,从而实现多重继承的特性。在同一个Java源文件中可以包含多个类或接口,但不能包含两个或两个以上的具有public修饰词的类或接口。接口的定义格式是:

 

[接口修饰词列表]  interface  接口名 [extends 接口名称列表]

{

         接口体

}

 

其中:

         “[  ]”:表示其内部的内容是可选项;

         接口修饰词列表:可以包括0个或多个接口修饰词;接口修饰词包括public、abstract和strictfp等。接口一般不能具有protected和private属性。

         接口名:可以是任意的合法标识符。

         extends 接口名称列表:当前定义的接口可以继承1个或多个父接口,相邻两个接口名称之间采用逗号分隔。

 

接口体:定义接口的两类成员要素“成员域”和“成员方法”。

接口的成员域的定义格式为:

 

[域修饰词列表] 类型 带初始化的变量名列表;

 

         修饰词列表:即使不包含修饰词,接口的所有成员域都具有public、static和final属性。

接口的成员方法只能是抽象成员方法,其定义格式为:

 

[方法修饰词列表]  返回类型 方法名(方法的参数列表);

 

         修饰词列表:即使不包含修饰词,接口所有方法也具有public和abstract属性;

         返回类型:数据类型,不返回值需要写关键字void;

方法参数列表:可包含0个或多个参数,不能写关键字void;格式:类型 参数变量名

        

接口的应用方法非常类似于抽象类,知识通过接口在一定程度上可以实现多重继承。在实现接口的类中,除抽象类之外,要求在该类的类体中定义覆盖该接口的所有成员方法。若生成接口的实例对象,可通过实现接口的类的构造方法来实现。根据继承性,实现接口的类的实例对象也可以被认为是该接口的实例对象。访问接口成员的格式如下:

接口名.静态成员域名   或  表达式.成员域名

表达式.成员方法名(成员方法调用参数列表)

接口定义的程序示例:

interface J_Shape
{
         public static final double PI=3.1415926;
         public abstract double mb_getArea();  //计算并返回形状的面积
}  //接口J_Shape结束