1.根据Java Language Specification (Version 3) 8.4.8 的描述,子类在继承父类时,对于方法而言,存在两种关系:
A. override 即覆盖,这是对实例方法(instance method)而言的;子类与父类中形构相同的方法(原文中是 subsignature,它的范围比“形构相同”要大,请参考原文)会override 父类中的那个方法。
B. hide 即隐藏,这是对类方法(class method)即static 方法而言的。如果子类中定义了静态方法,则它会隐藏父类中形构相同的(原文中是 subsignature,它的范围比“形构相同要”大,请参考原文)所有方法,但如果隐藏了父类中的实例方法,则会编译报错。
2.根据上面的规范:
“override 覆盖”的前提是 实例方法,只有实例方法在继承时才会出现override情况。
如果是static方法,在继承时出现的现象根本就不能用“override”这个词描述,如果static方法在父类和子类中形构一致,则被成为 hide(隐藏)。
3.因为static方法是类方法,实现时是静态绑定的(引用“JAVA 核心技术 卷1 第六版”中149页内容“private、static、final”修饰的方法是静态绑定的。其他的方法在运行时动态绑定。“interhanchi”所说的“static和final方法外都是后期绑定”并不精确),只与类相关,不会有多态性。 从编程的角度看,效果好像是“static方法不能被覆盖”;
4.从术语上看,“static方法能否被覆盖”这种说法本身就是错误的,因为“覆盖”定义的前提和基础是实例方法。
5.结论: 子类中的static方法会隐藏父类中形构相同的static方法。
附:关于Java 的隐藏 机制,几本经典的书都没有详细说明。准备写一个这方面的材料,请有兴趣的朋友关注 http://blog.csdn.net/jidongxx。
3.在进行引用变量的类型转换时,会受到各种限制。而且在通过引用变量访问它所引用的实例的静态属性、静态方法、实例属性、实例方法,以及从父类中继承的方法和属性时,Java虚拟机会采用不同的绑定机制。
4.成员变量、静态方法按照引用变量声明的类型静态绑定;实例方法按照引用变量引用的实例动态绑定。
例如,对于以下这段代码:
Fathers f=new Sons();
System.out.println(“f.var=”+f.var);
System.out.println(“f.staticVar=”+f.staticVar);
f.method();
f.staticMethod();
运行时将会输出如下结果:
f.var=FatherVar
f.staticVar=StaticFaterVar
Son method
Static Father method
class Fathers{
String var="FatherVar";
static String staticVar="StaticFatherVar";
void method(){System.out.println("Father method");}
static void staticMethod(){System.out.println("Static Father method");}
}
class Sons extends Fathers{
String var="SonVar";
static String staticVar="StaticSonVar";
void method(){System.out.println("Son method");}
static void staticMethod(){System.out.println("Static Son method");}
String sonVar=null;
void sonMethod(){}
}
分享到:
相关推荐
文件详细描述了C++成员函数的重载、覆盖与隐藏技术,对于初学C++的人员很有帮准,也是我们程序猿参考、学习的重要资料。
原文:C++类成员函数的 重载、覆盖和隐藏区别重载成员函数被重载的特征:相同的范围(在同一个类中)函数名字相同参数不同virtual 关键字可有可无void s
本篇文章介绍了,关于Java方法的覆盖与隐藏的区别分析。需要的朋友参考下
C++ 中函数重载、覆盖与隐藏详解 在C++语言中,函数扮演着很重要的角色,不管面向过程设计,还是基于对象设计;不管是面向对象编程,还是基于泛型编程,函数都可以随处而见。在谈论C++中的函数重载、覆盖和隐藏之前...
以下是对类成员函数的重载、覆盖与隐藏之间的区别进行了详细的总结分析,需要的朋友可以过来参考下。希望对大家有所帮助
1 重载与覆盖成员函数被重载的特征:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无。覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生...
类成员函数的重载、覆盖和隐藏区别以及抽象类等
上网看C++的一些资料,突然看到虚函数,突然让我回想起继承,覆盖什么的,决定总结一些资料,加上自己的体会写一篇。 1、C++中的虚函数(virtual function) 虚函数是C++中用于实现多态(polymorphism)的...
在谈论C++中的函数重载、覆盖和隐藏之前,先回顾下函数的基础知识。 函数的声明包括函数的返回值类型,函数名称,参数列表(参数的类型、参数的个数、参数的顺序)。例如,声明一个两个整数之和的函数,int iAdd...
重载、覆盖和隐藏
C++的重载、隐藏、覆盖规则 C++的重载、隐藏、覆盖规则 C++的重载、隐藏、覆盖规则
变量和方法覆盖和隐藏的不同:一个类的实例无法通过使用全局名或者强制自己转换为父类型,以访问父类中被隐藏的方法,然而强制转换子类为父类型之后,可以访问父类中被隐藏的变量。另外静态方法不能覆盖父类的实例...
最近有个同学问了我一个小问题,觉得很有意思,之前一直没有想到过。他说“java中存在方法覆盖,是否存在变量的覆盖呢?”。
要弄清楚重载、覆盖、多态与函数隐藏之间的复杂且微妙关系之前,我们首先 要来回顾一下重载覆盖等基本概念。 首先,我们来看一个非常简单的例子,理解一下什么叫函数隐藏hide。
8.2 成员函数的重载、覆盖与隐藏 60 8.3 参数的缺省值 63 8.4 运算符重载 64 8.5 函数内联 65 8.6 一些心得体会 68 第9章 类的构造函数、析构函数与赋值函数 69 9.1 构造函数与析构函数的起源 69 9.2 构造函数的初始...
8.2 成员函数的重载、覆盖与隐藏 60 8.3 参数的缺省值 63 8.4 运算符重载 64 8.5 函数内联 65 8.6 一些心得体会 68 第9章 类的构造函数、析构函数与赋值函数 69 9.1 构造函数与析构函数的起源 69 9.2 构造函数的初始...