黑马程序员技术交流社区

标题: OC中的协议与Java中的接口比较 [打印本页]

作者: muzipiao    时间: 2016-3-25 11:59
标题: OC中的协议与Java中的接口比较
OC中的协议与Java中的接口比较
一、相同点:
1、OC中的协议与Java中的接口很类似,都是一种约定,一种约束,协议声明了可以被任何遵守协议的类实现的方法。OC中的协议就是相当于Java中的接口(抽象类)。
2、协议不是类,它是定义了一个其他对象可以实现的接口。
3、OC和Java都不支持多重继承,也就是不能同时继承两个类,但可以实现多个接口。
4、OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字更形象点,因为我们在学习Java中的接口时候,看可以知道其实接口就相当于一种契约(协议),Java中abstract class和interface很类似,但所反映出的设计理念不同。abstract class表示的是"is-a"关系,interface表示的是"like-a"关系;例如人和狗都属于不同的类别,但都会跑,可以设计个Person类和Dog类,同时定义animal协议,协议中定义跑的方法。
二、不同点:
1、OC中定义类的@interface和java中的interface不是一回事,OC的@protocol和java中的interface才是一码事。@interface跟java和C++ class关键字差不多,在OC和C++中,都习惯将类定义写在头文件里,而java却根本没有头文件的概念,至于为什么有这样的差别,我想是为了OC和C++编译器方便,大多数时候编译器只需要知道头文件类的定义就知道这个类有哪些属性和方法了。
2、OC中协议中定义的方法可以用@required、@optional修饰,@required修饰的方法必须要实现,@optional修饰的方法可以选择实现或忽略。而在Java中,实现接口的类必须实现其中的所有方法,继承自抽象类的子类实现所有的抽象方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。
3、OC中协议就一个用途,用来声明一大堆的方法(不能声明成员变量,Java中接口可以声明成员变量,接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值),不能写实现。
三、实现方式
//在OC中定义协议
@protocol 协议名称
   // 方法声明列表
@end
//OC中实现协议
@interface 类名 : 父类 <协议名称>
@end
//Java中定义接口,接口中的方法默认都是 public abstract 类型的
public interface 接口名称{
   // 方法声明列表
public abstract void 方法名称(ActionEvent event);
}
//Java中继承接口
[修饰符] class 类名[extends 父类名] [implements 接口A,接口B,···]
{
    //类成员变量和成员方法;
    //为接口A中的所有方法编写方法体,实现接口A;
    //为接口B中的所有方法编写方法体,实现接口B;
}
备注:以前自学的Java,最近几天才学的OC,以上是个人理解,有错误或者不当的地方,希望大家积极指正。






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2