
这里我按照我的思路只是对java和Object-c区别有明显的地方做个总结,如果要学习这门语言建议还是找来一本书看看细节知识点,限于篇幅,这里讲解不全面,大都点到为止。如有错误的地方,欢迎批评指正,一起学习。大伙学过编程都知道,计算机语言的第一门课,都会讲如何敲出“Hello World!”这样一个程序,今天也从这里开始,先看两块代码:
class HelloWorld { //主函数入口 public static void main(String[] args) { System.out.println("Hello World!"); } }
#import//主函数入口 int main(int argc, char *argv[]) { @autoreleasepool { NSLog(@"Hello World!"); } return 0; }
运行上面两段代码都可以在控制台打印出“Hello World!”,从这个Demo里面我们开始引出下面几点内容:
常见文件扩展名:
后缀扩展名 | 意义 |
---|---|
.java | java代码源文件 |
.class | javas源代码编译后的与平台无关的字节码文件 |
.c | C语言代码源文件 |
.cc、.cpp | C++语言代码源文件 |
.h | 头文件 |
.m | Object-c语言代码源文件 |
.mm | Object-c++语言代码源文件 |
.o、.out | C、C++、Object-c语言编译后生产的文件 |
程序入口:
java和objec-c都用main函数作为程序的入口。
注意返回值
注意打印语句:当然object-c也可以用C语言中的printf语句来打印。这里的NsLog是Cocoa框架中提供的Foundation框架。
object-c指针变量的概念。
java采用垃圾回收机制,由java虚拟机负责对象内存回收工作。而Object-c没有这样的机制,这里是引入自动释放池(@autoreleasepool),该池会自动回收这些语句创建的对象,释放内存,避免内存泄露。这也是MRC(手动引用计数)中的一种。相对于Object-c2.0引入的ARC(自动引用计数),这个要在内存管理上相对难一点。这也是java程序员学习这块知识的一个难点。
NSLog函数中NS是一个前缀,用来标识这个函数来自Cocoa,而不是其他程序包,而Java用包名来区分这些。
Java字符串只需要用双引号””引起来就可以,而Object-c则需要在此基础上加上@符号,来表示它是一个字符串。
Java编译后会生成相对应的.class文件,而Objec-c编译后会生成对应的.out文件。
Java和object-c注释:单行注释用//...
多行注释用/*...*/
关于两者分隔符、标识符两者并无太大区别,而关键字大体相同,但有个别差别,这里不再
多说,有兴趣的可以查资料。
Object-c是C语言的超集,所以它支持的类型与C基本相似:这里不再多说,下面先列出基本数据类型:
类型 | 说明 |
---|---|
short int | 简称short |
int | 整型 |
long int | 简称long |
long long | 更长整型 |
char | 字符型 |
float | 浮动型 |
double | 浮点型 |
enum | 枚举 |
BOOL | 布尔类型:YES对应1,NO对应0 |
NSInteger | long |
NSUInteger | unsigned long |
CGFloat | 64位平台相当于double,32位平台相当于float |
在Object-c中定义类型为了平台兼容性,我们建议都用NSInteger、NSUInteger、CGFloat来代替整型和浮点型,很重要一点就是他们都是基本类型。
包装类:
NSValue:通用的包装类,包装short、int、long、float、char、指针、对象id等
NSNumber:继承于NSValue,包装short、int、long、float、char、指针
类型转换:
基本类型之间的转换:
自动类型转型
强制类型转换(用圆括号)
向上转型,也就是类型提升
基本类型与包装类型之间转换:
+ numberWithXxx:将特定类型值包装为NSNumber
;
- initWithXxx
:先创建一个NSNumber对象,再用基本类型初始化NSNumber;
- xxxValue
:返回该NSNumber对象包装的基本类型的值;
类型 | 说明 | 包装类 |
---|---|---|
byte | 字节类型 | Byte |
short | 短整型 | Short |
int | 整型 | Integer |
long | 长整型 | Long |
char | 字符型 | Char |
float | 浮动型 | Float |
double | 浮点型 | Double |
boolean | 布尔类型:true , false | Boolean |
包装类:如上表
类型转换
基本类型之间的转换:
自动类型转型
强制类型转换(用圆括号)
向上转型,也就是类型提升
基本类型与包装类型之间转换(拆箱与装箱机制):
new WrapperClass(primitive):创建对应包装类;
WrapperClass.xxxValue():返回对应基本数据类型;
算术运算符:+(加)、-(减)、* (乘) 、 /(除) 、%(取余)、++(自加)、—(自减)
赋值运算符:=、+=、-=、*=
、/=、%=、&=、|=、^=、<<=、>>=、>>>=(仅Java支持)
位运算符:&(按位与)、|(按位或)、~(按位非)、^(按位异或)、<<(左移)、>>(右移)、 >>>(无符号右移,仅Java支持)
比较运算符:>、<、>=、<=、==、!=
逻辑运算符:&&(与)、||(或)、!(非)、^(异或)
三目运算符:(?:)
这里不过多解释,大伙自行脑补,然后就是注意一下运算符的优先级,是在拿不准就用括号括起来。
顺序结构
if条件语句
switch分支语句
循环结构
while循环语句
do while循环语句
for循环
foreach循环(注意Java和Object-c表现不一样,下面遍历数组提到)
控制循环语句:break、continue、return、(goto不再提及,少用)
这里相信大伙都没问题,只强调一点就是代码规范。
Object-c直接使用了C语言的数组,和Java相比定义:
type arrayName[length] = {ele1,ele2,……eleN};
静态初始化:type[] arrayName = new type[]{ele1,ele2,……eleN}
或者type[] arrayName = {ele1,ele2,……eleN}
动态初始化:type[] arrayName = new type[length]
Java建议使用这种方式定义
另外还有一种是和上面Object-c一样,但是规范起见不建议使用
用foreach遍历数组
for(type varName:arrayName){ }
for(type varName in arrayName){ }
C、Java和Object-c的入口函数都是main函数
函数参数传递机制都是值传递,这点大伙可以延伸一下,书本上常引用的例子就是变量之间的值交换。
内部函数:定义时用static修饰,该函数只能被当前源文件中其他的其他函数所调用。
外部函数:定义时用extern修饰,或不使用任何修饰符修饰,可以被任何源文件中的函数调用。
局部变量和全局变量的作用域。
内部全局变量和外部全局变量定义:static修饰,区别就是是否可以被其他源程序文件访问。
动态存储和静态存储
编译器执行之前,先对预处理命令进行处理,然后再和源程序一起编译。
预处理命令必须以#开头
预处理命令通常位于文件开头部分。
宏定义:#define 宏名称 字符串
,如这条语句:#define PI 3.1415926
宏名称字母大写,它不是变量,也不是常量,编译器处理只需查找和替换为定义的字符串即可。
带参数的宏定义:#define 宏名称(参数列表) 字符串
,如这条语句:#define AREA(r) PI * r * r;
条件编译第一条指令:#ifdef、#ifndef、#else、#endif,定义如下:
#ifdef 宏名称 //执行任意语句 #endif
如果定义了指定的宏,则执行#ifdef和#endif之间的语句。
#ifdef 宏名称 //任意语句 #else //任意语句 #endif
如果定义了指定的宏,则执行#ifdef和#else之间的语句;否则执行#else和#endif之间的语句。
#ifndef 宏名称 //任意语句 #endif
如果没有定义指定的宏,则执行#ifndef和#endif之间的语句。
#ifndef 宏名称 //任意语句 #else //任意语句 #endif
如果没有定义指定的宏,则执行#ifndef和#else之间的语句;否则执行#else和#endif之间的语句。
条件编译第二条指令:#if、#elif、#else、#endif
#if 表达式 //任意语句 #elif 表达式 //任意语句 …… #else //任意语句 #endif
和分支语句比较像
#include
和#import
:两者都可以导入源程序,但前者会有重复导入问题,所以Object-c中我们建议和Java一样使用#import。