面向对象是程序开发中最重要的部分,无论是Java还是Object-c都是一门面向对象的语言,我们这里对比总结这两种语言,体会一下面向对象的思想,慢慢会觉得语言只是工具,思想才是灵魂。
我还是喜欢拿代码开篇,这样好展开总结一些概念性的东西,而不至于理论说多太乏味。说干就干,先上代码:
/** * Student类 */ public class Student { //私有成员变量 private String mName; protected String age; public static String grade; //构造函数 public Student(String name,String age){ this.name = name; this.age = age; } public String getName(){ return mName; } public void setName(String name){ this.mName = name; } //类方法 public static setGrade(String grade){ grade = grade; } }
//SLStudent.h文件 #import@interface SLStudent : NSObject { NSInteger _age; @private NSString *_name; } - (id) initWithStudent:(NSString *)name age:(NSInteger)age; - (void) setName : (NSString *) name; - (NSString *) name; @property (nonatomic,copy,getter=xxx,setter=yyy:) NSString *gender; @end //SLStudent.m文件 #import #import "SLStudent.h" //全局变量模拟类变量,如单例模式使用到 static NSString *grade = nil; @implementation SLPerson @synthesize gender = _gender; - (id) initWithStudent:(NSString *)name age:(NSInteger)age { if(self = [super init]) { _name = name; _age = age; } return self; } - (void) setName : (NSString *) name { self->_name = name; } - (NSString *) name { return _name; } + (NSString *) grade { return grade; } + (void) setGrade : (NSString *) newGrade { grade = newGrade; }
对比上面的代码做一些说明:
上面分别用Java代码和Object-c实现两个Student类,分别对应的属性有name,age,grade.
Java用class
这个关键字来定义类,而Obect-c这里和Java不一样的地方,它分为两个文件:.h和.m文件,其中.h是声明文件,.m是类的实现文件,我们一般把方法和成员变量声明在.h文件中,而方法的实现放在.m文件中。我们用@interface作为声明类的开始,@end作为结尾,同样@implementation作为实现类的开始,@end为结束。
Java中用static这个关键字修饰方法来表示类方法,修饰变量来表示类变量。否则就是实例变量;而我们在之前的一篇文章中说static关键字修饰变量和方法在C语言中则表示只能在当前文件中使用。所以Object-c中修饰类方法则是用“+”方法来表示,实例方法则用“-”表示。
Java中声明私有成员变量建议以m开头,而Object-c中则建议以下划线_开头。
关于方法的定义:
//Java public void methodName(type1 paramName1,type1 paramName2){ //方法体 } //Object-c实现 - (void) methodName:(type1)paramName1 withType2:(type2)paramName2 { //方法体 } //其中methodName方法名字,type类型,paramName形参,这里提到withType2是指形参标签,Object-c中更好的理解形参的作用而引入,且只有从第二个参数开始有。
Java中类默认都继承Object,用关键字extends表示,一般省略,而Object-c中都继承NSObject,用:表示,一般不能省略。
Object-c中对于没有在.m文件中声明的方法和变量只能在该实现类中使用,只有在.h文件中定义的内容才可以暴漏在外面供用户调用,这也体现了良好的封装意识。
苹果公司建议在类前面加标识,也即这里的SL前缀,cocoa框架的类大多以NS开头,据说是乔布斯当时创立NextStep,把Object-c做为他们的主要开发语言,NS就是来自公司的缩写。
对于类的创建和方法调用:
//Java Student student = new Student(); student.getName(); student.setName("宇行信"); //其语法格式: 调用者.方法名(参数...); //Object-c SLStudent *student = [SLStudent alloc] init]; [student name]; [student setName:@"宇行信"]; //其语法格式: [调用者 方法名:参数 形参标签:参数...];
Java中的this关键字和Object-c中的self关键字都是表示调用该方法或者变量的对象。而super关键字代表其父类的实例。
Object-c中可以拿id类型作为所有对象的类型,也就是说,任意对象都可以赋值给id类型的变量。
对于方法中的可变形参,两种语言都支持,具体可以脑补一下。
Java用static来声明作为类变量,但是在Object-c中不支持类变量,但是可以模拟,如上面变量gender,具体用处我们可以在设计单例模式中用到。