finalフィールドの参照
finalフィールドの文字列への参照は、コンパイル時に置き換えられる。
知ってはいたけど確かめたことはなかったので、改めて確認。
まずfinalフィールドを持つクラス。
そして、参照するクラス。
public class A {
public static final String ABC = "xyz";
public static void main(String[] args) {
System.out.println(ABC);
}
}
このMainを実行した結果。
public class Main {
public static void main(String[] args) {
System.out.println("A-ABC : " + A.ABC);
}
}
順当な結果。
A-ABC : xyz
ここで、AのフィールドABCの値を"final"にして、Aのみコンパイルする。
まずは、Aを実行した結果
きちんと変わってる。
final
でも、Mainを実行すると・・・
というわけで、"final"に変更したのに、"xyz"のまま。
A-ABC : xyz
きちんと確認するため、Mainを逆コンパイルしてみる。
逆コンパイルにはjadを使用。
確かにSystem.out.printlnの部分が、A.ABCからただの文字列に置き換わってる。
public class Main
{public Main()
{
}public static void main(String args[])
{
System.out.println("A-ABC : xyz");
}
}
ちなみに、intとかでも置き換わるみたい。
Eclipseとか使ってると意識しないけど、たまーにこういったことで
問題が出るんだよなぁ。