文章目录
- 1 目录及资源索引
- 2 基本概念
- 2.1 接口的基本语法一
- 2.2 接口的基本语法二
- 2.2.1 一个类继承多个接口
- 2.2.2 一个接口继承多个接口
- 3 接口的应用
- 3.1 为什么要使用接口?
- 3.2 代码分析
- 3.3 工厂模式
- 4 总结
1 目录及资源索引
Java4Android自学过程目录及资源索引
2 基本概念
前言:接口的使用方法,真正体现了面向对象的好处;
2.1 接口的基本语法一
接口的基本语法:
- 使用 interface 定义;
- 接口当中的方法都是抽象方法;
- 接口当中的方法都是 public 权限;
定义了接口,就相当于定义了调用的标准。在接口类中,无论前边写还是不写“public”,都是公共权限。
思考一个问题,接口类可以生成对象吗?由接口的基本概念可以理解,接口中的方法都是抽象方法,假想一下,如果接口类可以生成对象,那对象调用此函数,根本就没有函数体来实现此函数,因此接口类不能生成对象。那怎么解决呢?抽象类虽然不能生成对象,但是可以继承,然后子类再去复写即可,接口类也一样。
特别注意:接口类的继承,不能使用 extends,而要使用 implements。
接口类的继承,应该是实现的继承,子类需要实现父类的接口。
2.2 接口的基本语法二
主要内容如下:
- 实现接口使用 implements 关键字;
- 一个类可以实现多个接口;一个类只可以继承单个类,但却可以继承多个接口;
- 一个接口可以继承多个接口;
2.2.1 一个类继承多个接口
USB接口
interface USB
{
// 全都是抽象函数
public void read();
public void write();
}
WiFi接口
interface WiFi
{
public void open();
public void close();
}
Phone 类,继承USB,WiFi接口
class Phone implements USB, WiFi
{
// 全都是抽象函数
public void read()
{
System.out.println("USB read");
}
public void write()
{
System.out.println("USB write");
}
public void open()
{
System.out.println("WiFi open");
}
public void close()
{
System.out.println("WiFi close");
}
}
一个类,当继承了多个接口时,向上转型就有了多个选择!
2.2.2 一个接口继承多个接口
此处应该是 extends,继承此接口;而不是实现此接口(implements),如果要实现此接口,就必须要实现函数的复写。
假设有一个接口A
interface A
{
public void funA();
}
一个接口B
interface B
{
public void funB();
}
然后还有一个接口C,需要继承接口A,B,应该如下
interface C extends A, B
{
public void funC();
}
应该使用 extends ,且当我们使用接口C时,必须复写这三个函数。
3 接口的应用
3.1 为什么要使用接口?
首先要明白,接口中的方法,就是抽象的,没有函数体。针对原来打印机的那个例子来看,目前写的代码,在现实中几乎是不可能的,实现这个方法,更合适的是使用一个接口。公共类应该用一个接口,要更合适,在这个公共类中,写一些公共的方法,然后子类继承到自己的方法,再加以扩展。
3.2 代码分析
之前在学习面向对象时,有一个例子:客户提供几次不同的需求,分别添加不同的打印机,需要我们实现基本的功能,当时的做法是把打印机抽出来一个单独的类,在知道了接口后,是不是觉得用接口更好一点呢?
先把 Printer 接口函数写出来,可以看到,接口很简单,不用考虑函数具体的实现方法。
interface Printer
{
public void open();
public void close();
public void print(String s);
}
接着是 HPPrinter 类,由于没有自己特别的功能,就直接继承 Printer 接口,然后复写基本函数即可
class HPPrinter implements Printer
{
public void open()
{
System.out.println("HP open");
}
public void close()
{
System.out.println("HP close");
}
public void print(String s)
{
System.out.println("HP print --->" + s);
}
}
然后是 CanonPrinter 类,这个打印机有自己特别的功能,就是在关机前会执行以下清除操作,那就把特有的功能单独写出来就好了,剩下的,还是直接复写父类的接口函数即可
class CanonPrinter implements Printer
{
public void close()
{
this.clean(); // 先调用本类的clean方法
System.out.println("Canon close");
}
private void clean()
{
System.out.println("clean");
}
public void open()
{
System.out.println("Canon open");
}
public void print(String s)
{
System.out.println("Canon print --->" + s);
}
}
3.3 工厂模式
上述程序,根据之前的代码来看,主函数所在类 Test ,具体实现应该如下:
设想一下,如果有100个人要打印,那主函数中的代码就需要被重复调用100次,但是这个判断使用哪个打印机的过程,对客户来说,完全没有用,他们也不需要知道我们是怎么判断使用哪个打印机的,他们只需要知道怎么用就好了。
那对我们来说,就是要找到这些语句中的共同点,然后提取出来。共同点是什么呢?看所有的 if…else… 判断语句,基本都是根据用户的选择,生成相应的打印机对象,并且向上转型为Printer类型。那我们为何不能单独提取出来,用一个函数实现呢?
分析一下我们要新建的函数,首先返回类型必须是打印机的父类类型,不然他们没办法在一块相等,然后就是代码实现,我们新建一个类,如下
class PrinterFactory
{
public static Printer getPrinter(int flag)
{
Printer printer = null;
if(0 == flag) // 使用 HP 打印机
{
printer = new HPPrinter();
}
else if(1 == flag) // 使用 canon 打印机
{
printer = new CanonPrinter();
}
return printer;
}
}
相应的,我们要修改主函数中的代码,直接使用此函数的返回值
class Test
{
public static void main(String args[])
{
int flag = 1;
Printer printer = PrinterFactory.getPrinter(flag);
printer.open();
printer.print("zhaoc");
printer.close();
}
}
可以看到,主函数代码精简了很多,我们完全看不到内部实现过程,看到的就是开机,打印,关机等。
这就是著名的工厂方法模式。
简单静态工厂方法模式,首先是要向上转型
工厂方法模式,思路非常简单:就是把生成对象的代码,就是使用 new 调用构造函数的代码,封装在工厂函数中。对使用者来讲,他们不需要知道打印机 new 等,只用知道怎么用就好了,而不需要知道内部代码。
4 总结
- 简单了解接口,接口的基本概念,接口的使用方法,限制条件等;
- 又进一步了解了接口的应用,了解了接口以后,可以对之前的代码进行优化;
- 然后又了解到了工厂方法模式,就单独一个类,跟一个加工厂一样,客户不需要管工厂内部是这呢工作的,只需要知道送进去的是什么,送出来的是什么就可以了。