一、接口定义
接口与类相似,但只包含常量和抽象方法
接口中的所有数据域都是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();
}
}
四、Java四大接口
1、Clonable 克隆对象
2、Comparable 比较对象
3、Serializable 序列化对象
4、Runable 对象线程化