为什么字段不能被覆盖?

本文展示了Java中的基本面向对象概念 - 字段隐藏。

1.可以在Java中重写字段吗?

我们先来看看下面的例子,它创建了两个Sub对象。 一个分配给一个Sub引用,另一个分配给一个Super引用。

package oo;
 
class Super {
    String s = "Super";
}
 
class Sub extends Super {
    String s = "Sub";
}
 
public class FieldOverriding {
    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”?

2.隐藏字段而不是重写字段

隐藏字段有明确的定义:

在类中,与父类中的字段具有相同名称的字段会隐藏父类的字段,即使它们的类型不同。 在子类中,父类中的字段不能被其简单名称引用。 相反,该字段必须通过父类访问。 一般来说,我们不建议隐藏字段,因为它会使代码难以阅读。

根据此定义,成员字段不能像方法一样被覆盖。 当子类定义一个同名的字段时,子类只是声明了一个新字段。 父类中的字段是被隐藏了。 它没有被覆盖,所以它不能被多态地访问。

3.访问隐藏字段的方法

1)通过使用父引用类型,隐藏的父类字段可以被访问,就像上面的例子。
2)通过转换,您可以访问父类中的隐藏成员。

System.out.println(((Super)c1).s);
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,765评论 18 399
  • 一:java概述: 1,JDK:Java Development Kit,java的开发和运行环境,java的开发...
    慕容小伟阅读 1,837评论 0 10
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 2,688评论 0 11
  • 20- 枚举,枚举原始值,枚举相关值,switch提取枚举关联值 Swift枚举: Swift中的枚举比OC中的枚...
    iOS_恒仔阅读 2,313评论 1 6
  • 我爱做梦,从小到大不知道做了多少稀奇古怪的梦,很神奇的是,第二天早上我居然记得我梦中的情节,于是我把那些我...
    爱蔻严玲阅读 232评论 0 0