2,类与类之间是继承关系,类与接口之间是实现关系。
接口不可以实例化,只能有实现了接口的子类并覆盖了接口中所有的抽象方法后,该子类才可以实例化,否则这个子类就是一个抽象类。
3,示例:
interface Demo {
public static final int NUM = 4;
public abstract void show();
}
class DemoImpl implements Demo {
public static void main(String[] args) {
DemoImpl d = new DemoImpl();
System.out.println(d.NUM);//正确
System.out.println(DemoImpl.NUM);//正确
System.out.println(Demo.NUM);//正确
}
}
但不能写d.NUM = 3;因为NUM为final的,其值不能改变。
9-11,接口-多实现
1,在Java中不直接支持多继承,因为会出现调用的不确定性。所以Java将多继承机制进行改良,在Java中变成了多实现。
一个类可以实现多个接口。
2,接口为什么不存在调用的不确定性?
之前说过,类之所以不支持多继承,是因为会出现方法调用的不确定性。接口为什么不存在这种情况呢?
因为接口中的方法都是抽象的,没有具体的实现方法,需要被覆盖才能实现,如果实现的两个接口中有相同的方法,则覆盖时把两个抽象方法都覆盖,所以实现的功能只有一个,不存在调用的不确定性。
注意:两个同名方法也需要相同的返回值类型。
9-12,接口-细节
1,一个类在继承另一个类的同时,还可以实现多个接口,接口的出现避免了单继承的局限性。
class Q {
public void method() { ... }
}
class Test extends Q implements A,Z {
...
}
Test类在继承Q的同时,可以实现A,Z等多个接口。
2,接口与接口之间是继承关系,而且接口可以多继承。
interface CC {
void show();
}
interface MM {
void method();
}
interface QQ extends CC,MM {
void function();
}
class WW implements QQ {
//需要覆盖三个方法
public void show() { ... }
public void method() { ... }
public void function() { ... }
}
3,Java中有没有多继承?
有,只不过换了一种方式实现,即接口。多实现的方式,但接口之间可以进行多继承,原理就在于方法体是否存在。
9-13,接口-特点
特点:
(1)接口是对外暴露的原则。如:电脑的USB接口,对外暴露,给外界提供一个与自己连接的地方,而用不到接口的地方就封装在电脑内。
(2)接口是程序的功能扩展。USB接口不仅可以接鼠标,还可以接键盘、U盘等,提高了其功能。
(3)接口的出现降低了耦合性。即降低联系程度,我们可以在用鼠标的时候,把它接到电脑上,不用的时候拔掉,而不是将鼠标焊死在电脑上。
(4)接口可以用来多实现。
(5)类与接口之间是实现关系,而且类可以在继承一个类的同时实现多个接口。
(6)接口与接口之间可以有继承关系。
9-14,接口和抽象类的区别
1,异同点:
相同:
都是不断向上抽取而来的。
不同:
(1)抽象类需要被继承,而且只能单继承。
接口需要被实现,而且可以多实现。
(2)抽象类中可以定义抽象方法和非抽象方法,子类继承后,可以直接使用非抽象方法。
接口中只能定义抽象方法,必须有子类实现。
(3)抽象类中的继承是is a关系,在定义该体系的基本共性内容。
接口的实现是like a的关系,在定义体系的额外功能。
2,什么时候使用接口,什么时候使用抽象类呢?
Eg:犬按功能分有导盲犬、搜爆犬等。
/*
导盲犬和搜爆犬都是犬,具有吼叫,睡觉等共性功能,而二者可能吼叫的方式不同,故不提供实现方式,
但睡觉的方式是相同的,所以将犬类定义为abstract,定义一些共性的东西。
*/
abstract class 犬 {
abstract void 吼叫();
void 睡觉() {
System.out.println("我睡...");
}
}
/*
可能不只狗有导盲功能,还有导盲猪,这时就把导盲功能抽取出来,谁具有导盲功能,
谁来实现就可以了,而导盲的方式不同,所以不定义具体实现方法。
*/
interface 导盲 {
abstract void 导盲();
}
interface 搜爆 {
abstract void 搜爆();//谁具有搜爆功能,实现这个接口即可
}
/*
导盲是犬类的扩展性功能,需要实现导盲功能,实现导盲接口。
*/
class 导盲犬 extends 犬 implements 导盲 {
//让导盲犬继承共性的犬,实现特有的导盲功能
public void 吼叫() {
System.out.println("汪汪");
}
public void 导盲() {
System.out.println("狗的指引");
}
}
因为犬类中有抽象的方法,还有一半方法,定义为抽象类;导盲中只有一个抽象方法,定义为接口。
在不同的问题领域中,有不同的分析方式。