java基础(7)---接口



1、抽象类和抽象方法


public abstract void f();
创建抽象类是希望通过这个通用接口操纵一系列类。如果一个类包含大于等于一个抽象方法,那么这个类就是抽象类,必须用abstract关键字来限定这个抽象类。
如果试图直接创建该抽象类的对象,编译器会报错。
如果抽象类的子类没有为基类的抽象方法提供定义,那么这个导出类依旧是抽象类。
抽象类也可以不包含任何抽象方法,单纯的用abstract限定类。(该类不能产生对象)


2、接口

interface这个关键字替代class关键字,产生了一个完全抽象的类。接口只提供形式,未提供任何具体实现。
接口被用了建立类与类之间的协议。接口也可以包含域,但是这些域隐式的是static和final的。因此,其中定义的成员变量,是static&final的。
implenments关键字可以跟一组接口,extends关键字只能跟一个基类。
接口中的方法必须是public的,隐式的被声明public的,如果要显示声明,它们也必须被声明为public的。否则在继承的过程中,可访问权限被降低,这是java编译器所不允许的。

接口中的方法必须是public(可省略不写),实现类中实现方法也必须是public的。

3、完全解耦

只要一个方法操作的是类而非接口,那么你就只能使用这个类及其子类。如果这个方法还想操作其他类型,就会发生错误。而接口就可大大放宽这种限制,使得我们可以编写复用性高的代码。例如:有一个手机类,接口是播放器play(),有不同的导出类继承这个手机类,一个方法接收手机对象,调用play方法播放音乐。但是这个方法只能接收手机对象和导出类对象。如果我想让电脑播放音乐,由于电脑不属于手机继承体系,所以不能实现这种功能。但是如果我们把播放功能抽象到一个接口里,让手机实现这个接口,电脑实现这个接口,那么这个方法只要接收接口参数即可。实现了解耦合。

如果手机类是我们创建的,我们可以直接添加implements,但是如果它是jar里的或者别人的,我们不能直接修改它怎么办呢?

可以使用适配器模式,创建一个适配器类,实现接口,组合所需要的对象,在方法里调用该对象相应的方法。

4Java中的多重继承

一定要记住:使用接口的核心原因就是为了能向上转型成多个基类(以及由此带来的灵活性),第二个原因就是与使用抽象类相同:防止客户端创建该类的对象。

5通过继承扩展接口

利用extends关键字可以扩展接口里的方法

 注意 组合接口时的名字冲突

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 int f(int i) {
		return 0;
	}
	public void f() {
	}
}

class C3 extends C implements I2{
	public int f(int i) {		
		return 0;
	}	
}

class C4 extends C implements I3{
	//Identical, no problem;
	public int f(){
		return 1;
	}
}

//methods differ only by return type;
//! class C5 extneds implements I1{}
//! interface I4 extends I1,I3{}

6、适配接口

类的构造器接受一个接口,将希望使用该类的类都实现该接口,这样可以类就可以作用于更多的类型。比如Scanner类,想使用该类的类型
和策略模式的不同:
方法可以作用于不同的类型。
而适配器模式是,将不同类型作为类构造器的参数传入,有点类已经固定了,等着别人用的时候向下转型成接口类的感觉。

7、接口中的域

接口中的域都自动是static和final的,所以接口杰成为了一种很便捷的用来创建常量组的工具。在接口中定义的域不能是“空final”,但是可以被非常量表达式初始化。

8、嵌套接口

嵌套在另一个接口中的接口自动是public的,而不能声明为private的。当实现某个接口是,并不需要实现嵌套在其内部的任何借口,而且,private接口不能在定义它的类之外被实现。

9、接口与工厂

接口是实现多继承的途径,而生成遵循接口对象的典型方式就是工厂方法设计模式。

原始方式:

方法以接口为参数,void action(Service s){...}

调用的时候if(xxx)action(new SImp1());else if(xxx)action(new SImp2());else if....每个调用地方都需要直接提供实现类对象。如果需要修改/增加实现类代码就会很冗余。

工厂方式:

void action(ServiceFactory fac){Service s = fac.getService();....}

只需要在factory里改变即可。




猜你喜欢

转载自blog.csdn.net/qq_40182703/article/details/80397212
今日推荐