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

时间:2015-10-21 09:48:13

标签: 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中的实例方法"有人可以解释一下,提前谢谢。

4 个答案:

答案 0 :(得分:2)

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

如何重写?您在基类中指定一个方法并在子类中放置相同的签名,这会自动覆盖该方法。如果您注意到,静态方法也是继承的,即,如果父类包含静态方法,则子类引用可以使用它。例如:

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");
    }
}

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

在这种情况下,像Fest t = new Fest(); t.tests()之类的东西会让人感到困惑:这意味着什么?对继承的实例方法Test.test的调用?或者调用Fest的静态方法?

答案 3 :(得分:0)

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(){}
}