是“继承的”吗?解释超类的静态方法可以被子类访问的正确术语是什么?
澄清:这个问题与访问修饰符无关
确认 Bm() 和 bm() 语句在以下代码中都有效:
class A {
static void m() { //some code }
}
class B extends A {
}
class Example {
public static void main (String [] args) {
B.m(); // running A's m() static method
}
public void try() {
B b = new B();
b.m(); // running A's m() static method
}
}
我的问题是我们可以说“静态方法是继承的”吗?
如果“继承”是正确的术语,如果我们向 B 类添加一个方法,我们将使用静态类的相同签名:
class A {
static void m() { //some code }
}
class B extends A {
static void m() { //some code }
}
class Example {
public static void main (String [] args) {
B.m(); // running B's m() static method
}
public void try() {
B b = new B();
b.m(); // running B's m() static method
A a = new B();
a.m(); // running A's m() static method, no polymorphism
}
}
在这种情况下,请注意我们没有多态性,“静态方法是继承的,但是未重写,子类静态方法隐藏超类静态方法”?
最后一个疑问,对于“继承”和“重写”这两个术语,哪一个与术语“多态性”直接相关?
Clarification: this question is not about access modifier
Confirmed that B.m() and b.m() statements both works in the following code:
class A {
static void m() { //some code }
}
class B extends A {
}
class Example {
public static void main (String [] args) {
B.m(); // running A's m() static method
}
public void try() {
B b = new B();
b.m(); // running A's m() static method
}
}
My question is can we said "static method is inherited"?
if "inherited" is the correct term, if we add a method to B class we same signature of the static class:
class A {
static void m() { //some code }
}
class B extends A {
static void m() { //some code }
}
class Example {
public static void main (String [] args) {
B.m(); // running B's m() static method
}
public void try() {
B b = new B();
b.m(); // running B's m() static method
A a = new B();
a.m(); // running A's m() static method, no polymorphism
}
}
In this case, notice that we have no polymorphism, is it the correct term to said that "static method is inherited but not overridden, subclass static method hide superclass static method"?
Last doubt, for these 2 terms, "inherited" and "overriden", which one is directly tied to the term "polymorphism" ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
是的,我认为“继承”在这里是正确的术语,即使它并不像它可能的那样具有描述性。来自 Java 语言的 第 8.4.8 节规格:
它没有指定实例方法,但是对于允许隐藏或重写什么内容有特定的限制,如果静态方法不是继承的,那么这些限制就没有意义。
实际上,我只是将静态方法视为“无需限定即可访问”,而不是其他任何东西,因为它们不参与多态性等。我认为值得非常清楚地了解这一点 - 例如,一个静态方法可以< em>隐藏继承的,但不能覆盖它。
换句话说,虽然我认为“继承”在技术上是正确的,但我会尽量避免在没有任何进一步解释的情况下使用它。
对于你的第二个问题,我想说的是,基于上述,重写与多态性相关,但继承则不一定。
(我还强烈建议您避免“通过”变量调用静态方法,并且在您指定名称的任何地方都使用声明静态方法的类的名称。我知道这不是问题的一部分,但我想我还是要添加它......)
Yes, I think "inherit" is the correct term here, even if it's not as descriptive as it might be. From section 8.4.8 of the Java Language Specification:
That doesn't specify instance methods, but there are specific restrictions on what is allowed to hide or override what, which wouldn't make sense if static methods were not inherited.
Really though, I would simply view static methods as "accessible without qualification" rather than anything else, given that they don't take part in polymorphism etc. I think it's worth being very clear about that - for example, one static method can hide an inherited one, but it can't override it.
In other words, while I think "inherit" is technically correct, I would try to avoid using it without any further explanation.
For your second question, I'd say that based on the above, overriding is tied to polymorphism, but inheriting isn't necessarily.
(I would also strongly advise you to avoid calling static methods "via" variables, and also to use the name of the class which declares the static method wherever you specify the name at all. I know that's not part of the question, but I thought I'd just add it anyway...)
我认为尝试将“继承”和“覆盖”等词应用于此类事情是没有成效的。它具有误导性,因为它给人的印象是存在与虚拟实例方法类似的情况,而您指出并不存在。
(但正如 Jon Skeet 指出的那样,Java 语言规范不同意我的观点,它将它们分组在同一部分中。)
I think trying to apply words like 'inherited' and 'overridden' to this sort of thing is not productive. It's misleading because it gives the impression there is something comparable of what goes on with virtual instance methods, and you point out there isn't.
(But as Jon Skeet points out, the Java language spec doesn't agree with me, it groups these together in the same section.)
伙计们,我想与所有 Java 爱好者分享我的 Java 知识!
首先让我告诉你,静态成员是那些不需要创建特定类的对象就可以直接访问的成员,当一个类的静态成员在其他类中使用时,应该通过指定类名来使用它。 (点)静态成员的名称(例如下面示例中的 Ai),并且如果任何子类从具有静态成员的超类继承,并且如果子类和超类都在同一个包中,则该静态成员可以是从基类访问,甚至不使用该类超类的名称。请通过
示例:
如果大家还有任何困惑,请通过以下电子邮件地址给我发邮件:
[电子邮件受保护]
问候
普拉迪普·库马尔·蒂瓦里
Guys I would like to share my knowledge in java with all java lovers out there!
First of all let me tell you that static members are those members which can be accessed directly without creating an object of that particular class, when static members of a class is used in some other class then it should be used by specifying the class name .(dot) static member's name(e.g. A.i in the following example), and also if any subclass class is getting inherited from a super class which has static members and if both subclass and super class are in the same package then that static members can be accessed from the base class without even using the class name of the super class. Please go through the
Example:
Guys if you still have any confusion mail me at this email-id:
[email protected]
Regards
Pradeep Kumar Tiwari
好的静态方法不能被覆盖,但可以重新定义,换句话说,它称为隐藏
检查这个http://www.coderanch.com/how-to/java/OverridingVsHiding 他们解释得很好
Ok static methods cannot be overridden but can be redefined in other words its called hiding
check this http://www.coderanch.com/how-to/java/OverridingVsHiding they explain pretty well