为什么';Java是否允许通过实例方法隐藏静态方法?

为什么';Java是否允许通过实例方法隐藏静态方法?,java,inheritance,Java,Inheritance,如中所示,Java确实允许 用实例方法重写实例方法,以及 通过静态方法隐藏静态方法 我的问题是为什么Java不允许通过实例方法隐藏静态超类方法。可以这样做: class Base { static void foo () {} } class Derived extends Base { void foo () {} void access () { foo (); Base.foo (); } } 我看不出上述方法有什么特别的

如中所示,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 () {} // 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()
    。问题是为什么我们不能通过实例方法隐藏静态方法(而不是使用静态方法隐藏,正如您所解释的那样工作得很好)。基本上我认为可以归结为这一点