当(在Java中)同名的静态方法和实例方法存在于不同的类中时,我无法访问该方法

首先,请看下面的代码。

package test;

class c_hi {
    public static void method_hi(){
        System.out.println("hi");
    }
}

class c_bye {
    public void method_hi(){
        System.out.println("bye");
    }
}

public class test {
    public static void main(String[] args){
        c_hi.method_hi();
        c_bye c_hi = new c_bye();
        c_hi.method_hi();
    }
}

我已经使用Java几年了,我了解命名类名和变量名的一般规则。

然而,我得到了一个非常有趣的问题。如果“c_bye”类的引用变量名为“c_hi”(已经存在名为“c_hi”的类),

我无法从“test”类内部访问“c_hi”类的“method_hi”。

当然,我知道这个问题可以通过不重叠类名和变量名、包分离、FQCN等来防止或规避。

除了通常的避免重名的方法外,还有没有更符合语法的方法来解决这个问题?请告诉我你的意见。(或者,如果我可以参考有关 Stack Overflow 的任何文档、链接或其他问题,我将不胜感激。)

此代码对 JDK 版本 8 和 15 的工作方式相同。

回答

这应该“解决”问题:

    test.c_hi.method_hi();  // Using the fully qualified class name.

但是,正确的解决方案是:

  1. 不要忽略 Java 样式规则。规则规定 Java 方法名称应以小写字母开头,类名称应以大写字母开头。

  2. 避免对静态方法和实例方法使用相同的名称。

    (在某些情况下您实际上不能这样做。例如,如果c_bye扩展,c_hi那么您会收到一个关于不允许覆盖静态方法的实例方法的编译错误。)

  3. 不要尝试使用实例变量调用静态方法。使用类名。(如果您遵循样式规则,则不能与变量名称混淆!)

    Java 这样做是合法的,但它往往会愚弄读者认为该方法是一个实例方法和/或静态方法的动态分派正在发生。

JLS 中完全指定了名称解析规则的价值。(有关JLS 文本和参考,请参阅此答案。)对于像您所谈论的那种边缘情况,其含义有点复杂,但名称解析规则不是特定于 Java 版本的 AFAIK。

当人们故意忽略样式规则时,Java 并不是为了“玩得开心”而设计的。


以上是当(在Java中)同名的静态方法和实例方法存在于不同的类中时,我无法访问该方法的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>