我有很多概念都没明白,现在反过头来认识。

Object是所有类的父类。
java.lang.String也是继承自java.lang.Object中。

先比较一下2个类的toString()、equals()、= = (很多面试题都有),再来说一下String 的特殊。

2个类toString()的比较:

class Test {
    
public static void
 main(String [] args) {
        Object obj 
= new
 Object();
        Dog d 
= new
 Dog();
        String s 
= new String("abc"
);
        
        System.out.println(
"obj = " +
 obj);    
        System.out.println(
"d = " +
 d);
        System.out.println(
"s = " +
 s);
    }
}

class
 Dog {}

结果:

obj 
=
 java.lang.Object@c17164
=
 Dog@1fb8ee3
=
 abc


查阅API文档:

Object类的 public String toString()   returns  
                    getClass().getName() 
+ '@' +
 Integer.toHexString(hashCode())
String类的  
public
 String toString()   returns  
                      the string itself.


说明String类重写了Object的toString方法。

2个类equals()、= =比较:

class Test {
    
public static void
 main(String [] args) {
        
        
//比较equals()和==

        Dog d1 = new Dog(1);
        Dog d2 
= new Dog(1
);
        
        System.out.println(
"d1 == d2 " + (d1 == d2)); //false

        System.out.println("d1.equals(d2) " + d1.equals(d2)); //false
        
        String s1 
= new String("abc"
);
        String s2 
= new String("abc"
);
        String s3 
= "abc"
;
        
        System.out.println(
"s1 == s2 " + (s1 == s2)); //false

        System.out.println("s1.equals(s2) " + s1.equals(s2)); //ture
        
        System.out.println(
"s1 == s3 " + (s1 == s3)); //false

        System.out.println("s1.equals(s3) " + s1.equals(s3)); //true
    }
}

class
 Dog {
    
private int
 i;
    Dog(){}
    Dog(
int
 i){
        
this.i =
 i;
    }
}

 

"=="是比较2个对象的引用是否指向同一个地址,如果是比较2个基本类型,那么就是比较2个值是否相等。
我new了2个Dog类,他们2个对象的栈引用肯定不能指向同一个堆地址。第二个String对象"=="的比较也是同样道理。所以都返回了false(第三个比较体现了String的特殊类,等下说明)。

查阅jdk的源代码:"equals"在Object中定义为

public boolean equals(Object obj) {
    
return (this ==
 obj);
}

这就表示一个类如果没有重写该方法的话,它就是比较两个的引用是否指向了同一个地址(和"=="比较是一致的)。
类库里的类基本都重写的该方法,所以是比较2个对象的内容是否一样的(String方法重写了该方法,所以第二个equals比较返回ture),对于外面自己自定义的类,则需要自己重写该方法来达到内容是否相等的逻辑。


特殊对象String的equals()、= =比较

String s = newString("abc");和String s = "abc";
首先2个对象在内存分布上是不一样的。第2个对象是s的栈引用指向数据片段区的地址(存放字符串常量,静态成员变量)。第1个new出来的对象是s的栈引用指向堆中的地址(存放在堆中)。通过API文档:新创建的字符串对象s是该参数字符串("abc")的副本。

所以如代码所表示:"=="比较是不一样的,equals方法由于String重写了,比较是字符序列。

 

String s1 = "abc"    和  String s2 = "abc"比较;

"=="和equals方法都返回ture;
s1分配了字符常量"abc",那么再有"abc"要引用给对象,都不会再分配内存空间了。
所以s1 和s2 指向的空间相同,内容也相同。

posted on 2008-12-06 08:53 天长 阅读(1622) 评论(1)  编辑  收藏
Comments
  • # re: Object中的特殊类String(toString()、equals、==)[未登录]
    conjs
    Posted @ 2008-12-06 11:07
    讲的非常清楚  回复  更多评论   

只有注册用户登录后才能发表评论。


网站导航: