接口与类相似,但只包含常量和抽象方法 接口中的所有数据域都是public static final,所有方法都是public abstract。所以Java允许简写,以下两种定义是等价的
public interface T { public static final int K=1;//必须初始化,因为没有构造函数 public abstract void p(); } public interface T { int K=1;//必须初始化,因为没有构造函数 void p(); }继承重写时别忘了加public,因为在接口中是public,子类中也必须是public。
对象继承接口,表明对象可以进行接口中定义的行为。因为不同的对象,从逻辑上来说八竿子打不着,更没有逻辑上的包含关系,所以它们不能继承自同一个基类(Object除外)。但它们有确实具有一些行为是相似的,比如鸡和苹果都可以吃,鸡属于动物,苹果属于水果(别跟我说它们都属于食物),引入接口可以提供这种多态:
函数参数为接口引用,传入八竿子打不着的对象的引用时,可以动态的执行它们重写的相同名字的接口。
接口扩大了多态的范围,多态有多重要接口就有多重要。
这个程序多态处传入Object对象,首先判断该对象是不是实现了接口的子类,是的话就调用接口函数
public class text{ void eat(Object o) { if(o instanceof Chicken) { ((Chicken)o).howToEat(); } else if (o instanceof Apple) { ((Apple)o).howToEat(); } else { System.out.println("不能吃"); } } public static void main(String[] args) { Object[] objects={new Chicken("大公鸡"),new Apple(10), new ArrayList<Integer>()}; text t1=new text(); for(int i=0;i<objects.length;i++) { t1.eat(objects[i]); } } } interface Eat { void howToEat(); } class Chicken implements Eat { private String name; Chicken(String name) { this.name=name; } @Override public void howToEat() { System.out.println("煮着吃"); } } class Apple implements Eat { private int weight; Apple(int weight) { this.weight=weight; } @Override public void howToEat() { System.out.println("啃着吃"); } }如果把eat(Object o)修改为eat(Eat o),我觉得更能体现接口和抽象类很相似。也更能体现多态的味道。
public class text{ void eat(Eat o) { o.howToEat(); } public static void main(String[] args) { Chicken c= new Chicken("大公鸡"); Apple a=new Apple(10); text t1=new text(); t1.eat(c); t1.eat(a); System.out.println(); } }1、Clonable 克隆对象 2、Comparable 比较对象 3、Serializable 序列化对象 4、Runable 对象线程化