为什么Java中类的成员变量不能被重写?
来源:互联网 发布:淘宝店铺上传图片 编辑:程序博客网 时间:2024/05/01 22:26
这篇文章讨论了Java面向对象概念中一个基本的概念--Field Hiding(成员变量隐藏)
成员变量在Java中能够被重写么?
Let’s first take a look at the following example which creates two Sub objects. One is
assigned to a Sub reference, the other is assigned to a Super reference.
我们看下面这个例子,我们创建了两个子对象,一个使用的是子对象的引用,一个使用的是父对象的引用。
public class FieldOverriding { public static void main(String[] args) { Sub c1 = new Sub(); Super c2 = new Sub(); System.out.println(c1.s); System.out.println(c2.s); }}class Super { String s = "Super";}class Sub extends Super { String s = "Sub";}
程序的输出结果是:
按照我们已有的多态的概念,第二个应该是输出sub才对,但却输出了super。这是为什么呢?
不会重写成员变量,而是隐藏成员变量
Java文档中对隐藏域的定义:
Within a class, a field that has the same name as a field in the superclass hides the superclass’s field, even if their types are different. Within the subclass, the field in the superclass cannot be referenced by its simple name. Instead, the field must be accessed through super. Generally speaking, we don’t recommend hiding fields as it makes code difficult to read.
意思就是:
在一个类中,子类中的成员变量如果和父类中的成员变量同名,那么即使他们类型不一样,只要名字一样。父类中的成员变量都会被隐藏。在子类中,父类的成员变量不能被简单的用引用来访问。而是,必须从父类的引用获得父类被隐藏的成员变量,一般来说,我们不推荐隐藏成员变量,因为这样会使代码变得难以阅读。
其实,简单来说,就是子类不会去重写覆盖父类的成员变量,所以成员变量的访问不能像方法一样使用多态去访问。
访问隐藏域的方法
就是使用父类的引用类型,那么就可以访问到隐藏域,就像我们例子中的代码
就是使用类型转换
System.out.println(((Super)c1).s);
翻译自http://www.programcreek.com/simple-java/
作者:六尺帐篷
链接:http://www.jianshu.com/p/4997c338d60e
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- 为什么Java中类的成员变量不能被重写?
- Java中为什么字段不能被重写
- Java中为什么字段不能被重写
- C++定义类时,为什么不能在类中声明自身类型的成员变量?
- 关于为什么类的静态成员变量不能立即初始化
- 关于为什么类的静态成员变量不能立即初始化
- 关于为什么类的静态成员变量不能立即初始化 .
- 关于为什么类的静态成员变量不能立即初始化
- 关于C++ 类数据成员初始化的一点总结【为什么类定义中不能初始化成员变量】
- JAVA在类继承中类成员变量“重写”的问题
- Java中为什么静态方法不能被重写?为什么静态方法不能隐藏实例方法?
- Java 理解 子类成员变量与父类成员变量同名 方法的重写
- java静态方法的重写,为什么不能?
- java中成员变量为什么需要初始化
- 含有string成员的结构体变量,为什么不能初始化?
- 为什么java中子类重写父类的方法时声明抛出异常不能比父类范围大
- java中静态(static)的方法为什么不能重写(override)
- java中静态(static)的方法为什么不能重写(override)
- HDPCD-Java-复习笔记(7)- lab
- 取消cp别名'cp -i'(unalias)
- 数据库索引的一些优缺点以及索引的创建
- 关于知识管理的思考
- 【bzoj 3378】MooFest 狂欢节(树状数组)
- 为什么Java中类的成员变量不能被重写?
- Android静态代码检查工具Lint
- 理解MySQL——索引与优化
- 算数运算符和算术表达式
- 程序底层查看工具之dumpbin
- Codeforces Round #336 (Div. 2)-C Chain Reaction(二分+DP)
- Arduino的toInt()注意事项
- win系统删除,已经注册的服务
- 文本挖掘的分词原理