示例:
public class StringTraining {
public static void changeStr(String str){
str = "137878";
}
public static void main(String[] args){
String a = "b";
changeStr(a);
System.out.println(a);
}
}
輸出仍舊為b
分析:首先棧中存的是堆中對象的地址,因為String對象的特殊性(String有自己的常量池),當遇到常量池中沒有的字符串時,String會開辟新的內存空間(生成新對象)。實例中,將a的值(“b”的地址)賦值給了str,從而起初示例中a引用指向“b”,str初始值也是指向“b”;然而當給str重新賦值時,str指向了另一個內存空間(即存儲的是新字符串的地址,相當於給str重新賦值了),因此str指向“137878”,對a沒影響。
情景:當調用外部方法改變String的值是無法生效的,比如我想用外部方法進行參數校驗,當某個String類型參數為空或null時,我給這個參數賦一個默認值,這個賦值動作是無效的,因而當用到該參數時,仍舊會報空指針。