java中String数据类型
对于字符串对象来说虽然在参数传递的时候也是引用传递但是java虚拟机在函数内部对字符串对象进行了特殊处理视String对象为常量(final) 所以对传进来的引用地址所引用的string对象比能直接进行修改而是产生一个副本对其进行操作对其进行的操作不会影响原来的值
下面我们看一例子(sun认证试题)来证明这一点
public class X {
public static void main (String[]args) {
string s = new string (Hello);
modify(s);
SystemoutprintIn(s);
}
public static void modify (String s) {
s += world!;
}
}
你说它会打印出什么结果?是Helloworld?可能大部分人会说是这个答案吧哈哈结果却是Hello为什么呢?再仔细分析一下上边所说的吧视String对象为常量(final) 这是问题的关键!在modify()方法中传进了string对象虽然是引用传递上边我们说了视String对象为常量(final)它不会修改原来地址所引用的值而是生成一个副本对其进行操作所以打印结果应该为Hello!下面再讲一讲java中对常量(final)是怎样处理优化的以便更深入的理解上面的问题
java中的final变量java编译器是进行了优化的每个使用了final修饰的变量的地方都不会通过连接而进行访问比如说Test类中使用了Data类中一个final的int数字fNumber=这时候java编译器会将这个常数编译到Test类的指令码或者常量池中这样每次Test类用到fNumber的时候不会通过引用连接到Data类中进行读取而是直接使 用
我们再来举个例子说明这一点
public class TestFinal(){
public static void main(string s[]){
Systemoutprintln(FinalDatadate);
}
public class FinalData(){
public static final data=;
}
}
运行上面的TestFinal类结果为
但是你把FinalData类中的data=编译后再运行TestFinal类结果还是这是因为编译器把data的副本保存TestFinal类中所以在重新编译TestFinal类之前TestFinal类一直把data认为是而不是是不是证明了上面所讲述的每个使用了final修饰的变量的地方都不会通过连接而进行访问!结合这个例子再深入的想一想第一个问题是不是就理解的更加清晰了