Java基础9--继承--抽象类--接口(三)

2014-11-24 07:48:18 · 作者: · 浏览: 2
{ // code... } class DemoImpl implements Demo { // code... }

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("狗的指引");
	}
}

因为犬类中有抽象的方法,还有一半方法,定义为抽象类;导盲中只有一个抽象方法,定义为接口。

在不同的问题领域中,有不同的分析方式。