当前位置: 首页 > 知识库问答 >
问题:

为什么静态方法不能在java中隐藏实例方法

郑茂勋
2023-03-14
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");
    } 
}

Test类是超级类,Fest是它的子类,因为我们知道静态方法不能被重写,即使我遇到了“静态方法不能在java中隐藏实例方法”这样的错误,有人能解释一下吗,提前谢谢。

共有3个答案

贝自怡
2023-03-14

在这种情况下,类似于Fest t=new Fest();t、 tests()太令人困惑了:这意味着什么?调用继承的实例方法Test。测试?或者调用静态方法Fest

仲孙默
2023-03-14

在静态方法中使用与超级类中的实例方法相同的方法名是不好的做法,因为它非常容易混淆。

我想说的是,编译器很可能是在保护您免受意外错误的影响,因为可能假设您确实希望重写该方法。

杨学真
2023-03-14

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

超驰是如何发生的?您在基类中指定一个方法,并在子类中放置相同的签名,这将自动覆盖该方法。如果您注意到,静态方法也是继承的,也就是说,如果父类包含静态方法,那么它可以由子类引用使用。例如:

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");
    }
}
 类似资料:
  • 编译器在第3行给出了一个错误 此实例方法无法重写Abc中的静态方法 为什么静态方法不能被实例方法覆盖?

  • 当我试着运行这段代码时,它给了我30。有人能解释一下吗!我知道在Java中不能重写静态方法,因为多态性和静态方法不能一起工作。静态方法在类上调用,而不是在实例中调用。但有人能就这个话题做进一步解释吗。我真的不明白为什么我的分数是30而不是10。谢谢

  • 问题内容: 问题是在Java中为什么不能定义抽象静态方法?例如 问题答案: 因为“抽象”的意思是:“不实现任何功能”,而“静态”的意思是:“即使没有对象实例也有功能”。这是一个逻辑上的矛盾。

  • 问题内容: 问题是在Java中为什么不能定义抽象的静态方法?例如 问题答案: 因为“抽象”表示:“不执行任何功能”,而“静态”表示:“即使没有对象实例也具有功能”。这是一个逻辑上的矛盾。

  • 问题内容: 编辑: 从Java 8开始,接口中现在允许使用静态方法。 例子如下: 当然这行不通。但是为什么不呢? 可能的问题之一是,当你致电时会发生什么: 在这种情况下,我认为它应该只调用一个空方法(即{})。所有子类都将被强制实现static方法,因此在调用static方法时它们都很好。那为什么不可能呢? 编辑:我想我正在寻找比“因为这就是Java的方式”更深的答案。 有特定的技术原因为什么不能

  • 伙计们,我有一个简单但令人讨厌的问题。据我所知,基本上意味着,对于该类的每个实例,这个方法将是相同的,如果我们改变它,这将改变该类的每个实例,它也被称为类方法。那么,如果我有一个类,它实现了某种格式的方法,让我们说: 为什么不能设置为静态?因为该类的每个实例的格式都是相同的。。。?