OC - 第三章 继承、初始化方法、便利构造器

//               第三章 继承、初始化方法、便利构造器

//       一、面向对象的三大特性; 1.封装 2.继承 3.多态

//        1.一个类之中有多个属性、方法, 把这些成员封装在一个类中, 把这个类当做一个整体来用
//        首先,实例变量一定不能被@public修饰,因为一旦被@public修饰,就能在外界通过对象名来访问这个实例变量,随意修改实例变量的值。然后给实例变量提供两种方法来供外界为实例变量赋值和访问,也就是setter和getter方法。

//        2. 继承 将相同的特征和行为写进父类, 子类中只需要写自己独有的特征以及行为, 技能保证子类的完整, 又能简化代码
        //父类和子类只是相对的概念, 继承的上层叫父类, 继承的下层叫子类, 并不是所有的类都有父类, 没有父类的类叫做根类, OC里面的根类是 NSObject
//        1)main 文件
        Person *per1 = [[Person alloc] init];
        [per1 setName:@"沈佳宜"];
        [per1 setGender:@"女"];
        [per1 setAge:18];
        [per1 introduceSelf];

        Student *stu1 = [[Student alloc] init];
        [stu1 setName:@"林允儿"];
        [stu1 setGender:@"女"];
        [stu1 setAge:25];
        //[stu1 setNumber:33];
        //[stu1 setScore:100];
        [stu1 set_number:22];
        [stu1 set_score:100];

//        2).h文件
        //     本类的类名   :  父类的类名
        @interface Person : NSObject
        {
            NSString *_name;
            NSString *_gender;
            NSInteger _age;
        }
//        3).m文件
        //如果对继承父类的方法不满意,可以重写(overwrite)
        -(void)introduceSelf{
            //编译器指令 ,而不是对象 ,super 执行父类中的方法
            [super introduceSelf];
            //   NSLog(@"我叫 %@ %@ ,今年 %ld 岁, 学号 %ld ,成绩 %.1f",_name, _gender, _age, _number, _score);
            NSLog(@"学号 %ld 成绩 %.1f",_number, _score);
        }

        //3.多态:
//        第一种体现 不同对象对同一个消息可以有不同的实现
        [stu1 introduceSelf];

        CollegeStudent *coStu1 = [CollegeStudent alloc];
        [coStu1 setName:@"何以琛"];
        [coStu1 setGender:@"男"];
        [coStu1 setAge:21];
        [coStu1 set_score:90];
        [coStu1 set_number:38];
        [coStu1 setMajor:@"计算机软件"];
        [coStu1 setAcademy:@"计算机学院"];
        [coStu1 introduceSelf];
        CollegeStudent *coStu2  = [CollegeStudent alloc];
        [coStu2 setName:@"赵默笙"];

        //第二种体现  父类指针可以指向子类对象
        //      coStu1 fallInLoveWith:(Person *)
        [coStu1 fallInLoveWith:coStu2];
        Person *per2 = [[CollegeStudent alloc] init];

        //编译时,编译器会将coStu3看做是大学生对象;运行时,coStu3是Person类型的
        //      CollegeStudent *coStu3 = [[Person alloc] init];
        //      [coStu3 fallInLoveWith:per1];


//        二、初始化方法

            //初始化方法在对象的生命周期中只使用一次
            Person *per = [[Person alloc]initWithName:@"TokyoHot" gender:@"unkown" age:10];
            Student *stu = [[Student alloc]initWithName:@"iPindo" gender:@"famale" age:5 number:007 score:100];
            CollegeStudent *col = [[CollegeStudent alloc]initWithName:@"何以琛" gender:@"男" age:21 number:9 score:90 major:@"计算机编程算法" academy:@"计算机"];
            [col introduceSelf];

        //初始化方法的实现
        -(instancetype)initWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age number:(NSInteger)number score:(float)score{
            //对继承值父类的实例变量进行初始化
            self = [super initWithName:name gender:gender age:age];//必须初始化
            //判断如果self不为空,初始化自身的实例变量
            if (self != nil) {
                _number = number;
                _score = score;
            }
            return self;
        }


//        三、便利构造器(工厂方法)

            Person *per = [Person personWithName:@"郭富城" gender:@"男" age:50];
            Student *stu = [Student studentWithName:@"Yoona" gender:@"女" age:25 number:1 score:100];

        //内部实现
        +(instancetype)studentWithName:(NSString *)name gender:(NSString *)gender   age:(NSInteger)age number:(NSInteger)number score:(float)score{
            //在类方法中,代表当前类
            Student *stu = [[Student alloc]initWithName:name gender:gender age:age number:number score:score];
            return stu;
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值