Java接口(interface)
一、什么是接口?
1、生活中的接口
USB接口
USB接口可以连接U盘, 移动硬盘, 鼠标, 键盘, 手机,…
U盘, 移动硬盘, 鼠标, 键盘, 手机等之所以能连接USB, 是因为这些硬件在制造的时候已经遵循了USB的连接标准.
2、Java中的接口
Java中的接口与生活中的接口一样, 也是用于定义标准.
既然是定义标准, 也就意味着接口中只规定有哪些方法, 但是并不提供这些方法的具体实现. 谁用这套标准谁来实现.
3、其他编程语言中的接口
除了Java有接口的概念以外, 很多编程语言都有接口的概念.
Java中用interface来表示接口
C#、C++、PHP等语言中也是使用interface来表示接口
Objective-C中使用protocol来表示接口.
二、Java中如何定义接口
既然接口是一套标准,如何制定这套标准呢?
1、使用interface定义接口
在java中使用interface关键之定义接口,具体语法格式如下:
public interface 接口名{
方法的声明
}
接口的示例如下:
public interface Driver{
public void drive(Car car);//开车
}
上面定义了一个接口叫Driver(即:司机), 接口里规定了司机必须会开车, 也就是说谁想要成为司机, 谁必须要会开车.
2、如何使用接口—(implements)
接口是一套标准, 内部只声明方法, 不提供实现. 谁要使用接口谁负责实现接口.实现接口使用implements关键字.
实现接口的语法格式如下:
public class Programmer implements Driver{
...
public void drive(Car car){
System.out.println("程序员在小心翼翼的开车回家");
}
}
上面的代码是Programmer类(即:程序员类)实现了Driver接口, 所谓的实现接口, 指的是实现接口中定义的全部方法.
由于程序员类实现了司机接口中的全部方法, 因此具备了司机所需要的全部技能, 所以程序员不再是普通的程序员, 而是一个会开车的程序员.(既是司机又是程序员)
再看下面的代码:
public class Actor implements Driver{
...
public void drive(Car car){
System.out.println("演员在开车兜风");
}
}
上面的代码是Actor类(即:演员类)实现了Driver接口, 因此演员也不是普通的演员, 而是一个会开车的演员.
3、一个类实现多个接口—(不会开车的厨师不是好程序员)
定义另外一个接口Cook(即:厨师)
public interface Cook{
public void cook();//做饭
public void washFoodMaterial();//洗菜
}
定义一个类(Programmer)同时实现Driver接口和Cook接口.
public class Programmer implements Driver, Cook{
...
public void drive(Car car){
System.out.println("程序员在小心翼翼的开车回家");
}
public void cook(){
System.out.println("程序员做了美味的饭菜");
}
public void washFoodMaterial(){
System.out.println("洗菜");
}
}
上述代码Programmer实现了Driver和Cook接口, 即:实现了2个接口中规定的全部方法. 因此程序员具备了司机的技能和厨师的技能. 可以认为此程序员具备3种身份: 程序员,司机以及厨师.
三、接口有什么用?
1、实现多继承
众所周知, Java只允许类单继承, 并不支持类的多继承.
接口提供了一种间接实现多继承方式.只需要让类实现多个接口即可.
注意接口实现的多继承与C++中的多继承不同, C++是真正意义上的多继承, 每个父类的属性和方法都会继承, 而接口实现的多继承更多是继承方法, 因为接口中不能定义属性(能定义类常量).
2、多态
多态是面向对象的一个重要特征, 它允许父类引用指向子类对象.
既然接口可以实现继承乃至多继承, 因此可以把接口看做是实现类的父类, 进而产生多态的效果.
Driver zhangsan = new Progarmmer();
上述代码就是把 程序员看作了司机, 之所以程序员能看作司机, 是因为程序员实现了Driver接口, 具有了司机全部的功能(方法).
四、接口的注意事项
1、接口里面的方法都必须是 public abstract类型的
即便你没有写修饰符,也会默认给你加上public abstract。
2、接口可以看成一个特殊的抽象类
接口里的所有方法都是抽象方法。这个类可以看成是一个抽象类,因此接口不能创建对象。只能有实现类创建类。
实现类就是实现接口的类。
3、接口里面可以有属性
接口里可以有属性,但是属性必须是public static final修饰的属性,也就是说接口里面只能定义 静态常量。既然是常量,命名方式应该全部大写。访问方式参考static的访问方式。
4、接口可以继承别的接口
接口可以继承别的接口,在定义接口的时候使用extends关键字来继承别的接口。
一旦一个接口继承了别的接口,那么这个接口的实现类也要把继承的方法实现了。
五、接口与抽象类有什么异同
1、能否定义属性
抽象类:抽象能定义静态属性以及非静态属性。
接口:只能定义静态属性,并且这个静态属性必须是final类型的静态属性。本质上是常量。
抽象类:能对属性进行读取以及写入操作。
接口:只能读取属性的值,但是不能更改属性的值。
2、访问修饰符
属性修饰符:
抽象类:public, 默认, protected, private ; static final
接口: 只能是public; static final。
方法修饰符:
抽象类:public, 默认, protected , private。static ,final, abstract
接口:public abstract
3、能否有构造器
抽象类: 可以有。
接口:不可以。虽然接口可以看成类但是接口不是类。
4、能否包含抽象方法
抽象类:可以包含
接口: 可以包含,必须是抽象方法
5、能否包含非抽象方法
抽象类: 可以。
接口:不可以。
6、是否可以包含初始化块
抽象类:可以。
接口:不可以。
7、是否可以包含内部类
抽象类:可以。
接口:可以
8、继承
抽象类:一个普通类只能继承一个抽象类。
接口:一个普通类可以实现多个接口。
六、什么时候用接口?什么时候用抽象类?
接口的核心用途
定义一些方法,供实现类去实现。
抽象类的核心用途
定义一些方法以及一些属性,供子类继承。
如果只是想增加几个方法,优先使用接口。让你的类去实现某个接口(接口里是你想要增加的方法)。
如果既要增加方法又要增加属性,使用抽象类。让你的类继承抽象类,这样就可以获得抽象类中的属性,而且还可以实现抽象类中的方法。
有一种情况,只能用接口不能用抽象类。-----多继承。你要实现的方法分别在多个接口里,你可以使用实现接口的方式来完成。但是你不能继承多个类。
抽象类以及接口都是在讲述如何去设计项目中的类。
如果既要增加方法又要增加属性,使用抽象类。如果只想要方法,使用接口。