本篇文章将展示一个基本的面向对象概念-属性隐藏。
Java中的成员属性能被重写吗?
让我们先看以下代码示例,创建了两个Sub对象,并将其引用分别赋给SUb类和其父类Super;
package simplejava;class Super { String s = "Super";}class Sub extends Super { String s = "Sub";}public class Q3 { public static void main(String[] args) { Sub c1 = new Sub(); System.out.println(c1.s); Super c2 = new Sub(); System.out.println(c2.s); }}
运行程序,输出结果如下:
SubSuper
为什么创建了两个Sub对象,第二个却输出了”Super“;
隐藏属性而不是重写它们
先看一下属性隐藏的定义:
对于一个类,当其属性与其父类的某个属性有相同的名字(即使类型不同),其父类的属性会被隐藏起来;对于子类来说,父类的属性是不能被子类对象引用访问到的,而需要通过其父类对象的引用访问;通常来说,我们不建议隐藏属性,因为这会使代码不易阅读;
从以上定义可以看出,成员属性不能像方法那样被重写,当子类定义了一个和其父类相同名字的成员属性,子类仅仅是声明了一个新的属性,而起父类的属性被隐藏起来,这不是重写,所以不能以多态的形式访问。
访问隐藏属性的方法
1、使用父类对象引用类型访问,像前面demo提到的那样;
2、将子类对象引用类型强制转换成父类对象引用类型:
System.out.println(((Super)c1).s);
译文链接: