为什么成员属性不会被重写

本篇文章将展示一个基本的面向对象概念-属性隐藏。

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);
    }

}

运行程序,输出结果如下:

Sub
Super

为什么创建了两个Sub对象,第二个却输出了”Super“;

 隐藏属性而不是重写它们

先看一下属性隐藏的定义:

对于一个类,当其属性与其父类的某个属性有相同的名字(即使类型不同),其父类的属性会被隐藏起来;对于子类来说,父类的属性是不能被子类对象引用访问到的,而需要通过其父类对象的引用访问;通常来说,我们不建议隐藏属性,因为这会使代码不易阅读;

 从以上定义可以看出,成员属性不能像方法那样被重写,当子类定义了一个和其父类相同名字的成员属性,子类仅仅是声明了一个新的属性,而起父类的属性被隐藏起来,这不是重写,所以不能以多态的形式访问。

访问隐藏属性的方法

1、使用父类对象引用类型访问,像前面demo提到的那样;

2、将子类对象引用类型强制转换成父类对象引用类型:

System.out.println(((Super)c1).s);

 译文链接:http://www.programcreek.com/2012/11/java-field-overriding/

原文地址:https://www.cnblogs.com/chenpi/p/5485669.html