Java接口的引入:Java语言只支持单重继承,它的程序中的类的层次结构是树状结构,在处理复杂问题时单重继承显得力不从心。 为了使Java程序的类层次结构更加合理,更符合实际问题的需要,我们把用于完成特定功能的若干属性组织成相对独立的属性集合,这种属性的集合就是接口。

Java接口定义:定义:接口是一个有名称的方法定义和常量定义的集合,但没有方法的实现。 接口定义了一个行为协议,类层次结构中任何地方的任何类都可以实现. 接口是由常量和抽象方法组成的特殊类: 接口中的属性都是用final修饰的常量 接口中的方法都是用abstract修饰的没有方法体的抽象方法。

Java语言的接口:接口功能的真正实现是由实现接口的各个类来定义接口中各个抽象方法的具体方法体。 Java语言通过接口实现了类间的多重继承功能。

Java接口实现多重继承:单一继承指明了子类和父类的层次关系和各自   的行为。 多重继承是指一个类有多个父类,这使得类的   层次关系不清楚。 接口则把方法的定义同类的层次区分开来,通   过接口可以在运行中动态地定位所调用的方   法,同时一个类可以实现多个接口,使得接口   提供了比多重继承更简单、更灵活的功能。

接口 vs 抽象类:接口不可以实现任何方法,而抽象类可以; 类可以实现多个接口,但父类仅只有一个; 接口和继承无关,不是类层次结构的一部分。无关的类可以实现相同接口。

定义接口:

java 接口中的字段能被继承吗 java中接口写在哪一层_java 接口中的字段能被继承吗

接口定义:接口包括接口声明和接口体两部分: [public] interface 接口名 [extends 父接口名列表] {   [public][static][final] 类型 变量名 = 常量值;   [public][abstract][native] 返回值类型 方法名(参数列表)   [throws 异常列表]; }

java 接口中的字段能被继承吗 java中接口写在哪一层_Java_02

接口定义的说明:声明接口的关键字interface引导着所定义的接口名字(符合Java标识符规定); 声明接口也需要给出访问控制符; 接口具有继承性,通过关键字extends声明该新接口是某父接口的派生接口;一个接口可以有多个父接口,它们之间用逗号分隔,形成父接口列表。

接口体的说明:接口体的定义有两个部分: 对接口中属性的声明 对接口中方法的声明; 系统默认:接口中的所有属性都是public, static和final (公共,静态和最终); 系统默认:接口中的所有方法都是public和 abstract (公共和抽象); 接口中方法的方法体可用Java语言书写,也可用其它语言书写(加native修饰)。

实现接口:具体地实现接口所规定的功能, 需要某个类为接口中的所有抽象方法编写实在的方法体。 在类的声明(定义)中用implements关键字说明该类将要实现哪些接口; 如果实现某个接口的类不是abstract的抽象类,则在类的定义部分必须为所有抽象方法定义具体方法体,方法头部分应该与接口中的定义完全一致;如果实现某接口的类是abstract的抽象类,则在类的定义部分可以不具体实现接口中的所有方法; 一个类在实现某个接口的抽象方法时,必须使用完全相同的方法声明。 接口的抽象方法访问修饰符为public,所以,类在实现方法时必须使用修饰符public,否则,系统将警告;因为缩小了接口中定义的方法的访问控制范围。

java 接口中的字段能被继承吗 java中接口写在哪一层_Java_03

接口功能不能简单扩大:例如:要加个报股价的方法在接口里,此时所有实现它的类不能正常工作。

用继承来扩大接口:如果需要增加接口的功能,可以利用继承来实现:

java 接口中的字段能被继承吗 java中接口写在哪一层_抽象方法_04

 

Java语言的包

引入的原因:   容易找到和使用类 避免名称冲突 控制访问 定义:包是一个相关的类和接口的集合,它可以提供访问保护和名称空间管理。

Java平台中的类和接口是各种包的成员,这些类和接口是按照功能绑定的; 例如:基本的类在java.lang中; 再例如:用于输入和输出的类在java.io中。

包是一种松散的类的集合,通常把需要在一起工作的类(互相访问)放入一个包。 在Java语言程序设计中,通常需要定义许多类;就像利用 “文件夹”把许多文件组织在一起,使硬盘管理的文件更清晰、更有条理一样;Java利用“包”把一些需要在一起操作的类组织在一起,以便程序员更好地管理操作这些类。

无名包:

系统自动建立“无名包”,也就是默认包或缺省包 在缺省情况下,系统会为每一个(.java)源文件创建一个无名(no name)包,这个源文件中定义的所有类都隶属于这个无名包, 它们之间可以相互引用非private(私有)的域或方法; 无名包中的类不能被其它包中的类所引用或复用。

缺省包一般只用于临时程序或测试程序. 建议在实际系统开发中,为每个类指定有名的包。 Java使用文件系统来存储包,包的名称必须和程序文件所在目录名完全一样(大小写敏感)。 如果定义了一个多级结构的包,其结构也必须和文件系统的目录结构完全一致。

有名包:

创建有名包的语句格式为          package  <包名>; 语句功能:该语句将创建一个具有指定名字的包,该包将把当前.java文件中的所有类集合到这个包内。 创建有名包,应该先创建一个子文件夹(同包名)以便存放当前.java文件和对应的.class文件。

例如:package  cardclasses;   该语句是将当前类置于包cardclassess中,需要在当前文件夹下创建一个名为cardclasses的子文件夹。 再例如:package  cardsystem.cardclasses;    该语句将当前类置于cardsystem.cardclasses中,需要在当前文件夹下创建子文件cardsystem并在 cardsystem下再创建的子文件cardclasses,当前类存放在这个文件夹里。

使用包成员:

只有公共的包成员可以从定义它们的包外访问,要从包外访问公共的包成员,必须采用以下的方法: 用成员的限定名引用; 导入包成员; 导入成员所属的整个包

使用包名作为类名前缀 :    java.util.Vector vc = new            java.util.Vector() 加载需要使用的类      import java.util.Vector;              ……       Vector vc = new Vector();

java 接口中的字段能被继承吗 java中接口写在哪一层_抽象方法_05

在使用import语句的时候,可以使用通配符一次导入一个包中的所有类,如:         import java.util.*; 这样,我们在使用java.util包中的任何类时,就可以直接使用简单类名。需要注意的是,import语句要么导入一个类,要么导入一个完整包。不能使用通配符标记包的子集或多个包,下面三条语句均无法通过编译:         import java.applet.A*;         import java.*.*;         import java.*.io;

为了简化代码,Java语言规定在以下情况时无需使用import语句导入包: 使用缺省包中的类 使用java.lang包中的类 使用和当前类在同一个包中的其他类

管理源代码文件:将类或者接口的源代码放在一个文本文件中,文件名为类或者接口的简单名; 将源代码文件放在一个目录中,目录名反映的是类或者接口所属的包的名称。 例如:

java 接口中的字段能被继承吗 java中接口写在哪一层_java_06

包成员的限定名称与文件的路径是对应的,它们的对应关系为:

java 接口中的字段能被继承吗 java中接口写在哪一层_java_07

管理类文件:与源代码文件一样,字节码文件也可以通过包来进行管理; 字节码文件不必和源代码文件位与相同的目录中,可以单独管理;这样做的目的可以隐藏源代码文件。

java 接口中的字段能被继承吗 java中接口写在哪一层_Java_08

类路径:定义:类路径是一个目录或zip文件的有序列表,用于搜索类文件。 类路径中列出的每个目录都是包含包目录的顶层目录,编译器和解释器可以根据类的包名称和类名从顶层目录开始构造路径的其余部分。 例如:上图所示的目录结构的类路径项目包含classes,但是不包含com或者com以下的任何目录,编译器和解释器用.class文件的完整包名构造它的路径名。