为什么';Java是否允许通过实例方法隐藏静态方法?
如中所示,Java确实允许为什么';Java是否允许通过实例方法隐藏静态方法?,java,inheritance,Java,Inheritance,如中所示,Java确实允许 用实例方法重写实例方法,以及 通过静态方法隐藏静态方法 我的问题是为什么Java不允许通过实例方法隐藏静态超类方法。可以这样做: class Base { static void foo () {} } class Derived extends Base { void foo () {} void access () { foo (); Base.foo (); } } 我看不出上述方法有什么特别的
class Base {
static void foo () {}
}
class Derived extends Base {
void foo () {}
void access () {
foo ();
Base.foo ();
}
}
我看不出上述方法有什么特别的问题——它只是与静态的(允许的)隐藏一样“混乱/复杂”。我怀疑这是为了避免处理基类时的混淆。事实上,我想设计师们并没有看到一个明显的行为方式
class Base {
static void foo () {}
}
class Derived extends Base {
void foo () {} // say this compiled
}
Base b = new Derived()
b.foo(); // should the static or the virtual method be called?
b.foo()应该调用Base.foo()还是可能调用派生的.foo()?因为,一个像香蕉,另一个像苹果 解释:
- 静态方法是在读取类结构时创建的
- 方法是在创建类的对象时创建的
Foo.bar();
有什么不同于
new Foo().bar();
猜猜叫哪一个
Foo f = new Foo();
f.bar();
简单的回答:那将是一团糟 具体答案:在这种情况下调用什么
Derived.foo()
Base.foo()
无法调用,因为它是隐藏的(根据您的要求),Derived.foo()
无法调用,因为它不是静态的。这里要添加的另一个选项是:
1.静态方法属于类级别。所以u不能重写派生类中的方法。
简单地说,这就是所谓的隐藏。:)
2.实例方法属于对象,因此对象被覆盖。所以我们可以在派生类中重写
以上其他评论给出了一个很好的例子,请仔细研究一下
问候
Punith从我的观点(这是由C#引起的偏见)很清楚:方法是在对象上调用的,因此调用实例方法而不是静态方法。但在Java中,我认为允许对对象调用静态方法(设计错误),这会导致您所解释的混乱。很好的例子。我认为这会导致编译时错误,原因与您给出的相同。相反,代码应该是显式的
Base.foo()
或new-Derived().foo()
。问题是为什么我们不能通过实例方法隐藏静态方法(而不是使用静态方法隐藏,正如您所解释的那样工作得很好)。基本上我认为可以归结为这一点