黑马程序员--------OC面向对象的三大特性

本文详细介绍了Objective-C的面向对象三大特性:封装、继承和多态。封装包括成员变量命名规范、set/get方法、类方法及self的使用;继承涉及到方法重写、子类与父类的关系以及super的调用;多态则强调了父类指针指向子类的特性及其优势和局限性。此外,还提到了NSString类在创建字符串中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. ------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! ------- 

    一.oc对象的三大特性

1.封装

(1)成员变量名以下划线_开头,

         好处:1>让成员变量名和get方法区别开

                     2>可以和局部变量名区分开,以下划线“_”开头的一般是成员变量。

(2)set方法:

1>作用:提供一个方法给外界设置成员变量。

2>命名规范:

方法必须以set开头;

set后面跟上成员变量名,首字母是大写;

返回值一定是void;

一定要接受一个参数且参数类型跟成员变量类型一致;

形参名称不能喝成员变量命一样。

(3)get 方法:

1>作用:返回对象内部的成员变量

2>命名规范:

肯定又返回值,返回值类型肯定与成员变量类型一致;

方法名分成员变量名一致;

不需要接受任何参数;

例子:

#import
@interface Student :NSObject
{
 int _age ;
 }
 - (void)setAge: (int)age;//set方法的声明
 - (int)age;//get方法的的声明
 @end
 @implementation Student
 - (void)setAge: (int)age//set方法的实现
 {
  if(age<=0)
  {
   age = 1;
  }
  _age = age;
 }
 - (int)age//get方法的实现
 {
  return _age = age;
 }

(4)类方法

1>类方法以“+”开头;

2>只能由类名来调用;

3>类方法不能访问成员变量(实例变量)

4>可以允许类方法和对象方法同名

类方法好处:

                  不依赖与对象,执行效率高 ;

                    能用类方法尽量用类方法;

                    当方法内部不需要使用成员变量时用类方法。

例子:

#import<Foundation/Foundation>
@interface Student :NSObject

 + (void)test;//类方法的声明
 
 @end
 @implementation Student
 
 + (void)test
 {
  NSLog(@"调用了test方法"); //类方法的实现
 }
 @end
 int main()
 {
  [student test] ;//调用类方法
  return 0;
 }

(5)self:

1>指针,指向方法调用者。

2>可以用“self ->成员变量名”来访问成员变量;

3>self出现在对象方法中self就代表对象方法,出现在类方法中就代表类

例子:

#import
@interface Student :NSObject
 + (void)test;
  + (void)test2;
 - (void)test;
 - (void)test2;
 @end
 @implementation Student
 
 + (void)test
 {
  [self test2 ] //调用类方法“ + (void)test2”
  NSLog(@"调用了+test方法");  //类方法
 }
 + (void)test2
 {
  
  NSLog(@"调用了+test2方法");  //类方法
 }
 - (void)test
 {
 
 
     [self test2]//调用对象方法“- (void)test2”
  NSLog(@"调用了—test方法")//对象放啊
 }
 - (void)test2
 {
 
  NSLog(@"调用了—test2方法")//对象放啊
 }
 @end
 int main()
 {
  Student *s = [Student new];
  [student test] ;//调用了类方法
  [s test];//调用了对象方法
  return 0;
 }

2.(1)继承

1>“:"是继承的意思

2>重写:子类重新实现父类的某个方法,覆盖父类当前的做法。

3>注意

父类必须生命在子类前面;

子类不能拥有和父类同样名称的成员变量;

调用某个对象方法时优先在子类中寻找,如果找不到再去父类中寻找。

4>集成的好处:

抽取重复代码;

建立子类之间的关系;

子类可以拥有父类中所有的成员变量和方法。

5>坏处:耦合性太强。

6>使用场合

当两个子类拥有相同属性和方法的时候就可以将相同的东西抽取到一个父类中去;

当A类拥有B类中的部分属性和方法时,可以考虑B继承A.

例子:

#import
@interface Animal : NSObject//生命动物的属性和方法
{
 int _age;
 double _wheighe;
}
- (void)setAge:(int)age
- (int)age;
- (void)setWheiget:(double)wheight;
- (double)wheight;
@end
@implementation Animal//动物set和get方法的实现
- (void)setAge:(int)age
{
 _age = age;
}
- (int)age
{
 return _age
}
- (void)setWheiget:(double)wheight
{
 _wheight = wheight;
}
- (double)wheight
{
 return _wheight;
}
@end
@interface Dog :Animal//狗继承了动物的属性
@end
@implementation Dog
@end
int main()
{
 Dog *d = [dog new];//创建狗对象,
 [d setAge:10]//用狗对象调用动物的set方法。
return 0;
}

(2)组合:XX拥有了XX     A*_a;

例子:

#import<Foundation/Founfation.h>
@interface Person : NSObjct
{
 int _age;
 double _wheight;
 Dog *_dog;//人拥有了了够的属性  组合
}
- (void)setAge:(int)age;
- (int)age;
- (void)setWheight(double)wheight;
- (double)wheight;
@end
@implementation Person
- (void)setAge:(int)age
{
 _age = age;
}
- (int)age
{
   return _age = age;
}
- (void)setWheight(double)wheight
{
  _wheight = wheight;
}
- (double)wheight
{
 return _wheight;
}
@interface Dog : NSObject
{
 double _wheight;
}
- (void)setWheight;
- (double)wheight;
- (void)bar;
@end
@implementation Dog
- (void)setWheight
{
 _wheight = wheight;
}
- (double)wheight
{
 return _wheight;
}
- (void)bar
{
 NSLog(@"体重为%f的狗汪汪",[d wheight])
}
@end
int main()
{
 Person *p = [Person new];
 Dog *d = [Dog new];
 [d setWheight:20];
 Dog *_dog = d;
 return 0;
}

(3)super:

1>直接调用父类中的某个方法;

2>如果super处在对象方法中那就调用父类的对象方法;

3>如果苏super处在类方法中那就调用父类类方法;

4>使用场合为子类重写父类方法,此昂保留父类的一些行为;

3.多态

1>多态:父类指针指向子类,没有父类就没有多态

2>代码的体现:父类类型的指针指向子类对象;

3>好处:如果函数\方法参数中使用父类类型可以传入父类、子类对象。

4>局限性: 父类类型的指针变量不能直接调用子类特有方法,必须强转为子类才能使用。

例子:

#import
@interface Person : NSObjct
{
 int _age;
 double _wheight;
}
- (void)setAge:(int)age;
- (int)age;
- (void)setWheight(int)wheight;
- (double)wheight;
- (void)study;
@end
@implementation Person
- (void)setAge:(int)age
{
 _age = age;
}
- (int)age
{
 return _age;
}
- (void)setWheight:(double)wheight
{
   _wheight = wheight;
}
- (double)wheight
{
 return _wheight;
}
- (void)study
{
 NSLog(@"年龄为%d岁体重为%f的人在学习"[s age]),[s wheight])
}
@interface Student : Person
- (void)study;
@end
@implementation Student
- (void)study
{
  NSLog(@"年龄为%d岁体重为%f的学生在学习"[s age]),[s wheight])
 
}
@end
int main()
{
 Person *p = [Student new];// 多态 ;用父类指针指向子类变量
 [p study]
 return 0;
}

4.NSString :字符串类

最简单的创建字符串的方式

NSString *str = @"itcast";
例子:
#import<Foundation/Foundation.h>
int main()
{
 int age = 15;
 int no = 10;
 NSString *name = @"jack";
//创建字符串的另一种方法     stringWithFormat 是NSString 的一个类方法
 NSString *str = [NSString stringWithFormat:@"my name is %@ and my age is %d and my no is %d"];
 NSLog(@"%@" , str);
 return 0;
}

 输出结果是 :my neme is jack and my age is 15 and my no is 10.

 

 

 

 

                   

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值