java - 我有一些关于 Java 编译器的问题

标签 java compilation

我有一些关于 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/

相关文章:

c++ - 如何根据参数化类型的特定成员的类型对模板类函数进行不同的实现

java - 如何从我用 Java 编写的控制台运行 Kafka Producer?

java - 双重计算产生奇数结果

java - 从 Tomcat 获取资源时出现 FileNotFoundException

Java:字符串填充失败

java - com.mysql.jdbc.MysqlDataTruncation : Data truncation: Incorrect datetime value: 'Mon Feb 11 00:00:00 IST 2013' for column 'INVOICE_DATE' at row 1

c - 使用 QtCreator [mac os] 找不到 -lrt 的库

c++ - 用 C++ 绘制图形(这是如何工作的?)(以及更快编译器的技巧?)

actionscript - 使用 ActionScript 文件编译 .SWF

Java 仅执行 .sh 文件中的第一个命令