zoukankan      html  css  js  c++  java
  • 为什么成员属性不会被重写

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

    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/

  • 相关阅读:
    Kruskal算法
    拓扑排序
    邻接表有向图
    邻接矩阵的有向图
    邻接表无向图
    邻接矩阵无向图
    斐波那契堆
    二项堆
    斜堆(待补充)
    项目中maven依赖无法自动下载
  • 原文地址:https://www.cnblogs.com/chenpi/p/5485669.html
Copyright © 2011-2022 走看看