A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 朱丽静 初级黑马   /  2012-9-2 22:08  /  1884 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 朱丽静 于 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的引用是在是很不懂,望有高手解答

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
问题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的函数,但没有,所以它找了个相近的调用了

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 很给力!

查看全部评分

回复 使用道具 举报
第一s1和s2是两个不同的对象,对应对象,==比较的是内存地址值,所以s1和s2是不相等的

第2,char和int是可以进行强制类型转换的,而你调用参数为char类型的函数时,没找到,所以就找了int
回复 使用道具 举报
楼主第一个问题好像没有搞清楚“==”和euqls()方法的区别哦,
当我们所比较的两个变量是引用型变量时,用“==”比较的话比较的是两变量里面的地址值。即直接指向在堆内存内存中的对象实体的地址。而用equals比较的通常是两者所指向引用对象实体里面内容。因为string复写了object中的equals()中的方法,比较的是内容是字符串本身。所以上面的程序不会输出"==succeed"。
当我们比较的是基本类型变量时,那么“==”比较的是两者的里面数值内容。而此时就不能用equals了。
第二个问题好像关于方法重载的为题吧,当你要传入的值有其相应的类型参数接受时就不会强转化为其他类型,如果没有相应的类型且不能强转化为别的类型的话就会报错
所以当你传入的是char 类型的ch时它会自动提成成int类型进行传入。输出的当然是int了。
回复 使用道具 举报
string类型的变量进行比较时,用.equals时比较的是变量的值,用“==”比较的是内存地址值,String  s2=new  String(s1);说明s2是新new出来的对象,也就是说s1在内存堆中的位置和s2在内存中的位置是不一样的,即地址值不一样,所以不会输出“= = succeeded“,
另一个问题,出现的原因是char类型的变量被自动转换为int类型的变量了,char类型时2个字节,int类型的变量时4个字节,程序在调用ch时,将ch自动转成了范围大的int类型,所以输出了int
回复 使用道具 举报
混脸熟。。。。。。。。
回复 使用道具 举报
你这个问题涉及到变量引用和基本数据类型提升的问题。
   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");
    }
回复 使用道具 举报
可能不对,请指正

未命名.JPG (13.38 KB, 下载次数: 25)

未命名.JPG
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马