我有一些关于 Java 编译器的问题。
我的当前目录是这样的
├── Hoge.java
├── Sample.class
├── Sample.java
├── pattern01
│ └── com
│ └── cat
│ └── Hoge.class
└── pattern02
└── com
└── cat
└── Hoge.class
----- 示例.java -----
import com.cat.Hoge;
public class Sample {
public static void main(String[] args) {
System.out.println("hello!");
Hoge h = new Hoge();
h.call();
}
}
----- 模式01 -----
package com.cat;
public class Hoge {
public void call() {
System.out.println("com.cat");
System.out.println("pattern01");
}
}
----- 模式02 -----
package com.cat;
public class Hoge {
public void call() {
System.out.println("com.cat");
System.out.println("pattern02");
}
}
我是这样编译Sample.java的。
$ javac -cp pattern01 Sample.java
然后我像这样执行它。
$ java -cp .:pattern01 Sample
hello!
com.cat
pattern01
$ java -cp .:pattern02 Sample
hello!
com.cat
pattern02
pattern01和pattern02都是正常结束的。
但是我用 pattern01 编译的。为什么程序通常以 pattern02 结束?
编译器检查什么?编译器是否只检查类名?
最佳答案
类在运行时解析。您使用类路径中 Hoge 类的一个版本编译了您的客户端类(示例),并使用该类的另一个版本运行它。由于该类仍然兼容(相同的包、相同的名称、相同的方法签名),所以一切顺利。
这就是允许使用给定版本的库(或 JDK)编译类,但仍然使用同一库(或 JDK)的另一个版本运行它的原因。如果这不可能,那么构建可重用库将是一场噩梦,因为每个库都必须针对 JDK 的每个版本和每个依赖库的每个版本进行编译。
关于java - 我有一些关于 Java 编译器的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16393495/