Java接口与Objective-C正式协议类似,因为都需要实现     一组方法。Java具有抽象类,但Objective-C没有。Java具有类变量,但Objective-C中,可以使用文件范围内的全局变量并为它们提供对应的访问器。Objective-C的公共和私有方法的形式比较松散。在Objective-C中,对象支持的任何方法都可以被调用,即使它们没有以任何外部形式出现(例如头文件中)。Java允许声明final类,阻止更改其中的任何子类,而Objective-C则与此相反,允许在运行时向任何类添加方法。

Objective-C中类的实现方式可以分成两个文件,头文件和自身的实现文件。但并不是一定要这样划分(例如某些小的私有类),这在本书的某些代码中意境有所反映。头文件(带有.h扩展名)保留类的公开信息,例如使用此类的代码讲使用的任何新的枚举、类型、结构,以及代码。其他代码段使用预处理器(#import)导入该文件。Java中缺少C预处理器。C预处理器是一种文本替换工具,它能在C、Objective-C和C++源代码进行编译器之前,先对它们进行自动处理,以#开头的指令表示一个预处理器命令。C预处理器是一个功能非常强大但又危险的工具。很多编程人员都认为java中缺少预处理器是一个良好的特性。

在java中,几乎所有错误都是通过一场来处理的。而在Objcective-C中,错误处理的方式取决于所使用的API。Unix API通常会返回值-1和一个全局错误编号(error),以设置某个特定的错误,Cocoa API通常仅在编程人员出现或无法清除时才抛出异常。Objective-C语言提供的异常处理特性与java及C++类似,采用@try、@catch、和@finally结构。

在Objective-C中,空(零)对象采用nil表示,可以向nil对象发送消息,而不必担心出现NullPointerException异常。向nil对象发送的消息代表停止操作指令,因此,不必检查发送的消息是否为NULL。

在Objective-C中,通过使用类别向现有类中添加方法,可以改变类的行为。 Objective-C中没有类似于final的类。因为编译器需要知道超类定义的对象的大小,所以任何类只要包含子类头文件,就可以把它设置为子类。

实际上,相对于java而言,在Objective-C中很少使用子类化行为。因为,通过类别和动态运行时机制,可以想任何对象发送任何消息,可以将某些功能放到含有较少功能的类中,也可以将功能呢放到最有意义的类中。例如:可以在NSString上加入类别来添加反转字符串或删除所有空格等特征,然后可以在任何NSString类中调用该方法,无论调用来自何处。当然,你也可以使用自己的字符串子类来提供那些特性。

一般来说,只有当创建某个全新的对象(位于对象层次结构的顶部),或者需要从根本上改变某个对象的行为,或者由于类不能实现某个功能而需要使用子类时,才需要在Cocoa中设置子类,例如:Cocoa使用NSView类机构用户界面组件,却无法实现它的dramRect:方法。因此,需要试这NSView的子类并重写dramRect:方法来绘制视图。但对其他大多数对象,通常采用委托和数据源的方式。由于Objective-C可以想任何对象发送任何消息,对象不必含有特定的子类或遵从特定的接口,这样,单个类就可以成为任意个不同对象的委托和数据源。

因为类别中意境声明了数据源和委托方法,因此,不必实现所有的数据源和委托方法,在Objective-C中,Cocoa编程很少使用空存根方法,某些方法会在嵌入式对象中调用相同的方法来使编译器能够顺利底适应一种正式协议。

当然,功能越强,责任越大。Objective-C采用手动保留、释放和自动释放的内存管理系统,这样容易产生一些棘手的内存错误,在其他类中添加类别是一种功能强大的工作机制,但如果随意滥用,会降低代码的可读性,导致其他人无法理解。另外,Objective-C是以C为基础的,因此,可以使用C语言的所有特性,同事包括使用预处理器可能带来的危险,并可能出现与指针相关的内存管理错误。

Java 和 IOS 区别的更多相关文章

  1. React++ node.js ++SQL Sever ++MySQL++ python ++ php ++ java ++ c++ c#++ java ++ android ++ ios ++Linux+

    "C语言在它诞生的那个年代,是非常不错的语言,可惜没有OOP.当项目臃肿到一定程度,人类就不可控了. 为了弥补这个缺陷,C++诞生了.而为了应对各种情况,C++设计的大而全,太多复杂的特性, ...

  2. (iOS)Base64加密和DES加密、以及JAVA和iOS中DES加密统一性问题

    我们在项目中为了安全方面的考虑,通常情况下会选择一种加密方式对需要安全性的文本进行加密,而Base64加密和DES64加密是常用的加密算法.我记得我在前一个项目中使用的就是这两种加密算法的结合:Bas ...

  3. C++与Java的语法区别

    C++与Java的语法区别 首先,两个大的不同是主函数和怎样编译的不同,接下来是许多小的区别. main 函数C++//自由浮动的函数int main( int argc, char* argv[]) ...

  4. C++和java多态的区别

    C++和java多态的区别 分类: Java2015-06-04 21:38 2人阅读 评论(0) 收藏 举报  转载自:http://www.cnblogs.com/plmnko/archive ...

  5. java的版本区别、下载、配置

    参考:http://blog.csdn.net/liujun13579/article/details/7684604 java的版本区别 常用的 java 程序分为  Java SE.Java EE ...

  6. 第一章.java&golang的区别之:闭包

    对于golang一直存有觊觎之心,但一直苦于没有下定决心去学习研究,最近开始接触golang.就我个人来说,学习golang的原动力是因为想要站在java语言之外来审视java和其它语言的区别,再就是 ...

  7. java的this static public protected private abstract interface 在python的对应,java python一些区别

    1.因为工作的原因,最近使用了三个多月的java作为主力语言.很早之前在菜鸟教程也看过java文档两遍,但实践少,处于能看懂写出来不流畅的状态(对于java必须要略懂,不能能看到就头疼跳过,因为现在百 ...

  8. 7 -- Spring的基本用法 -- 8... 抽象Bean与子Bean;Bean继承与Java继承的区别;容器中的工厂Bean;获得Bean本身的id;强制初始化Bean

    7.8 深入理解容器中的Bean 7.8.1 抽象Bean与子Bean 把多个<bean.../>配置中相同的信息提取出来,集中成配置模版------这个配置模版并不是真正的Bean,因此 ...

  9. Android Library和Android APP、Java Library的区别

    Android Library和Android APP.Java Library的区别 Android Library在目录结构上与Android App相同,它能包含构建APP所需的一切(如源代码. ...

随机推荐

  1. [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)

    原文:[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程详解之三: PL/SQL流程控制语句(不给规则,不成方圆) ...

  2. SQL点滴21—几个有点偏的语句

    原文:SQL点滴21-几个有点偏的语句 SQL语句是一种集合操作,就是批量操作,它的速度要比其他的语言快,所以在设计的时候很多的逻辑都会放在sql语句或者存储过程中来实现,这个是一种设计思想.但是今天 ...

  3. sql 中如何取出指定行: Row_Number

    原文:sql 中如何取出指定行: Row_Number ROW_NUMBER (Transact-SQL) USE AdventureWorks2008R2;GOWITH OrderedOrders ...

  4. 快速构建Windows 8风格应用33-构建锁屏提醒

    原文:快速构建Windows 8风格应用33-构建锁屏提醒 引言 Windows Phone(8&7.5)和Windows 8引入了锁屏概念,其实做过Windows Phone 7.5应用开发 ...

  5. 调试javascript

    Chrome 控制台 如何调试javascript 上面的文章已经大致介绍了一下console对象具体有哪些方面以及基本的应用,下面简单介绍一下如何利用好chrome控制台这个神器好好调试javasc ...

  6. IIS 5.x/6.0/7.0 和 ASP.NET

    原文:IIS 5.x/6.0/7.0 和 ASP.NET 本文主要介绍 3 个主要的 IIS 版本各自对 Web 请求的不同处理方式. 本文内容 IIS 5.x 和 ASP.NET IIS 6.0 和 ...

  7. css3学习文档

    什么是CSS3? CSS3是CSS2的升级版本,3只是版本号,它在CSS2.1的基础上增加了很多强大的新功能. 目前主流浏览器chrome.safari.firefox.opera.甚至360都已经支 ...

  8. html5跨域数据传递(postMessage)

    在html5中有个支持跨域传递的方法postMessage,可是实现iframe之间的数据传递! 代码如下:数据发送页面 <!DOCTYPE HTML> <html lang=&qu ...

  9. 区域、模板页与WebAPI初步

    区域.模板页与WebAPI初步 一.区域—麻雀虽小,五脏俱全的迷你MVC项目 1.1 Area的兴起 为了方便大规模网站中的管理大量文件,在ASP.NET MVC 2.0版本中引入了一个新概念—区域( ...

  10. 如何使用SetTimer MFC 不够具体

    转会:http://blog.csdn.net/ellor/article/details/1714741 Timer事件,即定时器事件,是在游戏编程中.常常使用的一个事件.借助它能够产生定时运行动作 ...