对象的创建 Java中:string s = "Helloworld"s.toUpperCase(); 中s并没有通过new关键字创建对象,为什么能够调用string类中的方法??? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 因为这样创建字符串会在字符串常量池里创建"Hello月经贴" 这是字面值赋值方式,在String Pool(字符串池)中创建这个对象,并将所创建的对象的引用返回给s;而String s=new String("helloworld");则是先在字符串池中创建这个对象,再在堆(内存的一种)中创建这个对象并将堆中所创建的对象的引用返回给s; 在java中有一个字符常量的池,String s="helloworld";先在池中找有没有这个常量字符串,有的话,把字符串的引用s指向"helloworld"的首地址。如果没有就把"helloworld"字符串放入池中,然后把他的地址返回给s引用。String str1=new String("helloworld");String str2=new String("helloworld");如果用这种方式建立对象的话,str1与str2不相等,用new关键字,建立一个字符串对象的时候,会在内存的堆中给对象分配存储空间,返回这个对象的引用(即地址)。那么对于str1与str2来说相当建立了两个字符串的对象,也就是String类的实例。会在堆中分配两块存储区来存放这两个对象,它们的地址当然是不会相等的了。如果有如下语句:if(str1==str2)System.out.println("equal");elseSystem.out.println("not equal");输出:not equal这里虽然是这两个对象的内容是相等的。但是这里的str1和str2里面的值是这两个对象的引用。所以当然是不等的了。那么要比较两个对象的内容怎么办呢:在java中提供了一个方法,也是每一个对象都有的方法boolean equals(Object anObject) 这个方法是继承java中的基类Object的。具体的资料你可以去查java的帮助文档;那么对于下面的例子:String str1="helloworld";String str2="helloworld";if(str1==str2)System.out.println("equal");elseSystem.out.println("not equal");输出结果:equal因为在定义str1是把"helloworld"这个字符串常量放进常量池中。并把它的引用返回个str1在定义str2时,系统先在常量池中找看有没有"helloworld"这个常量,这时侯系统找到了,直接把它的引用返回个str2,所以实际上这时侯str1和str2都指向同一个字符串常量。所以他们的引用是相等的。 这就是String 比较特殊的一个地方 string s = "Helloworld"过程中是把"Helloworld"保存到常量池中,同时在常量池中创建了一个对象,并把这个对象的引用传给了s 像String等类型的,java自动创建的,你要是用自己定义其他的对象,还是要创建的 小菜奔泪啊、求大虾大婶帮看下我的代码错我,我咋就不会改呢? 如何做自己的jar文件 System.in问题 给自己的 大家看看, 这段程序为什么无法编译通过 static的作用? prepareStatement的问题? 请问哪里 有 java 编程思想 第二版下载?我这个小地方买不到 Applet中如何读取一个客户端文件?急,在线给分 请问FRONTPAGE里的表单和数据库怎么相连 批量载入图片内存溢出怎么解决? 求教对象转换的问题
而String s=new String("helloworld");则是先在字符串池中创建这个对象,再在堆(内存的一种)中创建这个对象并将堆中所创建的对象的引用返回给s;
先在池中找有没有这个常量字符串,有的话,把字符串的引用s指向"helloworld"的首地址。如果没有就把"helloworld"字符串放入池中,然后把他的地址返回给s引用。String str1=new String("helloworld");
String str2=new String("helloworld");如果用这种方式建立对象的话,str1与str2不相等,用new关键字,建立一个字符串对象的时候,会在内存的堆中给对象分配存储空间,返回这个对象的引用(即地址)。
那么对于str1与str2来说相当建立了两个字符串的对象,也就是String类的实例。会在堆中分配两块存储区来存放这两个对象,它们的地址当然是不会相等的了。如果有如下语句:
if(str1==str2)
System.out.println("equal");
else
System.out.println("not equal");
输出:not equal这里虽然是这两个对象的内容是相等的。但是这里的str1和str2里面的值是这两个对象的引用。所以当然是不等的了。那么要比较两个对象的内容怎么办呢:在java中提供了一个方法,也是每一个对象都有的方法
boolean equals(Object anObject) 这个方法是继承java中的基类Object的。具体的资料你可以去查java的帮助文档;那么对于下面的例子:
String str1="helloworld";
String str2="helloworld";
if(str1==str2)
System.out.println("equal");
else
System.out.println("not equal");
输出结果:equal因为在定义str1是把"helloworld"这个字符串常量放进常量池中。并把它的引用返回个str1
在定义str2时,系统先在常量池中找看有没有"helloworld"这个常量,这时侯系统找到了,直接把它的引用返回个str2,所以实际上这时侯str1和str2都指向同一个字符串常量。所以他们的引用是相等的。