类是一组具有相同特征和行为的事物的抽象,类就是通常所说的"类型".

对象就是类的实例.

在OC中,类的定义分两个部分:接口部分和实现部分, 通常分别写在两个文件中.

接口部分: .h; 声明了类名、父类名、实例变量(特征)和方法(行为);
实现部分: .m; 方法的具体实现(具体行为);

接口部分以@interface开始,以@end结束:

@interface    类名:NSObject{

      //实例变量列表(类的特征)    
}

 //方法列表(类的行为列表)
@end
.h可以在一个文件里,声明多个类,但通常不这么做;

实现部分以@implementation开始,以@end结束:

@implementation   类名
{
//方法列表
}
@end
创建对象,分两步:
内存分配:为对象分配内存空间,并返回首地址;
初始化:在内存中填上初始值;

OO(Object Oriented)面向对象

OOP(Object Oriented Programming)面向对象编程

//记录

.h

#import <Foundation/Foundation.h>

@interface Student : NSObject

//1.接口部分(所属的文件以.h结尾)

{
   //实例变量的列表(类的特征列表)
   @public
   NSString * _name;         /*NSString * 在OC里定义字符串*/
   NSString * _sex;
   int _age;
   //实例变量的使用:
   //1.类的内部
   //在类的内部,实例变量在任何方法中都可以随意使用
   //2.外部访问实例变量时,有可见度的设置
   //三种访问权限(可见度)
   //@public 公开的 表示实例变量可以 在外部 随意调用和改动
   //@protected 受保护的 表示实例变量不可以在外部被调用和修改(OC默认)
   //@private 私有的,不可以在外部被调用和修改
}
//方法列表(也叫类的行为列表;类的方法在接口部分,只是声明,不实现)
- (void) study;  
- (void) sleep;  

//带参数的方法

- (void)eat:(NSString *)food;
//多参数
- (void)firstNumber : (int)num1 secondNumber : (int)num2 thirdNumber : (int)num3;

@end

.m

#import "Student.h"

@implementation Student

//实现部分:(.m文件)

//接口部分中的 所有方法 都必须在实现部分实现
- (void) study  
{
   _name = @"啊啊啊";
   _age = 10;
   _sex = @"男";
   NSLog(@"我正在学习,名字:%@ 年龄:%d 性别:%@",_name,_age,_sex);    

                     /*NSlog相当于printf打印*/

}
- (void) sleep  
{
   _name = @"噢噢噢";
   _sex = @"你猜";
   NSLog(@"正在睡觉,%@%@",_name,_sex);
}

//带参数的方法

- (void)eat:(NSString *)food

{
   NSLog(@"%@在吃%@",_name,food);
}

//多参数

-(void)firstNumber:(int)num1 secondNumber:(int)num2 thirdNumber:(int)num3

{
   NSLog(@"%d=%d=%d",num1,num2,num3);
}

@end

main.m

#import <Foundation/Foundation.h>

//第一步,引入类的头文件

#import "Student.h"

int main(int argc, const char * argv[])

{

    Student * stu1 = [[Student alloc] init];             /*创建实例对象*/

    //利用 stu1对象 调用自身的方法

    [stu1 study];       //对象 学习
    [stu1 sleep];      //对象 睡觉

     //实例变量被改变为public后,调用对象的实例变量

     stu1->_name = @"啊啊君";            /*给stu1 赋值*/
     NSLog(@"%@",stu1->_name);

     [stu1 eat:@"hjhj"];      //带参数

     [stu1 firstNumber : 213 secondNumber : 123 thirdNumber : 789];     //多参数

//作业

1.完成班级开班介绍

需求:
 (1)定义一个班级类。
实例变量:所属培训机构,班级名,班级人数、开班时间、授课老师名字。
方法:初始化、集体活动、开班会。
 (2)定义一个老师类。
实例变量:名字、性别、年龄、正在教的课程、授课班级。
方法:初始化、讲课、留作业、验收作业、解决问题、自我介绍。
 (3)定义一个学生类。
实例变量:名字、性别、年龄、学号、所在班级、任课老师、正在学习的课程。
方法:初始化、学习、做作业、提出问题、回答问题、自我介绍。

(1)

.h

{

   NSString * _trainingAgency;//培训机构
   NSString * _className;   //班级名
   int _classSize;   //班级人数
   NSString * _classTime;    //开班时间
   NSString * _teacherName;     //老师名字
}
- (void) initialize;
- (void) collectiveActivity;
- (void) classMeeting;
.m

- (void) initialize   //初始化

{
   _trainingAgency = @"啊啊";
   _className = @"哦哦";
   _classSize = 20;
   _classTime = @"呵呵";
   _teacherName = @"噢噢";
   NSLog(@"%@学院%@班,有%d人,开班时间%@,班主任是%@\n",_trainingAgency,_className,_classSize,_classTime,_teacherName);
}
- (void) collectiveActivity   //集体活动
{
   NSLog(@"参加集体活动");
}
- (void) classMeeting    //开班会
{
   NSLog(@"集体参加班会活动");
}

(2)

.h

@interface Teacher : NSObject

{
   @public
   NSString * _name;
   NSString * _sex;
   int age;
   NSString * _course;   //课程
   NSString * _lectureclass;     //授课班级
}
- (void) initialize;
- (void) teach;
- (void) homework;
- (void) acceptanceOfTheWork;   //验收作业
- (void) toSolveTheProblem;      //解决问题
- (void) toIntroduceMyself;     //自我介绍

.m

- (void) initialize

{
   _name = @"12君";
   _sex = @"23";
    age = 0;
   _course = @"Object-c";
   _lectureclass = @"34";
   NSLog(@"老师:%@,性别%@,年龄为%d,会%@,班级是%@",_name,_sex,age,_course,_lectureclass);
}
- (void) teach
{
   NSLog(@"你猜");
}
- (void) homework
{
   NSLog(@"你猜");
}
- (void) acceptanceOfTheWork   //验收作业
{
   NSLog(@"你猜");
}
- (void) toSolveTheProblem      //解决问题
{
   NSLog(@"你猜");
}
- (void) toIntroduceMyself{
   NSLog(@"你猜");
}

(3)

.h

@interface Student : NSObject

{
   @public
   NSString * _name;
   NSString * _sex;
   int _age;
   int _studentId;
   NSString * _class;
   NSString * _teacher;
   NSString * _courses; //课程
}
- (void) initialize;
- (void) learning;
- (void) doingHomework;
- (void) askQuestions;
- (void) answerQuestions;
- (void) introduceMyself;

.m

@implementation Student

- (void) initialize
{
   _name = @"78";
   _sex = @"89";
   _age = 100;
   _studentId = 0;
   _class = @"90";
   _teacher = @"67";
   _courses = @"56";
   NSLog(@"1:%@,性别:%@,年龄:%d,学号:%d,班级:%@,老师:%@,课程:%@\n",_name,_sex,_age,_studentId,_class,_teacher,_courses);
}
- (void) learning
{
   NSLog(@"你猜");
}
- (void) doingHomework
{
   NSLog(@"你猜");
}
- (void) askQuestions
{
   NSLog(@"你猜");
}
- (void) answerQuestions
{
   NSLog(@"你猜");
}
- (void) introduceMyself
{
   NSLog(@"你猜");
}

main.m

#import "IOS8班级.h"

#import "Teacher.h"
#import "Student.h"

int main(int argc, const char * argv[])

{
   IOS8__ * stu1 = [[IOS8__ alloc] init];
     [stu1 initialize];
   Teacher * sta1 = [[Teacher alloc] init];
   [sta1 initialize];
   Student * stb1 = [[Student alloc] init];
   [stb1 initialize];

2.编程实现:在一个视图坐标系中(原点在左上角,原点向右为正x,原点向下为正y,坐标系宽320,高480),创建布置3个矩形对象。第二个和第三个矩形拼接显示的位置,刚好能够完全覆盖第一个矩形。输出这三个矩形的坐标x,坐标y,宽,高,周长,面积。矩形对象不要超出坐标系的范围。需求:

定义矩形类:
实例变量:坐标x、坐标y、宽、高、矩形中心点的坐标centerX、矩形中心点的坐标centerY、面积、周长。
方法:初始化、绘制(输出4个主要数据,面积、周长),计算周长、计算面积。

3.分数计算:任意的两个分数,对这两个分数的进行加、减、乘、除运算,并输出结果, 注:结果区分正负。

需求:任意的两个分数,对这两个分数的进行加、减、乘、除运算,并输出结果,注:结果区分正负。

.h

@property (nonatomic,assign)int numerator;  //分子

@property (nonatomic,assign)int denomiantor;   //分母
- (id)initWithNumeratot:(int)num denomiantor:(int)denom;
- (Fraction *)addFraction:(Fraction *)fraction; //分数 + 分数 返回 分数  add:+
- (Fraction *)subFraction:(Fraction *)fraction; //分数 - 分数    subtract:-
- (Fraction *)mulFraction:(Fraction *)fraction; //分数 * 分数   multiplication:*
- (Fraction *)divFraction:(Fraction *)fraction; //分数 / 分数   division: /

.m

- (id)initWithNumeratot:(int)num denomiantor:(int)denom

{
   self = [super init];
   if (self) {
       _numerator = num;
       _denomiantor = denom;
   }
   return self;
}
- (Fraction *)addFraction:(Fraction *)fraction
{
   int newNum = _numerator*fraction.denomiantor+_denomiantor*fraction.numerator;
       //新的分子=第一个数的分子*第二个数的分母+第二个数的分母*第一个数的分子得到
   int newDenom = self.denomiantor*fraction.denomiantor;
   //新的分母=(self.:调用自己的)自己的分母*第二个数的分母
   Fraction * f = [[Fraction alloc]initWithNumeratot:newNum denomiantor:newDenom];
   return f;
}
- (Fraction *)subFraction:(Fraction *)fraction
{
   int newNum = _numerator*fraction.denomiantor-_denomiantor*fraction.numerator;
   int newDenom = self.denomiantor*fraction.denomiantor;
   Fraction * r = [[Fraction alloc]initWithNumeratot:newNum denomiantor:newDenom];
   return r;
}
- (Fraction *)mulFraction:(Fraction *)fraction
{
   int newNum = _numerator * fraction.numerator;
   int newDenom = self.denomiantor*fraction.denomiantor;
   Fraction * a = [[Fraction alloc]initWithNumeratot:newNum denomiantor:newDenom];
   return a;
}
- (Fraction *)divFraction:(Fraction *)fraction
{
   int newNum = self.numerator*fraction.denomiantor;
   int newDenom = self.denomiantor*fraction.numerator;
   Fraction * c = [[Fraction alloc]initWithNumeratot:newNum denomiantor:newDenom];
   return c;
}
main.m

Fraction * f1 = [[Fraction alloc] initWithNumeratot:1 denomiantor:2];

   Fraction * f2 = [[Fraction alloc] initWithNumeratot:2 denomiantor:3];
   Fraction * f3 = [f1 addFraction:f2];  //第一个对象 + 第二个对象 返回一个对象
   NSLog(@"%d/%d",[f3 numerator],[f3 denomiantor]);
   Fraction * f4 = [f1 subFraction:f2];
   NSLog(@"%d/%d",[f4 numerator],[f4 denomiantor]);
   Fraction * f5 = [f1 mulFraction:f2];
   NSLog(@"%d/%d",[f5 numerator],[f5 denomiantor]);
   Fraction * f6 = [f1 divFraction:f2];
   NSLog(@"%d/%d",[f6 numerator],[f6 denomiantor]);