黑马程序员技术交流社区
标题:
两个小问题,求解
[打印本页]
作者:
朱丽静
时间:
2012-9-2 22:08
标题:
两个小问题,求解
本帖最后由 朱丽静 于 2012-9-2 22:09 编辑
String s1=”abc”+”def”;
String s2=new String(s1);//引用s1的内存地址,所以内容和引用内存地址都会相等
if(s1= =s2)
System.out.println(“= = succeeded”);
if (s1.equals(s2))
System.out.println(“.equals() succeeded”);
为什么这个程序的输出没有“==succeeded
还有另一个问题:
class OverloadDemo{
void testOverload( int i ){
System.out.println(“int”); }
void testOverload(String s){
System.out.println(“String”); }
public static void main(String args[ ]){
OverloadDemo a=new OverloadDemo ( );
char ch=’x’;
a.testOverload(ch); }
}
为什么输出结果竟然是“int”;我觉得自己对java的引用是在是很不懂,望有高手解答
作者:
zhaosenyang
时间:
2012-9-2 22:11
问题1:
String s2=new String(s1);//那不是引用,那只是用S1的值去初始化S2。如果是引用,你改变S2,S1也会变化,实际不会
因为S1不等于S2,也就是说并不是引用,S1和S2是两个独立的对象,用等号是判断这两个对象是否是同一个。S1.equals(S2)是比较这两个字符串的内容是否一样
问题2:
char 跟 int 类型很接近,因为可以强制类型转换
因为char类型就是个字符嘛,其值都对应ascll值,其实就是数字的别名,
而String则独立于int char,不能强制转换。
你上面调用,本来是想调用参数为char的函数,但没有,所以它找了个相近的调用了
作者:
王金科
时间:
2012-9-2 22:34
第一s1和s2是两个不同的对象,对应对象,==比较的是内存地址值,所以s1和s2是不相等的
第2,char和int是可以进行强制类型转换的,而你调用参数为char类型的函数时,没找到,所以就找了int
作者:
何明辉
时间:
2012-9-3 00:16
楼主第一个问题好像没有搞清楚“==”和euqls()方法的区别哦,
当我们所比较的两个变量是引用型变量时,用“==”比较的话比较的是两变量里面的地址值。即直接指向在堆内存内存中的对象实体的地址。而用equals比较的通常是两者所指向引用对象实体里面内容。因为string复写了object中的equals()中的方法,比较的是内容是字符串本身。所以上面的程序不会输出"==succeed"。
当我们比较的是基本类型变量时,那么“==”比较的是两者的里面数值内容。而此时就不能用equals了。
第二个问题好像关于方法重载的为题吧,当你要传入的值有其相应的类型参数接受时就不会强转化为其他类型,如果没有相应的类型且不能强转化为别的类型的话就会报错
所以当你传入的是char 类型的ch时它会自动提成成int类型进行传入。输出的当然是int了。
作者:
刘明月
时间:
2012-9-3 00:27
string类型的变量进行比较时,用.equals时比较的是变量的值,用“==”比较的是内存地址值,String s2=new String(s1);说明s2是新new出来的对象,也就是说s1在内存堆中的位置和s2在内存中的位置是不一样的,即地址值不一样,所以不会输出“= = succeeded“,
另一个问题,出现的原因是char类型的变量被自动转换为int类型的变量了,char类型时2个字节,int类型的变量时4个字节,程序在调用ch时,将ch自动转成了范围大的int类型,所以输出了int
作者:
夏天
时间:
2012-9-3 06:58
混脸熟。。。。。。。。
作者:
张飞年
时间:
2012-9-3 09:49
你这个问题涉及到变量引用和基本数据类型提升的问题。
String s1=”abc”+”def”;
String s2=new String(s1);
第一句是把两个字符串相连,然后把他们的数据区地址给相应对象的成员变量 S1,注意这里两个字符串但只产生一个“abcdef”对象哦。
第二句是new一个新对象在堆内存,然后内容赋值S1,再把该对象堆内存在址给S2。
所以此时的S1与S2中保存的相应的内存地址是不同的,而==可以理解为它就是比较内存地址,所以它的判断相等与否结果为假,故不输出相应的“==suceended”;而S1与S2地址不同,但它们的引用地址上的内容却是相同的,所以s1.equals(s2)会成立。
char ch=’x’;
a.testOverload(ch);
这里ch是char类型,char类型是值类型的,String类型是引用类型,它们之间是不能自动相互转换的。char类型与int类型同为值类型且char向int自动转换时不越界,就此当需要要转换时它会自动转换的,a.testOverload(ch)中的ch其实还是char类型的,只不过你的方法里没有char类型,所以它自动适应找了int类型的。要想验证只需要再加入一个重载方法即可:
void testOverload(char a){
System.out.println("char");
}
作者:
黑马-李勇
时间:
2012-9-3 16:39
可能不对,请指正
未命名.JPG
(13.38 KB, 下载次数: 20)
下载附件
2012-9-3 16:39 上传
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2