不可以。你可以使用javap(显示字节码的反编译工具)来检查这一点。dog类根本没有makeSound方法。 编译器看到字符"dog.makeSound()并知道什么是Animal.class和Dog.class看起来像——要么因为它们在类路径上,要么因为它们在同一个编译运行中。因此,编译器本身“解析”了您的意思。如果缺少狗或动物,编译器将出错,告诉您缺少一个必需的类,并将其叫停-无类文件,使其余的没有意义。 在类文件格式中,方法调用是完全指定的。它们的标识基于完全限定的类名和方法名,以及所有参数和返回类型的确切类型(没有泛型)。只有当所有相同的情况下,JVM才认为它是相同的方法。就JVM而言,java代码"foo".toLowerCase()中的方法命名为:“java/lang/String::toLowerCase::()Ljava/lang/String;”。幸运的是,我们用java编程,而不是字节码。 因此,在类级别上,你的"dog.makeSound();"被编译成如下内容: INVOKEVIRTUAL com.foo.User214534sPackage.Animal :: makeSound :: ()V 当JVM看到这一点时,它会检查堆栈顶部是什么(因为这是一个实例方法,'receiver'(dog.部分)实际上是第一个参数),检查变量指向的对象的实际类型是什么,找