Object是所有类的祖宗,所有对象都继承了Object类的方法
toString()
把当前对象给出一种字符串形式的表示,很底层的转字符串方法
这个方法在很多内置的打印方法和转字符串方法中都会被自动调用
System.out.println内部调用了String.valueOf,
String.valueOf内部调用了toString
所有的对象继承的祖宗toString()方法只会返回它的地址(如下)
test.javaJilu@3f3afe78
不过你自己定义的类可以重写toString(),定义它转字符串的形式
class Student{
String name = "小明";
int age = 14;
@Override
public String toString(){
return "name:"+this.name+"age:"+String.valueOf(age);
}
}
之后就算不主动调用toString(),在System.out.print的时候也会调用你重写的toString从而改变结果
equals()
比较两个对象
底层Object给出的equals很简单,就是用==比较两个对象地址
但你可以为自己的类重写equals方法,String类就重写了equals方法:
源代码如下,它可以去写一个equals(String str)但是它没有,它是方法签名原封不动地重写了Object的方法。因为前者是重载而后者是重写,如果产生以下情况你重载的这个equals(String str)就不会被用到,实际调用的还是Object的equals:
用一个自己的myString代替一下
class myString{
String str = null;
myString(String s){
str = "s";
}
public boolean equals(myString s){
return this.str.equals(s.str);
}
}
Object str1 = new myString("一号");
myString str2 = new myString("一号");
myString str3 = new myString("一号");
System.out.println(str1.equals(str2));//False
System.out.println(str2.equals(str1));
System.out.println(str2.equals(str3));
输出如下:
false
false
true
解释:
- Object类型的str1只能调用Object的equals去对比str2的地址,自然返回false
- myString类型的str2只重载了一个接收myString参数的equals,str2在使用equals比较str1时没法用这个重载的equals,还是只能去找参数为Object类型的equals,就是Object的equals,所以也返回false
- myString类型的str2去比较同为myString的str3,那可以成功调用到自己重载的equals,返回true
getClass()
返回这个对象的类名,当然是带包名的,类名用$分割
str2.getClass();
"class test.javaJilu$1myString"
hashCode()
返回对象的哈希码