A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© gaoxinglei123 中级黑马   /  2014-4-27 20:22  /  1304 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 gaoxinglei123 于 2014-4-30 11:24 编辑

Student类继承于Person类 Person类中有成员变量int _height。当_height为@private时 那么Student类实例化的对象中存在不存在_height属性?如果存在,既然不能访问 存在的意义是什么? 或者说子类是怎么继承父类的。。既然继承了。难道成员变量 不应该就属于student本身了么。。各种疑惑 求解释。

评分

参与人数 1技术分 +1 收起 理由
脸皮猴 + 1

查看全部评分

8 个回复

倒序浏览
帮忙顶一下,我有所猜测但是不敢瞎说。还是等高手来解答吧。 到时候我也看看。
回复 使用道具 举报
一般成员变量分为@protected格式@public格式和@private格式。
默认的是@protected,所以在定义成员变量的时候,@protected可以不用输入。
这种格式的成员变量是可以让子类来继承的。

至于楼主说的@private ,属于私有,只有自己这个类有,子类是继承不到的。要是问@private是干什么用的?我的理解是,可能有些东西,父类拥有,但是子类未必有,诸如动物这个类可以是 人类的父类,但是动物中的 爪子,翅膀,尾巴这些可能就是动物独有的,不需要人来继承,就变成了@private。
这只是我的理解,供参考

评分

参与人数 1技术分 +1 收起 理由
脸皮猴 + 1

查看全部评分

回复 使用道具 举报
1、@private 只能在类内部访问(@implementation中默认是@private)
2、Student继承于Person类,那么Student类实例化的对象中存在 _height 属性
3、但由于@private,Student类实例化的对象不能访问 _height 属性

评分

参与人数 1黑马币 +3 收起 理由
脸皮猴 + 3

查看全部评分

回复 使用道具 举报
既然继承了父类,也就相当于获得了这些方法属性,但只是指向这个父类的属性,并不是student类中会生成父类的方法属性,子类和父类是不能拥有相同的成员变量的,@private 把_height变成私有的,那么她只能被person类使用,如果父类中只有部分成员属性符合,可以把这部分抽出来作为新的父类,才疏学浅,虽然不一定能解决你的疑惑,希望可以给你一点帮助,如果我理解有误,也欢迎大神指教,共同进步
回复 使用道具 举报
其实这就像像一个家,家是你和你父亲共有,但是对于你爸的屋子确实独有的,不知道这么比喻能解释清吗?
回复 使用道具 举报
我可以肯定的回答您,这个父类用@private修饰的成员变量,子类的实例对象中肯定还是有这个成员变量的。只是子类的实例对象不能直接访问这个成员变量儿子,而是需要通过get和set方法访问。{:3_54:}
回复 使用道具 举报
OC中,类的实例化变量的范围有@private、@protected、@public三种。
@private:作用范围只能在自身类。
@protected:作用范围在自身类和继承自己的子类,默认是此属性,可以不用写出来。
@public: 作用范围最大,在任何地方。
当类有一些比较重要的属性时,不能随便更改的时候,可以用private,这样避免其他继承类修改此属性。
回复 使用道具 举报
当_height为@private时 那么Student类实例化的对象中存在不存在_height属性?如果存在,既然不能访问 存在的意义是什么? 或者说子类是怎么继承父类的。。既然继承了。难道成员变量 不应该就属于student本身了么。。

觉得吧,有些东西是只能父类有的。在父类的方法中计算,防止子类误操作。
比如。Person有name这个私有属性,然后有一个getName方法,但是,没有setName方法。或者serName方法是私有的,子类继承不到。那么,子类可以调用gerName方法来知道name的值,但不能修改。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马