本文讨论了Java面向对象概念中的一个基本概念——FieldHiding(隐藏成员变量)在讨论这个问题之前,我们先看一段很简单的代码,数据是什么方法的结果?/***@authorHollis17/9/27.*/publicclassFieldOverriding{publicstaticvoidmain(String[]args){Subc1=newSub();System.out.println("c1.s:"+c1.s);System.out.println("c1.say:"+c1.say());Superc2=newSub();System.out.println("c2.s:"+c2.s);System.out.println("c2.说:"+c2.say());}}classSuper{Strings="Super";Stringsay(){return"helloSuper";}}classSubextendsSuper{Strings="Sub";Stringsay(){return"helloSub";}}输出结果:c1.s:Subc1.say:helloSubc2.s:Superc2.say:helloSub和你想的一样,如果一样,那你就不需要继续阅读。因为这个并不难,只要你会就行。Java中的重写我们在深入理解Java中的重写和重载中介绍过:Java子类和父类中存在两个同名同参数列表的方法的情况。由于它们具有相同的方法签名,子类中的新方法将覆盖超类中的现有方法。形式上是因为Java在继承上有方法重写,这也体现了Java的动态多态性。Java可以重写成员变量吗?在上面的Java重写介绍中明确的说,重写是指方法。没有提到成员变量。通过上面的例子,其实我们也可以发现成员变量并没有被改写。因此,在Java中,成员变量是不会被重写的。这里还有一个词:隐藏。Java中成员变量的隐藏Java文档中隐藏字段的定义:在一个类中,与超类中的字段同名的字段隐藏了超类的字段,即使它们的类型不同。在子类中,超类中的字段不能通过其简单名称引用。相反,必须通过super访问该字段。一般来说,我们不建议隐藏字段,因为这会使代码难以阅读。翻译成中文:在一个类中,子类中如果父类中的成员变量与父类中的成员变量同名,即使它们的类型不同,只要名字相同即可。父类中的成员变量将被隐藏。在子类中,不能简单地通过引用来访问父类的成员变量。相反,必须从父类的引用中获取父类的隐藏成员变量。一般来说,我们不建议隐藏成员变量,因为这会使代码难以阅读。其实简单来说,子类不会重写和覆盖父类的成员变量,所以访问成员变量不能像方法那样使用多态来访问。如何访问隐藏成员变量其实通过前面的例子和刚才对成员变量的介绍,大家已经知道如何访问隐藏成员变量了。就是使用父类的引用来访问成员变量,比如Superc2=newSub();System.out.println("c2.s:"+c2.s);.或者使用System.out.println(((Super)c1).s);。【本文为专栏作家霍利斯原创文章,作者微信公众号Hollis(ID:hollishuang)】点此阅读更多本作者好文
