接口
接口定义了一组规则,用于描述类具有什么功能,但并不给出具体实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。类要遵从接口描述的统一规则进行定义,所以,接口是对外提供的一组规则、标准。比如Type-C接口,Type-A接口
一、JAVA接口的特点
就像一个类一样,一个接口也能够拥有方法和属性,但是在接口中声明的方法默认是抽象的。(即只有方法标识符,而没有方法体)。
-
接口规定了一个类必须做什么和不能做什么,相当于类的蓝图。
-
接口描述了一种能力,即汽车必须能跑,飞机必须能飞。
-
抽象方法只能存在于抽象类或者接口中,但抽象类中却能存在非抽象方法,即有方法体的方法。接口是百分之百的抽象类
-
接口不允许实例化
-
接口的抽象方法不能是private、protected、final。
-
接口的变量是隐式
public statci final。所以其值无法改变 -
声明类的关键字是class,声明接口的关键字是interface。
二、接口可以做些什么
1.接口使某些实现类具有我们想要的功能,比如说,实现了 Cloneable 接口的类具有拷贝的功能,实现了 Comparable 的类具有比较功能。
2.Java原则上只支持单一继承,但通过接口可以实现多重继承的目的。
3.实现多态,通俗的理解,就是同一个事件发生在不同的对象上会产生不同的结果,鼠标左键点击窗口上的 X 号可以关闭窗口,点击超链接却可以打开新的网页。
接下来解决一下课前的问题: -我们创建一个USB接口
public interface USB {
void connect(String s);
void disconnect(String s);
}
ublic class Computer implements Type_A,Type_C,USB {
@Override
public void ACRecharge(int s) {
System.out.println("AC充电功率为"+s+"w");
}
@Override
public void PDRecharge(int s) {
System.out.println("PD充电功率为"+s+"w");
}
@Override
public void connect(String s) {
System.out.println(s+"设备已连接");
}
@Override
public void disconnect(String s) {
System.out.println(s+"设备已断开连接");
}
}
- 测试类
public class Test {
public static void main(String[] args) {
Computer mouse=new Computer();
mouse.connect("鼠标");
mouse.disconnect("鼠标");
mouse.ACRecharge(5);
Type_C keyboard=new Computer();
keyboard.connect("键盘");
keyboard.disconnect("键盘");
keyboard.PDRecharge(10);
}
}
多态存在的前提:
- 要有继承关系,
- 子类要重写父类的方法,重写了
connect()和disconnect()方法 - 父类引用指向子类对象,keyboard引用指向Computer。
三、接口与类和抽象类的区别
- 普通类:只有具体实现
- 抽象类:具体实现和规范(抽象方法)都有
- 接口:只有规范(抽象方法),无法被实例化。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。 1.接口与类的区别
- 接口不能用于实例化对象。
- 接口没有构造方法。
- 接口中所有方法必须是抽象方法。
- 接口不是被继承了,而是被类实现。
- 接口支持多继承。
接口与抽象类的区别
-
抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
-
抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
-
一个类只能继承一个抽象类,而一个类却可以实现多个接口。
Q:如果一个类声明实现一个接口,但没有重写接口中的所有方法,那么这个类应当为什么类?
四、接口的实现
- 接口的定义使用关键字interface
interface 接口名{}
//实现一个USB的接口
package Demo02;
public interface USB {
void connect();
void disconnect();
}
- 类和接口是实现关系,用implements表示
class 类名 implements 接口名,其它接口名...,...
package Demo02;
public class KeyBoard implements USB{
@Override
public void connect() {
System.out.println("键盘已连接");
}
@Override
public void disconnect() {
System.out.println("键盘已断开连接");
}
}
一个类可以实现多个接口
package Demo02;
public class Computer implements Type_A,Type_C {
@Override
public void ACRecharge(int s) {
System.out.println(s);
}
@Override
public void PDRecharge(int s) {
System.out.println(s);
}
@Override
public void connect() {
System.out.println("设备已连接");
}
@Override
public void disconnect() {
System.out.println("设备已断开连接");
}
}
- 接口与接口之间是继承关系,可以多继承
接口 extends 接口1,接口2,接口3..
//因为Type_A,Type_C属于是USB接口,但又有所区别,所以我们可以创建一个USB接口,让其他的两个接口继承的方法。
package Demo02;
public interface USB {
void connect();
void disconnect();
}
//Type_C接口有了PD充电的方法后也继承了USB的连接方法
public interface Type_C extends USB{
void PDRecharge();
}
Type_A接口有了AC充电的方法后也继承了USB的连接方法
public interface Type_A extends USB{
void ACRecharge();
}
我们不能直接去实例化一个接口,因为接口中的方法都是抽象的,是没有方法体的,这样怎么可能产生具体的实例呢?但是,我们可以使用接口类型的引用指向一个实现了该接口的对象,并且可以调用这个接口中的方法(实际上就是使用了Java中多态的特性)
public class Test {
public static void main(String[] args) {
Mouse mouse1 =new Mouse();
mouse.ACRecharge(5);
————————————————————————————————————————
Type_A mouse=new Mouse();
mouse.ACRecharge(5);
}
}