为什么静态方法无法隐藏java中的实例方法

class TestOverriding { public static void main(String aga[]) { Test t = new Fest(); t.tests(); } } class Test { void tests() { System.out.println("Test class : tests"); } } class Fest extends Test { static void tests() { System.out.println("Fest class : tests"); } } 

测试类是超类而且Fest是它的子类,因为我们知道静态方法不能被覆盖,即使我得到的错误如“静态方法无法隐藏java中的实例方法”也可以有人解释这一点,在此先感谢。

术语覆盖通常用于对象,因为使用相同的父引用,您可以从给定的子对象调用不同的方法。 以这种方式,静态方法不能被覆盖,因为它们与引用类型而不是对象类型相关联。

最重要的是怎么回事? 您在基类中指定方法并在子类中放置相同的签名,这会自动覆盖该方法。 如果您注意到, 静态方法也是inheritance的 ,即,如果父类包含静态方法,则子类引用可以使用它。 例如:

 public class TestOverriding { public static void main(String aga[]) { Fest t = new Fest(); t.tests(); <-- prints "Test class : tests" } } class Test { static void tests() { System.out.println("Test class : tests"); } } class Fest extends Test { void tests3() { System.out.println("Fest class : tests"); } } 

现在,一个静态方法已经到了你的子类,你正试图在具有相同签名的子类中定义一个新方法。 这导致了问题。 如果您在单个类中执行此操作,则错误消息将有所不同。

案例1:同一类

 class Fest{ void tests3() { System.out.println("Fest class : tests3"); } static void tests3() { System.out.println("Fest class : static tests3"); <-- gives "method tests3() is already defined in class Fest" } } 

案例2:子类(静态到实例)

 class Test { static void tests() { System.out.println("Test class : tests"); } } class Fest extends Test { void tests() { <-- gives "overridden method is static" System.out.println("Fest class : tests"); } } 

案例2:子类(实例到静态)

 class Test { oid tests() { System.out.println("Test class : tests"); } } class Fest extends Test { static void tests() { <-- gives "overriding method is static" System.out.println("Fest class : tests"); } } 

对于静态方法使用与超类中的实例方法相同的方法名称是不好的做法,因为它非常令人困惑。

我会说编译器最有可能保护您免受意外错误的影响,因为可能假设您确实想要覆盖该方法。

在这种情况下,像Fest t = new Fest(); t.tests() Fest t = new Fest(); t.tests()太混乱了:这意味着什么? 调用inheritance的实例方法Test.test ? 或者调用Fest的静态方法?

 ClassA{ public void disp(){} //Error ,We can not define two members with same name (Note this till next step) //public static void disp(){} } ClassB extends ClassA{ //Now ClassB has one method disp() inherited from ClassA. //Now declaring a static method with same //Error, as mentioned ClassB already has disp() and one more member with same //name is not allowed. //public static void disp(){} }