6

I have some questions about Java Compiler.

My current directory is like this.

├── Hoge.java
├── Sample.class
├── Sample.java
├── pattern01
│   └── com
│       └── cat
│           └── Hoge.class
└── pattern02
    └── com
        └── cat
            └── Hoge.class

----- Sample.java -----

import com.cat.Hoge;

public class Sample {

    public static void main(String[] args) {
        System.out.println("hello!");
        Hoge h = new Hoge();
        h.call();
    }
}

----- pattern01 -----

package com.cat;

public class Hoge {

    public void call() {
        System.out.println("com.cat");
        System.out.println("pattern01");
    }
}

----- pattern02 -----

package com.cat;

public class Hoge {

    public void call() {
        System.out.println("com.cat");
        System.out.println("pattern02");
    }
}

I compiled Sample.java like this.

$ javac -cp pattern01 Sample.java 

And I execute it like this.

$ java -cp .:pattern01 Sample
hello!
com.cat
pattern01

$ java -cp .:pattern02 Sample
hello!
com.cat
pattern02

Both pattern01 and pattern02 are normally ended.

But I compiled with pattern01. Why did program normally end with pattern02?

What does compiler check? Does compiler check only class name ?

4

1 回答 1

8

类在运行时解析。您在类路径中使用 Hoge 类的一个版本编译了您的客户端类(Sample),并使用该类的另一个版本运行它。由于该类仍然兼容(相同的包、相同的名称、相同的方法签名),所以一切顺利。

这就是允许使用给定版本的库(或 JDK)编译类,但仍使用同一库的另一个版本(或 JDK)运行它的原因。如果这不可能,那么构建可重用库将是一场噩梦,因为每个库都必须针对每个版本的 JDK 和每个依赖库的每个版本进行编译。

于 2013-05-06T06:58:32.530 回答