Java中为什么字段不能被重写?
1>.先看一个例子:新建两个Sub对象,一个指向Sub类型的引用,一个指向 Super类型的引用
输出结果:
思考:我们创建了两个Sub对象,但是为什么第二个对象打印出来的结果是"Super"呢?
隐藏字段代替了重写
在java官方提供的tutorial有一段关于隐藏字段的明确定义:
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.
(在一个类中,与父类中的字段具有相同名称的字段会隐藏父类的字段,即使它们的类型不同;在子类中,父类中的字段是不能用简单的名称引用.相反,该字段必须通过super访问.一般来说,我们不建议隐藏字段,因为它使代码难以读取)
从上面这段解释中,我们可以看出成员变量不能像方法一样被重写.当一个子类中定义了一个跟父类中相同名字的字段,子类中就是定义了一个新的字段.父类中的字段是被隐藏了,它没有被覆盖,所以它不能被多态地访问,只能通过一些特殊的手段来访问;
如何访问隐藏字段?
①.采用父类的引用类型,这样隐藏的字段就能被访问了,像上面所给出的例子一样;
②.将子类强制类型转化为父类类型,也能访问到隐藏的字段;
总结
这个主要涉及到java里面一个字段隐藏
的概念,父类和子类定义了一个同名的字段,不会报错.但对于同一个对象(实例),用父类的引用去取值(字段),会取到父类字段的值;用子类的引用去取值(字段),则取到子类字段的值.
在实际的开发中,要尽量避免子类和父类使用相同的字段名,否则很容易引入一些不容易发现的bug;