为什么Java中类的成员变量不能被重写?
2017-10-12 23:53
281 查看
这篇文章讨论了Java面向对象概念中一个基本的概念--Field Hiding(成员变量隐藏)
assigned to a Sub reference, the other is assigned to a Super reference.
我们看下面这个例子,我们创建了两个子对象,一个使用的是子对象的引用,一个使用的是父对象的引用。
程序的输出结果是:
Paste_Image.png
按照我们已有的多态的概念,第二个应该是输出sub才对,但却输出了super。这是为什么呢?
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.
意思就是:
在一个类中,子类中的成员变量如果和父类中的成员变量同名,那么即使他们类型不一样,只要名字一样。父类中的成员变量都会被隐藏。在子类中,父类的成员变量不能被简单的用引用来访问。而是,必须从父类的引用获得父类被隐藏的成员变量,一般来说,我们不推荐隐藏成员变量,因为这样会使代码变得难以阅读。
其实,简单来说,就是子类不会去重写覆盖父类的成员变量,所以成员变量的访问不能像方法一样使用多态去访问。
就是使用类型转换
翻译自http://www.programcreek.com/simple-java/
作者:六尺帐篷
链接:http://www.jianshu.com/p/4997c338d60e
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
成员变量在Java中能够被重写么?
Let’s first take a look at the following example which creates two Sub objects. One isassigned 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"; }
程序的输出结果是:
Paste_Image.png
按照我们已有的多态的概念,第二个应该是输出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刷题知识点之为什么static成员方法不能是抽象方法,其必须实现
- Java中方法的重写与成员变量的隐藏
- java入门-成员变量的隐藏与方法重写(super)
- Java 中,为什么在静态方法中可以调用的方法、可以使用的成员变量必须是静态的?
- java再复习——成员内部类为什么不能定义静态变量
- Java接口中的成员变量为什么必须是public static final?
- Java基础问题:static方法中为什么不能使用非static的方法或变量
- 含有string成员的结构体变量,为什么不能初始化?
- 指针对虚基类成员变量的访问为什么不能直接通过offset访问,而需要通过vbtable间接访问?
- Java中为什么静态方法不能被重写?为什么静态方法不能隐藏实例方法?
- 为什么java中子类重写父类的方法时声明抛出异常不能比父类范围大
- java为什么不能重写静态方法
- Java中为什么字段不能被重写
- java 子类继承父类成员变量的隐藏、实现方法的重写
- Java非静态内部类为什么不能有静态成员
- java中成员变量为什么需要初始化
- webview js 与java代码交互问题(成员变量名 和方法名不能重名 啃爹啊)
- java为什么定义的变量在main中不能用?
- Java接口中的成员变量为什么必须是public static final?