一、接口(Interface)
在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
1、接口的声明
1.1 接口的声明语法格式如下:
[可见度] interface 接口名称 [extends 其他的接口名] {
// 声明变量
// 抽象方法
}
1.2 Interface关键字用来声明一个接口。下面是接口声明的一个简单例子。
/* 文件名 : DemoInterface.java */
import java.lang.*; //引入包
public interface DemoInterface {
//任何类型 final, static 字段
//抽象方法}
1.3 接口有以下特性:
a、接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。
b、接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键字。
c、接口中的方法都是公有的。
2、接口的实现
当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。
2.1 接口的实现语法格式如下:
...implements 接口名称[, 其他接口名称, 其他接口名称..., ...] ...
实例如下:Animal.java 文件代码:
/* 文件名 : Dog.java */
public class Dog implements Animal{
public void eat(){
System.out.println("Dog eats");}
public static void main(String args[]){
Dog d = new Dog ();
d.eat();}}
2.2 重写接口中声明的方法时,需要注意以下规则:
类在实现接口的方法时,不能抛出强制性异常,只能在接口中,或者继承接口的抽象类中抛出该强制性异常。
类在重写方法时要保持一致的方法名,并且应该保持相同或者相兼容的返回值类型。
如果实现接口的类是抽象类,那么就没必要实现该接口的方法。
2.3 在实现接口的时候,也要注意一些规则:
一个类可以同时实现多个接口。
一个类只能继承一个类,但是能实现多个接口。
一个接口能继承另一个接口,这和类之间的继承比较相似。
3、接口的继承
一个接口能继承另一个接口,和类之间的继承方式比较相似。接口的继承使用extends关键字,子接口继承父接口的方法。
// 文件名: Grandfather.java
public interface Grandfather
{public void setSaveMoney(double money);}
// 文件名: Father.java
public interface Father extends Grandfather
{public void setSaveHouse (int num);}
// 文件名: Son.java
public interface Son extends Father
{public void setSaveCulture ();}
Son接口自己声明了一个方法,从Father接口继承了两个方法,这样,实现Son接口的类需要实现三个方法。
4、接口的多继承
在Java中,类的多继承是不合法,但接口允许多继承。
public interface Son extends Father,Grandfather
5、接口特点
1.接口可以多继承
2.接口的方法声明必须是 public abstract 即便不写默认也是
3.接口里面不能包含方法具体实现,只声明
4.类继承接口必须实现接口里申明的全部方法,除非该类是抽象类
5.类里面可以声明 public static final 修饰的变量
6.接口不能被实例化,但是可以被实现类创建
6、什么时候使用抽象类和接口
1、 如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。
2、 如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。
3、如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。
4、在 JDK1.8,允许我们给接口添加两种非抽象的方法实现:
1)、默认方法,添加 default 修饰即可;
2)、静态方法,使用 static 修饰;示例如下:
interface Test{
//这个是默认方法
default String get(String aa){
System.out.println("我是jdk1.8默认实现方法...");
return "";}
//这个是静态方法
static void staticmethod(){
System.out.println("我是静态方法");}}
调用得话,静态方法只能通过接口名调用,不可以通过实现类的类名或者实现类的对象调用,default 方法只能通过接口实现类的对象来调用。
7、接口的含义理解
接口可以理解成统一的协议, 而接口中的属性也属于协议中的内容。但是接口的属性都是公共的,静态的,最终的。
接口的成员特点:
1、成员变量只能是常量,默认修饰符 public static final
2、成员方法只能是抽象方法。默认修饰符 public abstract所以,Java 接口中,使用变量的时候,变量必须被赋值。
//所以接口定义属性
public interface People {
int age=10;
String name="输出名字"; // 接口里面定义的成员变量都是 public static final 修饰
public void eat(); }
所有的变量必须给出初始值,且绝对不会被修改,因为隐藏的修饰符为 public static final。
8、Java 抽象类和接口总结
1、abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个 interface。
2、在 abstract class 中可以有自己的数据成员,也可以有非 abstarct 的成员方法,而在 interface 中,只能够有静态的不能被修改的数据成员(也就是必须是 static final 的,不过在 interface 中一般不定义数据成员),所有的成员方法都是 abstract 的。
3、abstract class 和 interface 所反映出的设计理念不同。其实 abstract class 表示的是 "is-a" 关系,interface 表示的是 "has-a" 关系。
4、实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。
5、接口中定义的变量默认是 public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
6、抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。
7、接口中的方法默认都是 public,abstract 类型的。