java - Java如何区分这些具有相同名称/签名的多个方法?

标签 java unicode polymorphism

我今天正在追踪一个错误,我注意到我们的一个类(class)中有一些奇怪的东西。我删掉了尽可能多的代码以张贴在这里:

class A {
    static int obtainNumber() { return 42; }
    static int obtainNumber() { return 3; }
    static int obtainNumber() { return -1; }
    static {
        System.out.println(obtainNumber());
    }
}

这个类有 3 个具有完全相同的名称和签名的方法。起初我以为这是无效代码,但后来 eclipse 会用红色突出显示该代码。它确实有效:

javac A.java && java A
42
Exception in thread "main" java.lang.NoSuchMethodError: main

所以我认为 Java 可能只会使用它看到的第一个。我重新订购以进行测试:

class A {
    static int obtainNumber() { return 3; }
    static int obtainNumber() { return -1; }
    static int obtainNumber() { return 42; }
    static {
        System.out.println(obtainNumber());
    }
}

不,相同的结果:

javac A.java && java A
42
Exception in thread "main" java.lang.NoSuchMethodError: main

我想也许它使用 42 的那个,因为它是最大的。为了对此进行测试,我采用了原始值并更改了返回值:

class A {
    static int obtainNumber() { return 0; }
    static int obtainNumber() { return 1; }
    static int obtainNumber() { return 2; }
    static {
        System.out.println(obtainNumber());
    }
}

它仍然知道使用第一个:

javac A.java && java A
0
Exception in thread "main" java.lang.NoSuchMethodError: main

如果我再次重新排序:

class A {
    static int obtainNumber() { return 1; }
    static int obtainNumber() { return 0; }
    static int obtainNumber() { return 2; }
    static {
        System.out.println(obtainNumber());
    }
}

同样的结果:

javac A.java && java A
0
Exception in thread "main" java.lang.NoSuchMethodError: main

我认为 Java 是一种基于文本的语言,我希望它能使这种事情变得不可能。 Java 如何跟踪哪个方法是哪个?

最佳答案

我只是在我的 IDE 中复制/粘贴了这个,虽然这是一个奇迹,但当尝试保存文件时出现了一条错误消息,清除了这个问题:

Save could not be complete. Try File > Save As... if the problem persists.

Reason: Some characters cannot be mapped using "Cp1252" caracter encoding. Either change the encoding or remove the characters which are not supported by the "Cp1252" caracter encoding.

因此,这些方法没有相同的名称,只是使用看起来相同的字符。

有关 Java 源文件字符编码的更多信息:

关于java - Java如何区分这些具有相同名称/签名的多个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17662815/

相关文章:

java - EJB 3.1 中 Bean 未注入(inject),只有该 Bean 具有此行为

java - JProfiler Heap Walker - 选择位于特定 Java 包中的 GC Root 持有的对象

sql-server - 未排序的 Unicode (UTF-16) 数据如何存储在 varchar 列中?

perl - 如何在不使用 Win32::Unicode::File 的 Strawberry perl 中使用 unicode 读取具有长文件名的文件?

c++ - 为什么使用虚拟表而不是函数指针?

c++ - 使用列表对象内部对象的派生函数

c++ - 如何在不同内核之间正确共享运行时创建的多态数据?嵌入式C++

java - 使用 servlet 的正确方法是什么?

java - 在继承的情况下使用 model.getClass().getMethod 时出现问题

c++ - 在 C++ 程序中使用 unicode