1.接口概念
接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一规则进行定义。可以将接口看成没有实例域的抽象类,但这两个概念有一定区别。
抽象类和接口的区别:
1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
2.静态方法
package com.interfaces;public interface MyInterface { static void staticMethod() { System.out.println("static method"); } default void defaultMethod() { System.out.println("default method"); } void smapleMethod();}
package com.interfaces;import com.interfaces.MyInterface;public class Test implements MyInterface{ public static void main(String[] args) { // TODO Auto-generated method stub Test t = new Test(); t.defaultMethod(); t.sampleMethod(); MyInterface.staticMethod(); } // public void defaultMethod() {// System.out.println("default method~");// } public void sampleMethod() { System.out.println("sample method"); } @Override public void smapleMethod() { // TODO Auto-generated method stub System.out.println("sample method"); }}
3.默认方法
可以为接口方法提供一个默认实现。必须用default修饰符标记这样一个方法。
不重载默认方法
package com.interfaces;import com.interfaces.MyInterface;public class Test implements MyInterface{ public static void main(String[] args) { // TODO Auto-generated method stub Test t = new Test(); t.defaultMethod(); t.sampleMethod(); MyInterface.staticMethod(); } // public void defaultMethod() {// System.out.println("default method~");// } public void sampleMethod() { System.out.println("sample method"); } @Override public void smapleMethod() { // TODO Auto-generated method stub System.out.println("sample method"); }}
重载默认方法
package com.interfaces;import com.interfaces.MyInterface;public class Test implements MyInterface{ public static void main(String[] args) { // TODO Auto-generated method stub Test t = new Test(); t.defaultMethod(); t.sampleMethod(); MyInterface.staticMethod(); } public void defaultMethod() { System.out.println("default method~"); } public void sampleMethod() { System.out.println("sample method"); } @Override public void smapleMethod() { // TODO Auto-generated method stub System.out.println("sample method"); }}
4. 解决默认方法冲突
如果先在一个接口中将一个方法定义为默认方法,然后又在超类或另一个接口中定义了同样的方法,会发生什么情况?
Java解决规则:
1) 超类优先。如果超类提供了一个具体方法,同名而且有相同参数类型的默认方法会被忽略。
2) 接口冲突。如果一个超接口提供了一个默认方法,另一个接口提供了一个同名而且参数类型(不论是否是默认参数)相同的方法,必须覆盖这个方法来解决冲突
5. 接口实例
接口与回调
在java.swing包中有一个Timer类,可以使用它在到达给定的时间间隔时发出通告,定时器需要知道调用哪一个方法,并要求传递的对象所属的类实现了java.awt.event包的ActionListener接口。
package com.interfaces;import javax.swing.JOptionPane;import javax.swing.Timer;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.Date;public class InterfaceTest implements ActionListener { public static void main(String[] args) { // TODO Auto-generated method stub ActionListener listener = new InterfaceTest(); Timer t = new Timer(10000,listener); t.start(); JOptionPane.showMessageDialog(null, "Quit program?"); System.exit(0); } public void actionPerformed() { System.out.println("now is"+new Date()); } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub System.out.println("now is"+new Date()); }}
Comparable接口:
package com.interfaces;import java.util.Arrays;import java.util.Comparator;public class LengthComparator implements Comparator{ public static void main(String[] args) { String[] l = {"hello","tom","kimm"}; Arrays.sort(l,new LengthComparator()); for (String e:l) { System.out.println(e); } } public int compare(String s1,String s2) { return s1.length() - s2.length(); }}