一、接口:用关键词Interface修饰,一般用于定义对象的拓展功能,也就是在继承之外还需要这个对象具备一些功能,是对抽象类的扩展,它是一种特殊的“抽象类”。一个类通过继承接口的方式,从而来继承接口的抽象方法。
二、接口的规范性:
接口相当于只是定义类一种规范,它并不在乎类里面的数据或者是如何实现某些方法的;
接口只规定了这些类里必须要实现的方法,所以规范和实现互不影响,这也就增强了拓展性和可维护性。
三、使用接口的好处:在于它的拓展性和维护性好,所以开发中经常用到(相当于定义了一种标准)。
四、关于接口的特性
- 接口可以继承多个接口(多重继承),但接口只能继承接口,不能继承类,如果往接口中添加方法,就必须改变实现该接口的类;
定义格式:
[修饰符] interface 接口名 extends 父接口1,父接口2…{
//零到多个静态常量定义
//零到多个抽象方法定义
}
修饰符public、abstract
//继承多个接口,接口允许多继承
//注意:接口只能继承接口
public interface InterfaceThree extends InterfaceOne,InterfaceTwo{
}
- 接口的实现类必须实现接口中的所有抽象的方法:
接口是无法被实例化的,因为它是一种特殊的“抽象类”,不存在方法的实现,但是它可以被实现。类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。一个类继承某个接口,则需要实现这个接口中所有的方法,除非实现该接口的类是抽象类。
public class Demo1 implements InterfaceOne{
//实现接口里的所有方法
@Override
public void sleep() {
System.out.println("睡觉");
}
@Override
public void swim() {
System.out.println("游泳");
}
@Override
public void test() {
System.out.println("测试");
}
}
实例化接口的实现类:
public class Demo2 {
public static void main(String[] args) {
//接口不能实例,接口能够作为类型的变量,但是它可以实例接口的实现类
InterfaceOne interfaceOne=new Demo1();
interfaceOne.sleep();
interfaceOne.swim();
interfaceOne.test();
}
}
- 类也可以实现多个接口:
格式:[修饰符] class 类名 implements 接口1[, 接口2, 接口3…, …] { }
//一个类可以实现多个接口
public class Demo1 implements InterFaceOne,InterFaceTwo{
@Override
public void print2() {
// TODO Auto-generated method stub
}
@Override
public void print() {
// TODO Auto-generated method stub
}
@Override
public void print1() {
// TODO Auto-generated method stub
}
}
-
接口的用法:
接口不能实例,接口能够作为类型的变量,接口作为一个类型来new,new的是接口的实现类
格式:接口 变量名称=new 接口的实现类(); -
接口与类的区别:接口和类的编写方式很相似,但接口并不是类,它们的概念是完全不同的,类描述的是对象的属性和方法,而接口是包含类要实现的方法。
-
接口与类的关系:可以说是实现关系,也可以是继承关系,根据情况而定。
-
接口是隐式抽象的,声明一个接口时,不需要使用abstract关键字
-
接口中的每一个方法也是隐式抽象的,没有普通方法,声明时也不需要abstract关键字
-
接口中的方法都是公有的(默认修饰符public),不能使用其他修饰符;接口不能有构造器,没有main方法,不能运行;
-
编译时自动为接口里定义的方法添加public abstract修饰符
-
Java接口里的成员变量只能是public static final共同修饰的(静态常量),并且必须在声明的时候赋初始值,可以不写public abstract final,编译时会自动添加
public interface InterFaceOne {
public static final int INT_A=10;//声明的时候必须赋初值
//编译时自动为接口里定义的成员变量添加上public static final修饰符
int INT_B=10;//不写修饰符,它会自动加上
//只能存在抽象方法
public abstract void print();
void print1();//编译时自动为接口里定义的方法添加public abstract修饰符
}
五、接口存在的意义:
接口只是定义了一种规范(标准),接口并不提供功能,只提供方法,方法名称,方法形参,返回类型,不作出实际的东西,它是通用的规范的。不同的类只要实现这个接口,我们就可以用同一种规范(方法)去调用不同的产品;比如不同的数据库连接同一个接口,把JDBC接口定义好之后,用这个接口连接数据库,不同的数据库,都基于同一个接口,方法一致,就不需要更改代码。
六、抽象类和接口的对比:
- 都位于继承的顶端,用于被其他类实现或继承;
- 都不能实例化;
- 都包含抽象方法,其子类都必须重写这些抽象方法;
- 抽象类为部分方法提供实现,避免子类重复实现这些方法,提供代码重用性。
- 接口只能包含抽象方法; 一个类只能继承一个直接父类(可能是抽象类),但可以实现多个接口;(接口突破了Java的单继承)。
- 接口不能有构造函数,抽象类是可以有构造函数的
- 接口没有main方法,不能运行;而抽象方法有main方法。
- 它可以有默认的方法实现;接口完全是抽象的,它根本不存在方法的实现。
七、如何对二者进行选择:
优先选用接口,尽量少用抽象类;
若需要定义子类的行为,又要为子类提供共性功能时才选用抽象类;
注意:如果不可以或没有创建对象,那么我们必须加上static修饰,既然不能用对象调用,就只好用类去调用。