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

简介:

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.cnblogs.com/chenpi/p/5485669.html,如需转载请自行联系原作者



相关文章
|
6天前
10 # 类:继承和成员修饰符
10 # 类:继承和成员修饰符
29 0
|
1天前
|
C++
C++程序中的派生类成员访问属性
C++程序中的派生类成员访问属性
9 1
|
6月前
|
C++
45 C++ - 继承中同名成员的处理方法
45 C++ - 继承中同名成员的处理方法
29 0
|
6天前
|
C++
C++ 类中静态成员和静态成员函数的继承覆盖
C++ 类中静态成员和静态成员函数的继承覆盖
27 0
|
9月前
|
安全 编译器 C++
[C++] 类与对象(中)类中六个默认成员函数(1)上
[C++] 类与对象(中)类中六个默认成员函数(1)上
|
9月前
|
存储 编译器 C++
[C++] 类与对象(中)类中六个默认成员函数(1)下
[C++] 类与对象(中)类中六个默认成员函数(1)下
|
Java Python
Java实例属性覆写问题
Java实例属性覆写问题
80 0
|
程序员 C++
基类在派生类中访问属性的调整
基类在派生类中访问属性的调整
134 0
|
数据安全/隐私保护 C++
C++类中数据成员要私有
C++类中数据成员要私有
234 0