
一路风景都看透 楼主
2015-07-12 21:04
面向对象是程序开发中最重要的部分,无论是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,具体用处我们可以在设计单例模式中用到。
¥199.00
¥79.00¥179.00
¥398.00
¥98.00