class Compare
{ String s=new String("a");
  public void fun()
  { String s=new String("a")
    System.out.println(s==this.s);
  }
}
 像这而==比较对象输出是false,这儿成员变量和方法中的变量一模一样,==比较地址不相等。s对象在堆中开辟内存空间,在栈中存储引用,也就是地址值。这儿成员变量和局部变量中,在栈中的地址没有共享,而是两个不同地址所以输出是false?

解决方案 »

  1.   

    类似楼主说的,可以这么理解,用new 创建出的变量存储在堆地址当中,栈地址中的引用变量指向堆地址。
    因为堆地址所指的东西不同,所以输出false。一般比较两个对象的相等的话,一般用equal()方法比较,这样比较直观。也可以重写 equal()方法得到自己想要的结果
      

  2.   

    楼上说的对,String是一个封装类, new 出来的东西是对象或者说成员变量, 对象的比较是要用到equal()方法
    String类下有一个equal()方法,你可以去api文档看看。
      

  3.   

    解释下:String变量,String常量的几个问题:String s1="abc";表示在栈区一个引用指向了String常量池中的字符串常量:"abc"
    String s2=new String("abc");表示在栈区创建一个引用(地址)指向了堆区的new String()对象,而这堆区的对象指向了字符串常量池中中"abc";
    String s3=new String("abc");道理也是一样栈区创建一个引用(地址)指向了堆区的new String()对象,这个对象也指向了池中的"abc"
    注意:两次new出来的对象地址不可能是一样的,这里s2,s3指向是不同的,java之所以这样设置两层指向,为了提高效率,面试中常考
      

  4.   

    class Compare
    { String s="a";
      public void fun()
      { String s="a";
      System.out.println(s==this.s);
      }
    }
    可以试试这个!