oc语言学习之基础知识点介绍(三):类方法、封装以及继承的介绍
一、类方法的使用
/*
像我们之前学的方法,必须先实例化这个类的对象才能调用这个方法,类方法不用实例化对象,直接调用这个方法。 之前学的方法调用的语法:
[对象名 方法名]; //对象方法 类方法:
[类名 方法名]; //类方法 定义:
语法:+(返回值类型)方法名:参数列表; 注意:
1.类方法不能直接访问成员变量。
2.类方法里面可以调用其他的类方法,但不能直接调用对象方法。
3.对象方法里面可以调用类方法。
4.类方法可以和对象方法同名,互不影响。因为类方法用类名调用,对象方法用对象名调用。
5.类方法和实例方法一样在@interface里声明,在@implementation里实现。
6.类方法只能由类名来调用,不能用对象来调用。对象方法只能由对象调用,不能用类名调用.
7.两个类方法之间不要直接相互调用否则死循环。
*/ #import <Foundation/Foundation.h>
@interface Test1: NSObject
/**
*对象方法
*/
-(void)NSLog1:(NSString *) str;
/**
*类方法
*/
+(void)NSLog1:(NSString *) str;
@end @implementation Test1 -(void)NSLog1:(NSString *)str{
//返回str的值
return str;
} +(void)NSLog1:(NSString *)str{
//返回str的值
return str;
} @end int main(int argc, const char * argv[]) {
@autoreleasepool {
// Test1*clt = [Test1new];
//
// NSString *str= [clt addNum1:@"哈哈哈";
//
// NSLog(@"str=%@",str); NSString *str= [clt addNum1:@"哈哈哈"; NSLog(@"str=%@",str);
}
return ;
}
二、匿名对象
/*
匿名对象:
就是没有任何的指针指向的对象就叫匿名对象 。
匿名对象的缺点:
只能用一次 。
优点:
方便作为参数传递。
*/
#import <Foundation/Foundation.h>
@interface Person : NSObject{
@public
NSString *_name;
int _age;
}
-(void)sayHi;
@end @implementation Person
-(void)sayHi{
NSLog(@"你好,我叫%@ 今年%d岁",_name,_age);
}
@end int main(int argc, const char * argv[]) {
@autoreleasepool {
// Person *p =[Person new];//这个并不是匿名对象
// p->_name = @"哈哈";
// [p sayHi];
// [Person new];//这个就是匿名对象 [Person new]->_age =; //这是匿名对象的成员赋值
[Person new]->_name = @"周帅帅"; //这是匿名对象的成员赋值
[[Person new] sayHi]; //这是匿名对象调用方法
}
return ;
}
三、封装
/*
封装实现步骤:
1.@public去掉,默认是@protected。
2.写一个方法用来给属性赋值的,还要写一个方法用来给属性取值。
3.在赋值方法里面做过滤。
4.使用的时候直接调用方法就可以了。 封装的好处:
可以控制是否只读,或者只写。
只封装读的方法,那么就是只读,如果只封装赋值,那么就是只写。
如果两个都封装就是可读可写。 setter:赋值器:
其实就是你封装的给某个属性赋值的方法,就叫setter方法。
例:-(void)setName:(NSString *)name; //这就是一个setter方法
规范:
1.方法名以set开头,后面接不要_的属性名,并且首字母大写
2.必须有参数,参数的类型跟你要封装的属性类型一致,形参名字可以随便取,但是一般的做法都是不要下划线的属性。
3.返回值一定是void。
4.形参名不能和成员变量名(属性名)一样(苹果官方推荐成员变量名前加_以示区分)。
所以之前为什么要给属性名加_呢?就是为了和setter方法的形参名区分开来。 getter:取值器
其实就是你封装的给某个属性取值的方法,就叫getter方法。
例:-(NSString *)name; //这就是一个getter方法。
规范:
1.方法名就是去掉下划线的属性名。
2.必须有返回值,并且返回值类型与要封装的属性类型一致。
3.没有参数。
*/
@interface Person : NSObject{
NSString *_name;
int _age;
BOOL _gender;
} /**
* 给name赋值的方法
* 需要一个参数,因为你要给我传值,我才能对属性赋值
* 但是参数什么类型呢?根据你要赋值的属性的类型确定
* 比如说要给_name赋值,那么很明显就需要传入一个跟_name同类型的数据
*/
-(void)setName:(NSString *)name; /**
* 取_name值的方法
* 需要一个返回值,因为你需要把值交给别人取值,所以就需要返回值了
* 但是返回值类型呢?那肯定是跟你需要取值的属性的类型一致
*/ -(NSString *)name;
/**
* 给_age赋值的方法
*/
-(void)setAge:(int)age;
/**
* 给_age取值的方法
*/
-(int)age;
-(BOOL)gender;
@end @implementation Person -(BOOL)gender{
return _gender;
} -(void)setName:(NSString *)name{
if([name isEqualTo:@"你麻痹"]){
_name = @"无名氏";
}else{
//给属性赋值为你传进来的参数
_name = name;
}
} -(NSString *)name{
//返回这个属性
return _name;
} /**
* 千万要记得,age是传进来的形参名,_age才是属性
*/
-(void)setAge:(int)age{
if(age< || age>){
//如果传进来的值不合法,就给_age属性赋值为默认的16
_age = ;
}else{
//如果合法,我就用你传进来的值
_age = age;
}
} -(int)age{
return _age;
}
@end /*
重载:就是允许方法同名,但是参数不同。
oc中的方法 没有重载这个概念。 oc中 : 也是方法名的一部分。
*/ /*
oc中 static 关键字:
1.修饰局部变量,把这个局部变量变为静态变量。 静态变量程序一启动就加载,程序退出才会回收。 2.修饰全局变量,代表这个全局变量只能在本模块中访问。 3.修饰函数,代表这个函数只能在本模块中调用。 4.不能修饰成员变量(属性) 5.不能修饰方法
*/
四、继承
/* 继承:简单来说,就是一个类B能够拥有类A的全部属性和方法,并且还有自己一些独有的属性或者方法,这可以称之为继承
类B继承自类A
在定义类的时候 在后面写一个 : 类名
例如:
@interface Person : NSObject{ }
@end
类方法调用:
[类名 方法名];
再次注意:OC中类B继承自类A,那么类B会拥有类A的所有属性和方法 再次强调继承的语法:
在声明类的时候在类名后面 加一个 : 然后写一个 要继承的类名 继承虽然说语法上允许你继承自任何类 但是,一定要符合客观事实(基本要符合 is a原则)
student is a person
某个类一定要属于某个类
比如说:学生是个人
注意:以下语法上完全没问题,但是不符合现实,强烈不允许这样做
@interface Dog : Person @end 比如说:狗不能继承自人类,因为狗不是人 @interface Dog : Animal @end 这样就可以,因为狗是动物 父类:被继承的那个类就叫父类。 子类:继承的那个类就叫子类。 基类:父类也叫基类,只不过很多书以及很多说法,说基类就是NSObject。
以后说基类,一般就指NSObject。 根类:NSObject 继承的特点:
1.子类可以拥有父类所有的属性和方法(包括父类私有的)。
2.如果有一个子类B继承自己类A,然后类B又有一个子类C,那么这个子类C也会有类A的所有属性和方法;类具有传递性。
3.类不可以继承自多个类!类的单根性:就是只能有一个根。
4.一个类能被多个类继承。例如:Person可以被student继承,也可以被teacher继承。
5.类的继承要合理:引用一句话:“人是人他妈生的,妖是妖他妈生的”。
*/ #import <Foundation/Foundation.h> @interface Person : NSObject{ @public
NSString *_name;
int _age;
} -(void)sayHi; @end @implementation Person -(void)sayHi{ NSLog(@"hello,eat no?");
} @end @interface Student : Person @end @implementation Student @end int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [Person new];
[p sayHi];
[Person alloc];
Student *s = [Student new];
s->_name = @"刘晓晓";
NSLog(@"%@",s->_name);
[s sayHi];
}
return ;
}
oc语言学习之基础知识点介绍(三):类方法、封装以及继承的介绍的更多相关文章
- oc语言学习之基础知识点介绍(四):方法的重写、多态以及self、super的介绍
一.方法重写 /* 重写:当子类继承了父类的方法时,如果觉得父类的方法不适合,那么可以对这个方法进行重新实现,那么这个就重写. 注意:也就是说,一定只能发生在父类和子类关系中. 然后是子类重新实现父类 ...
- oc语言学习之基础知识点介绍(二):类和对象的进一步介绍
一.类.对象在内存中的存储 /* 内存分区: 栈:局部变量 堆:程序员自己写代码申请开辟的 程序员自己维护,编译器现在帮我们自动优化了,它在合适的给我们加上了释放空间的语句,所以我们现在写的对象不会造 ...
- oc语言学习之基础知识点介绍(五):OC进阶
一.点语法介绍 /* 以前封装后,要给属性赋值,必须调用方法 这样做,有两个缺点: 1.代码量多,调用方法要写的东西多. 2.看起来并不像是给属性赋值,也不像取值. 我们用点语法就可以更好的解决! 点 ...
- oc语言学习之基础知识点介绍(一):OC介绍
一.第一个OC程序 #import <Foundation/Foundation.h> //导入头文件 int main(int argc, const char * argv[]) ...
- c语言学习之基础知识点介绍(三):scanf函数
本节继续介绍c语言的基础知识点. scanf函数:用来接收用户输入的数据. 语法:scanf("格式化控制符",地址列表); 取地址要用到取地址符:&(shift+7) 例 ...
- c语言学习之基础知识点介绍(二):格式化控制符和变量的补充
上节简单介绍了c语言中的一些基础知识点,本节将对之前介绍的不够详细的知识点进行补充. 格式化控制符的消息介绍: %d的其他控制符: 1.%md:m代表这个整数位占用多少位,m是一个整数.实际数字不足的 ...
- c语言学习之基础知识点介绍(七):循环结构
本节主要介绍循环结构 一.while循环 /* 语法: while(表达式){ //循环体; } 注意:循环变量.循环条件和循环控制语句三者缺一不可. 例如: */ ; //循环变量 ){ //循环条 ...
- c语言学习之基础知识点介绍(十四):指针的进阶
一.指针的加.减法运算 /* 1.加法运算 1).可以跟整数进行加法运算,得到的还是一个地址 公式: 地址 + 1 = 地址 + 1 * 类型所占的字节数 地址 + n = 地址 + n * 类型所占 ...
- c语言学习之基础知识点介绍(十一):字符串的介绍、使用
本节主要介绍c语言中的字符串的应用. 一:字符串介绍 因为c语言中没有像Java.C#那样的字符串类型,所以无法直接用字符串.需要借助数组来解决这个问题. /* 定义:把多个字符连在一起就叫字符串.但 ...
随机推荐
- CodeForces 696A(Lorenzo Von Matterhorn ) & CodeForces 696B(Puzzles )
A,给一棵完全二叉树,第一个操作,给两个点,两点路径上的所有边权值都增加w,第二个操作,给两个点,求两点路径上的所有边权值和. 我看一眼题就觉得是树链剖分,而我又不会树链剖分,扔掉. 后来查了题解,首 ...
- Java 8 开发顶级技巧
本文由码农网 – 小峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! 我使用Java 8编码已经有些年头,既用于新的应用程序,也用来迁移现有的应用,感觉是时候写一些我发现的非常有用的 ...
- JQuery事件处理的注意事项
1.jQuery 名称冲突 jQuery 使用 $ 符号作为 jQuery 的简介方式. 某些其他 JavaScript 库中的函数(比如 Prototype)同样使用 $ 符号. jQuery 使用 ...
- 低级错误之Hbm中类型不一致错误
Myeclipse将数据库中的长整形生成为Bigdecimal类型,实际应该生成为Long.导致保存的时候报错.
- 发布maven的web项目,tomcat显示已启动,但是访问出错
sts中如果是maven的web工程,一定要先进行maven install,再发布工程,否则不会出任何错误,tomcat还访问不了
- Python用特殊符号切割字符串并生成list(简单)
采用re模块,可以指定字符进行切割,例如切割IP地址: import socket import re localIP = socket.gethostbyname(socket.gethostnam ...
- (Map)利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该 年没有举办世界杯,则输出:没有举办世界杯。 附:世界杯冠军以及对应的夺冠年份,请参考本章附录。 附录 (Map)在原有世界杯Map 的基础上,增加如下功能: 读入一支球队的名字,输出该球队夺冠的年份列表。 例如,读入“巴西”,应当输出 1958 1962 1970 1
package homework001; import java.util.HashMap; import java.util.Scanner; public class Map { public s ...
- linq to sql 扩展方法
老赵的博客:http://blog.zhaojie.me/2008/02/using-translate-method-and-modify-command-text-before-query-in- ...
- js 如何将无限级分类展示出来
这个需要运用递归. 案例:将数据以 ul li ul li形式展现在div中. <div id="div"></div> 数据格式为json: var da ...
- 今天升级了ADT到ADT 22.6.1,打包混淆的时候就出现了问题
Proguard returned with error code 1. See console Error: Unable to access jarfile ..\lib\proguard.jar ...