欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

接口

程序员文章站 2022-07-14 10:42:28
...

接口

  1. 不是类,是一个抽象类型,是内部定义了一组规范的抽象集合(interface),所有实现接口的类要遵循规范(implements)
  2. 接口中的方法(规范)默认为 public abstract
  3. 接口中不能有实例域、静态方法,且没有方法体
public interface Comparable{
	int comparaTo(Object other);
}

1.8以后,接口可以静态方法和方法体

public interface Path{
	public static Path get(String first, String ... more){
		return FileSystem.getDefault().getPath(first,more);
	}
}
  1. 类要实现接口的要求:
    1.implements interfaceName
    2.对接口内的所有方法进行定义且为public,若没有全部定义则为抽象类

  2. 特性:
    不能使用new一个实例化对象
    可以声明接口变量,必须引用实现了接口的类对象

Comparable x;     //声明接口
x = new Employee();  //Employee实现了接口Comparable

可以使用instanceof检查某个对象是否实现了某个接口

Employee instanceof Comparable

可以扩展(继承)extends;一个接口可以继承多个接口,逗号隔开
可以包含常量,默认public static final

public interface Powered extends Moveable{
	double milesPerGallon();
	double SPEED_LIMIT = 95;
}

一个类可以实现多个接口,用逗号隔开

class Employee implements Cloneable,Comparable{}
  1. 接口与类的比较
    接口

  2. 接口的默认方法(default):类在实现接口时可以不用实现默认方法,要有方法体
    作用:可以实现接口演化(当接口被类实现后,要为接口添加新的方法,若此方法不卫默认方法,则容易出错,默认方法保证了源码的兼容性)

public interface MouseListener{
	default void mouseClicker(MouseEvent event){};
	default void mousePressed(MouseEvent event){};
	...
}

默认方法冲突(类的多实现,接口的多继承造成):先在一个接口中定义了一个默认方法,然后又在超类或另一个接口中定义了同样的方法
解决方法:
1.超类优先:如果超类提供了具体方法,其他所有提供的同名同参数的默认方法都会被忽略

interface Named{
	default String getName(){
		return getClass().getName() + "_" +hashCode();
	}
}
class Student extends Person implements Named{
	...//优先考虑Person类中的getName()方法
}

2.接口冲突:若一个超接口提供了一个默认方法,另一个接口提供了同名同参的(无论是否为default)方法,在实现的类中都要重写这个方法

class Student implements Person, Named{
	public String getName(){
		return Person.super.getName();//若两个都有,可以这样在重写的方法中则其一进行解决,也可自己重写
	}
	...
}
  1. 接口与抽象类
    1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
    2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
    3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法,1.8以后可以有了),而抽象类是可以有静态代码块和静态方法。
    4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
相关标签: java