読者です 読者をやめる 読者になる 読者になる

class ファイルは一貫性を保ちたい。

Java neta

(このエントリは classファイルを触ってはいけない - 日々常々パクリスペクトエントリです)

まずこういうクラスがあります。

// Hoge.java
public class Hoge {
    // static にすればインスタンスを生成する必要はない
    public static void print(int value) {
        System.out.println("int: " + value);
    }
}

そして、このクラスを使うクラスがあります。

// Fuga.java
public class Fuga {
    public static void main(String[] args) {
        short value = 1;
        Hoge.print(value);
    }
}

そのままコンパイルします。

Aebi:temp ebi$ ls
Fuga.java	Hoge.java
Aebi:temp ebi$ javac *
Aebi:temp ebi$ ls
Fuga.class	Fuga.java	Hoge.class	Hoge.java

実行します。

Aebi:temp ebi$ java Fuga
int: 1

普通ですね。
では Hoge.java を変えます。

// Hoge.java
public class Hoge {
    // static にすればインスタンスを生成する必要はない
    public static void print(int value) {
        System.out.println("int: " + value);
    }
    // static を知らない人は毎回インスタンスを生成しているが…
    public static void print(short value) {
        System.out.println("short: " + value);
    }
}

Hoge.javaコンパイル

Aebi:temp ebi$ javac Hoge.java

そんで実行。

Aebi:temp ebi$ java Fuga
int: 1

知ってれば予想通りですかね。知らなければなんぞこれになるかもしれません。
この問題 (Java としてはごく当たり前の動きなのですが) で「変更が全然反映されない…」と悩む人がたまーにいるとかいないとか。

気になった方は id:irof さんの classファイルを触ってはいけない - 日々常々 を一読されることをおすすめします *1
*2

*1:このリンクがしたくてエントリ書いたようなものです。本文も irof さんのエントリのコピペです

*2:最近似たような話を耳にすることが何度かあったのですよね…