解决方案 »
- Java DOM读取XML出错
- applet中怎么换行啊!!!!!!!!!!!
- 计算器的改良(一道程序设计题~不知道发到哪个模块里面~先发这里)
- 怎样在JTable里设定单元格的cellrender
- JAVA编程如何检测操作系统版本和CPU的ID号
- 【正则表达式】String.split()时以“:”分隔,但是可以排除“?:”
- 请问哪里可以下载《Effective java 中文版》?
- 这个访问控制符帮忙看一下,谢谢了!!!
- 为什么再jb7里面按F9会出现配置对话框?配置完了之后,在按F9又没反应???
- 请教:浮点运算的问题?
- 我是新手,大神来帮忙看看这段代码有什么问题吧!运行后无显示。
- 求个正则表达式
1、Java的对象分为两种,数据对象和引用对象。String属于引用对象, == 比较的是两个对象的引用地址也就是内存地址
2、String常量池:Java为了更有效地使用内存,JVM留出一块特殊的内存区域,被称为“String常量池”,当编译器遇见String常量的时候,它检查该池内是否已经存在相同的String常量;
3、第一次使用 "javajava" 这个对象时,JVM会隐式的声明一个String对象,这个String对象被放在了常量池中。s3的值在编译时就已经确认了,而s1和s2则是在运行时才能确认;
public class A1 {/**
* @param args
*/
final String s1;
final String s2;
final String s3="java";
{
s1 = "java";
}
public A1(){
s2 = "java";
}
public void display(){
System.out.println(s1+s1);
System.out.println(s2+s2);
System.out.println(s3+s3);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
A1 a = new A1();
a.display();
}
}public void display()
{
System.out.println(this.s1 + this.s1);
System.out.println(this.s2 + this.s2);
System.out.println("javajava");
}反编译上面的代码,发现s3+s3其实在编译时已经确认了,所以说,这个和直接写成 “javajava”效果是一样的
而s1 + s1 这个是在运行时才确认的,运行时的对象都是存储于堆中的,那么自然,对于这个对象 s1 + s1 它在内存中的地址也存在于堆中,只是它指向了常量池的一个 "javajava" 对象。也就是说 s1 + s1 表示的是一个堆中的地址,但是它的值是常量池中 "javajava" 对象的地址值
final 的用法,对象的引用不改变,只能改变对象的内容,所以s3+s3只是把对象的内容变成了javajava,所以就是true。