Javaよくある筆記試験面接問題解析(八):finalとstatic final変数(参照タイプ)の参照は変わらない


public class FinalReferenceTest {  
    public static final StringBuffer sb = new StringBuffer();  
    public static void main(String[] args){  
        sb.append("hello");  
    }  
}  
public class FinalReferenceTest {
 public static final StringBuffer sb = new StringBuffer();
 public static void main(String[] args){
  sb.append("hello");
 }
}
問題1:上のプログラムはコンパイルできますか?もしできるならば、理由を説明して、もしできないならば、理由を説明してください.
解答:コンパイルできます.
分析:final修飾の参照タイプについて、果たしてこの参照は変更できないのか、それともこの参照が指すオブジェクトの内容は変更できないのか.答えは引用は変えられないが、引用が指す内容は変えることができる.
質問2:上のプログラムは文sb.append(「hello」)にあります.後に文sb=new StringBuffer()を追加してコンパイルできますか?もしできるならば、理由を説明して、もしできないならば、理由を説明してください.
解答:コンパイルできません.
分析:final修飾の参照タイプは、参照は変更できないため、参照が指す内容は変更できます.sbは最初のnew...で生成されたオブジェクトを指しているので、もう変更できないので、文sb.append(「hello」)で;後に文sb=new StringBuffer()を追加するとコンパイルできません.
まとめ:finalタイプの参照変数では、変更できないとは、その参照が変更できないことを意味します.