1.当一个抽象类的方法都是抽象的方法时,这是就可以用另一种形式定义和表示 ------------ 接口(关键字 : interface ),定义时不用class
例:
interface Demo{
public abstract final int NUM=1;//全局常量
public abstract void show(); //抽象的方法
}
接口中修饰变量:public abstract final ......
接口中修饰方法:public abstract ......
以上两种形式是固定的,哪怕你只写一个abstract编译器也会帮你自动加上,但是最好按照这个格式写完整
2.类与类之间是继承关系
类与接口之间是实现关系
接口与接口之间是继承关系
3.java中不能直接支持多继承,因为会出现调用同一函数的不确定性,但是java可以实现多个接口,这是因为接口中的方法都是抽象的,哪怕父类A,B中有相同的函数名,由于没有被具体化,所以调用谁的都一样,不会发生不确定性。 格式如下
class C implements A,B{ //实现A和B的接口,A和B用逗号隔开
coding .....
}
4.抽象类与接口的异同点
相同点:都是具有抽象方法
不同点:
(1)抽象类需要被继承,而且只能单继承
接口需要被实现,而且支持多实现
(2)抽象类中可以定义抽象方法和非抽象方法,子类继承后可直接使用非抽象方法
接口只能定义抽象方法,必须由子类实现
(3)抽象类的继承是 is - a 关系,在定义该体系的基本共性内容
接口的实现时 like - a 关系,在定义体系额外的功能
5.什么时候用抽象,什么时候用接口呢?
(1)当一个类中的方法需要抽象,但作为一个比较大的抽象主体,也有一些一般的方法,此时用抽象
(2)接口作为额外扩展的功能,因而里面的方法少且全为抽象时,用接口,把接口注重为额外扩展的功能
原则:抽象里面的方法为这个类体系中最根本的属性, 而接口更像是一种额外的功能
6.
public interface A{
public void abstract a();
}
public interface B{
public void abstract b();
}
public class C{
public void a(){ syso “aaaaa”;}
}
public class D extends C implements A,B{
public void b( syso("bbbbb"));
}
由于C里有一个a方法,所以D继承C时,就已经有了一个a方法,也就不用在实现A中的a方法了
此外将一个具体类和多个接口组合到一起时,这个具体类必须放在前面,后面跟着的才是接口,否则编译报错
7.使用接口的两大核心原因
(1)为了能够向上转型为多个基类型(以及由此而带来的灵活性)
(2)与使用抽象基类相同:防止客户端程序员创建该类的对象
8.组合接口时的名字冲突
interface I1{ void f(); }
interface I2{ int f(int i);}
interface I3{ int f();}
class C { public int f() { return 1 ;}}
class C2 implements I1,I2{ //两个接口名相同,返回值及参数列表不同时,需要分别实现
public void f(){}
public int f(int i){return 1;}
}
class C3 extends C implements I2{ //父类的函数和接口的函数参数列表不同,也需要把接口的函数实现
public int f(int i){ return 1;}
}
class C4 extends C implements I3{ //完全一样的,写也没事,不写由于继承于C了,所以也没事
public int f(){ return 1;}
}
// ! class C5 extends C implements I1{} //C中的f()与I1中的f()不是一模一样(参数列表,返回值都必须一样),所以必须里面实现I1的f()
//! interface I4 extends I1, I3 {} //由于I1 和I3 里面的函数不是一模一样,所以会产生分析,子类不知道实现那个接口可好。
8.优先选择类而不是接口,不要滥用接口,它只是一个工具,