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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

继承中,父类函数用final修饰后,子类就无法重写了,但是父类成员变量用final修饰后,子类中还可以定义重名函数,这样不就起不到final的作用了吗?
  1. class A
  2. {
  3. final int num;
  4. }
  5. class B extends A
  6. {
  7. int num;
  8. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 淡定

查看全部评分

16 个回复

倒序浏览
好像没有这么使用的。。。。局部变量将父类的成员变量隐藏了。。。
回复 使用道具 举报
俩个num的作用域不一样啊~~~子类有自己的num就不管父类有没有了~
回复 使用道具 举报
就近原则,子类先在自己中找变量,没有才去父类找吧
回复 使用道具 举报
我的意思是为什么final修饰函数后就不可以被重写,而l修饰成员变量后,就可以被“重写“
回复 使用道具 举报
他并没有改变父类的num啊,父类有自己的成员变量,子类也有自己的成员变量。
父类的是final的,子类的不是,只是他们的名字一样而已。。
回复 使用道具 举报
这个问题值得思考,我再去看看视频
回复 使用道具 举报
这个不叫做覆盖,两个所在的区域也不同
父类也就是A,这个变量被final修饰,为全局常量,存储在常量池
而子类B虽然继承了父类A,但是并不是覆盖了父类的常量,仅仅是给自己定义了一个变量
而为局部变量,存储在栈内存中。
所以你想,他们是什么关系呢?

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
wtjohn 中级黑马 2014-11-28 16:43:39
9#
雨过山更翠 发表于 2014-11-27 20:13
我的意思是为什么final修饰函数后就不可以被重写,而l修饰成员变量后,就可以被“重写“ ...

因为并不是真正的重写,而是在子类中重新定义了一个相同名称的变量。而你调用的时候,就近原则,直接调用了子类中的重名变量。
回复 使用道具 举报
wtjohn 发表于 2014-11-28 16:43
因为并不是真正的重写,而是在子类中重新定义了一个相同名称的变量。而你调用的时候,就近原则,直接调用 ...

这个我理解,我网上查了查,自己有些糊涂了
回复 使用道具 举报
final修饰的成员变量对变量存储位置不会有任何影响= =还存储在堆内存中
父类对象中的num只能被赋值一次,可这不影响子类对象中的num啊= =爱创建就创建,爱赋值就赋值呗
final修饰的方法不能被复写这可能起初就定义的关键字效果吧,这个效果只作用于方法

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
谢谢大家的解答,但我还有有些想不通,我是初学者,慢慢学吧
回复 使用道具 举报
此时,这两个方法已经不是同一个方法了~~亲
回复 使用道具 举报
我觉得这个不能叫重写(覆盖),用我的理解就是:父类中的NUM子类根本就没去管他,实际定义的还是本类中的num。
回复 使用道具 举报
娱尘 中级黑马 2014-11-28 22:58:38
15#
变量没有重写这个概念,你这问题其实是局部变量跟成员变量的问题,遵循就近原则
回复 使用道具 举报
娱尘 中级黑马 2014-11-28 23:01:10
16#
变量没有重写这个概念,你这问题其实是局部变量跟成员变量的问题,遵循就近原则
回复 使用道具 举报
娱尘 中级黑马 2014-11-28 23:07:46
17#
变量没有重写这个概念,你这问题其实是局部变量跟成员变量的问题,遵循就近原则
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马