

Java中方法的重写与成员变量的隐藏
source link: http://zhuanlan.51cto.com/art/201709/553340.htm
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Java中方法的重写与成员变量的隐藏-51CTO.COM
这篇文章讨论了Java面向对象概念中一个基本的概念–Field Hiding(隐藏成员变量)
在讨论这个问题之前,我们看一段特别特别简单的代码,请问一下方法的数据结果是什么?
/**
* @author Hollis 17/9/27.
*/
public class FieldOverriding {
public static void main(String[] args) {
Sub c1 = new Sub();
System.out.println(" c1.s : " + c1.s);
System.out.println(" c1.say : " + c1.say());
Super c2 = new Sub();
System.out.println(" c2.s : " + c2.s);
System.out.println(" c2.say : " + c2.say());
}
}
class Super {
String s = "Super";
String say(){
return "hello Super";
}
}
class Sub extends Super {
String s = "Sub";
String say(){
return "hello Sub";
}
}
输出结果:
c1.s : Sub
c1.say : hello Sub
c2.s : Super
c2.say : hello Sub
和你想的一样吗,如果一样的话,那就不用继续往下看了。因为这个本来就不难,知道了就行。
Java中的重写
在深入理解Java中的重写和重载中我们介绍过:
在Java的子类与父类中有两个名称、参数列表都相同的方法的情况。由于他们具有相同的方法签名,所以子类中的新方法将覆盖父类中原有的方法。
正式因为Java在继承中有方法的重写,所以,这也体现了Java的动态多态性。
成员变量在Java中能够被重写么?
上面的Java的重写介绍中明确的说了,重写,指的是方法。并没有提到成员变量。通过上面的例子,其实我们也可以发现,成员变量并没有被重写。
所以,Java中,成员变量并不会被重写。这里就有另外一个词:隐藏。
Java中成员变量的隐藏
Java文档中对隐藏域的定义:
Within a class, a field that has the same name as a field in the superclass hides the superclass’s field, even if their types are different. Within the subclass, the field in the superclass cannot be referenced by its simple name. Instead, the field must be accessed through super. Generally speaking, we don’t recommend hiding fields as it makes code difficult to read.
翻译成中文:
在一个类中,子类中的成员变量如果和父类中的成员变量同名,那么即使他们类型不一样,只要名字一样。父类中的成员变量都会被隐藏。在子类中,父类的成员变量不能被简单的用引用来访问。而是,必须从父类的引用获得父类被隐藏的成员变量,一般来说,我们不推荐隐藏成员变量,因为这样会使代码变得难以阅读。
其实,简单来说,就是子类不会去重写覆盖父类的成员变量,所以成员变量的访问不能像方法一样使用多态去访问。
如何访问被隐藏的成员变量
其实,通过前面的例子,和刚刚关于成员变量的介绍,其实你已经知道了如何访问被隐藏的成员变量。 就是使用父类的引用来访问成员变量,如Super c2 = new Sub(); System.out.println(" c2.s : " + c2.s);。或者使用System.out.println(((Super)c1).s);。
【本文是51CTO专栏作者Hollis的原创文章,作者微信公众号Hollis(ID:hollischuang)】
Recommend
-
38
转载请注明文章出处: https://tlanyan.me/static-member-in-cpp C++的 static 关键字可修饰 类 成员变量/方法,表示变量/方法...
-
62
iOS中实例变量、成员变量和属性变量的区别我叫Vincent0.8932019.06.23 23:44:12字数 736阅读 975
-
8
本章我们来看一下,Java中字段和方法是如何参与重写的。 字段的重写 首先,需要明确一点,Java的字段永远不参与多态,当子类声明了与父类同名的字段时,虽然在子类的内存中两个字段都会存在,但是子类的字段会屏蔽父类的同名字段。我们来看...
-
6
类、对象、对象内存图、局部变量与成员变量、private修饰符、this、封装笔记发布于 46 分钟前是对一类具有共同属性和行为的事物的抽象。1、属性----成员变量(...
-
4
java继承中的构造方法和成员方法 2016-02-18 java中所有的类都有构造方法,在每个类被创建时会自动调用构造方法来对对象进行初始化。 super关键字
-
23
求问有没有方法能将调用类成员变量的函数转成类外的函数指针?-CSDN论坛使用std::function 把类成员函数指针转换为普通函数指...作者:倾夜·陨灭星尘一.什么是...
-
5
Android static静态成员变量的使用误区 – Android开发中文站你的位置:Android开发中文站 > Android开发 >
-
6
一、双重身份 如下定义了一个 School 结构体: typedef struct School { int a; int b; }SCHOOL_S; SCHOOL_S stSch; 下面我们来输出一下 stSch 以及成员变...
-
7
PriorityQueue源码-成员变量解析 精选 原创 知识浅谈 2022-10-14 10:08:59...
-
4
掌握C/C++中的静态变量与静态成员! 作者:C语言小新 2023-10-07 15:53:05 静态变量只会初始化一次,但可以多次赋值。它们在程序主函数执行之前已经由编译器分配好了内存空间。这意味着它们的初始化发生在程序的启...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK