OC课程笔记总结6-核心语法1:成员变量的作用域范围相关

课程:核心语法


点语法:

OC中实现点语法是为了让其他语言的编程人员更快适应OC的语法。点语法相当于->,在oc中点语法类似于java,但实质不同,在OC中如果使用点语法,实际编译时编译器会将点语法转为OC自己的括号和箭头语法来进行编译。

而在java中使用点语法是可以真正访问到成员变量的,oc中只是转换为另一种来表示。oc中要访问成员变量只有唯一的一种方式:->  使用箭头。

在OC中使用点语法需要注意是否会造成死循环。要记点语法只是进行代码转换而已,并没有实际的操作。


成员变量的作用域:

每个变量都有自己的作用域,局部或者全局,成员变量也是变量,成员变量也有自己的作用域。

成员变量一共有4种作用域,成员变量在。h文件中声明。作用域即在什么范围内可以直接进行访问。

直接访问的意思是指通过变量名即可访问,不能够直接访问则必须通过相应的方法进行 访问。访问修改或获得变量的值。

对于变量,要么是进行设置值的操作(改变变量的值),要么是获取变量的值(访问变量的值)。在编程中只能对变量进行两种操作。

对变量的访问有两种途径:一是直接通过变量名访问,称为直接访问,二是通过对象方法来访问,这是间接访问。


成员变量的4中作用域范围有4个关键字确定:

@public //任意范围都可以直接访问,访问即修改或者获取这个成员变量的值。


@protect //默认就是protect,只能是本类对象以及子类对象可以访问,即本类以及子类对象都有这种(不是同一个)成员变量,并且都可以对自己的成员变量进行修改,

那么通过子类对象调用set方法可以直接修改父类对象的成员变量值吗??????????????在OC中是否有super???????????????? 

在oc中,super表示指向父类方法,不能够直接指向父类成员变量?????

要获得指向父类的成员变量,还是必须通过父类对象调用自己的get 方法获得父类中相应的成员变量,这时候如果是子类对象调用自己的set方法,

而参数是父类的成员变量,能否对父类对象的成员变量进行set操作呢?????

答:不能,因为在定义的set方法中,改变的成员变量属性默认是self,只不过省略不写,和java中类似,默认是this。self表示谁调用,就指向谁。

[son setV[father getV]];对于protect变量V来说,son和father中都有这一属性,father通过getV来获得V变量并且传给了由son调用的setV方法,但是在son 的这个setV方法中,是把传入的参数的值传给了son的V属性,

但是如果是传入地址的话?????意义不大。


@private //只能是本类对象的对象方法访问,类方法如果没有实例对象也不能访问。


@package //较少用。



对@private 和 @protect的详细说明:

首先,private和prtect都是用来修饰成员变量的,即对象属性的,每个对象都会获得所继承的父类中的一切成员变量(属性),不论是父类中的private和protect以及其他2种属性,只要子类

继承了这个父类,一切父类的属性都会存在于子类对象的内存空间中。当然在子类的定义中,也可以定义一些父类中所没有,属于子类特有的属性。而对于private和protect修饰的属性的区别则在于:如果属性是protect属性,即默认属性,那么子类中对于这个属性的访问可以可以直接访问,即使用变量名直接访问,也可以通过从父类中继承的set和get 方法来进行访问,还可以不用从父类继承得来的方法,

而是在子类中自己定义其他的方法来对这个protect属性进行访问;而对于private修饰的属性,不能够直接访问,只能够通过从父类中所继承的set和get方法来对这个属性进行访问,并且在子类中重新定义的其他方法是无法

对从父类继承而来的private属性进行访问的。要想在访问子类对象中所继承的父类的private属性,只能是通过从父类继承而来的set和get 方法。

private和protect的相同点是:被两个关键字修饰的属性,都不能够直接访问(直接访问即指通过属性名直接访问,而不用通过方法访问,只有public属性可以直接访问),都必须通过方法访问(而在父类以及子类的对象方法中,可以通过变量名直接访问,只是在对象方法区域中成立,而在其他区域,例如main函数区域中,是不成立,即不能直接通过变量名访问的),不同的是protect既可以通过父类的方法访问,也可以通过子类自己的方法访问,而private只能通过父类的方法访问。


注意:调用对象方法必须是由对象调用,而只要继承了父类,就可以获得父类的一切,包括所有属性和所有方法。既然有了父类的方法,就可以对private变量进行操作了,也可以通过super关键字来调用父类的方法。

而在子类中可以定义和父类一样的方法,方法名和参数名和返回值类型一致但是功能不一致,在调用时,调用的是子类的方法,而不是父类的方法。

子类对象如何调用父类的同名方法呢???????????????


@public:在任何地方都能直接诶访问对象的成员变量

@private:只能在当前类的对象方法中直接访问

@protect:可以在当前类及其子类的对象方法中直接访问  (默认)

@package:只要是在同一个框架中,就能直接访问对象的成员变量。


这。m实现文件中也可以声明成员变量,默认这个变量的就是private,因为。m文件不会被包含在其他文件中(重复定义,产生冲突错误。),既然。m文件不会被包含,那么在。m中声明的变量

也不会被其他文件所引用,自然就是。m文件所私有的,同样,在。m文件中声明的变量名不能和。h中声明的变量名相同,因为。m文件中会包括。h文件,因此也会产生冲突。但是不论是在哪里声明的父类的成员变量,不管

任何修饰,只要子类继承了这个父类,子类一定会继承这个父类的所有的一切,只要是在父类中声明了的,子类都有.

对于变量而言,不同的作用域相当于可见范围,只有可见的变量才是可操作的.


OC中是单继承。c++是多继承,对于多继承而言,问题之一在于继承的父类中,如果在不同的父类里有着相同的属性或者方法,编译器无法判断是使用哪一个父类中的属性或方法。

如果只有implementation而没有interface,也可以定义一个类并正常使用,但是不建议这么写。


































































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值