一.Object类
1.Java是面向对象的语言,它的核心思想是:找适合的对象去做适合的事情。那么如何去找适合的对象?
2.创建对象的方式:
(1) 方式一:自定义类,然后通过自定义的类创建对象。
(2) 方式二:sun提供了很多的类给我使用,我们只需要认识这些类,我们就可以通过这些类创建对象了。
3.Object类是所有类的终极父类。 任何一个类都继承了Object类。
二.Object类常用的方法
1.toString( );
(1) 该方法返回该对象的字符串表示。 是返回一个字符串用于描述该对象的。
(2) 实例一:
public class Demo1 {
public static void main(String[] args) {
Object o = new Object();
System.out.println("toString:"+o.toString());
System.out.println(o);
}
}
运行结果如下图所示:
①从运行结果可以看出,toString方法返回的字符串表示为:完整类名+@+对象的哈希码。
②疑问:为什么直接输出一个对象的时候和输出对象的toString方法返回的字符串结果是一样的呢?
通过查看源代码得知,直接输出一个对象的时候,实际上在println方法内部会调用toString方法,把toString方法返回的内容输出。
③查看源代码的方式:
方式一: 按住ctrl键,单击你需要看的源代码.
方式二:把光标移动到你需要查看代码处按下F3.
④查看源代码可以了解别人是如何写出这个技术的,让我们了解的更加的深入。也可以吸收大牛的思想。查看源代码最忌讳的一点: 不要每行代码都弄懂是什么意思,能看个大概猜出意思就足矣。
(3) 实例二:没有重写toString方法
①实例:
class Person {
int id;
String name;
public Person(int id,String name){
this.id = id;
this.name = name;
}
}
public class Demo2 {
public static void main(String[] args) {
Person p = new Person(110,"张三");
System.out.println(p);
}
}
②运行结果:
③由以上运行结果可知,返回的是这个对象的toString方法返回的字符串,这个字符串对于我们而言一点用都没有。如果我们能够输出一个p对象的时候,输出的格式: 编号:110 姓名: 张三。这样就比较完美了,现在要达到输出一个对象的时候用这种格式的字符串来描述Person对象。目前Object的toString方法无法满足子类的需求,那么这时候我们就应该对Object类的toString进行重写。
(4) 实例三:重写toString方法
class Person {
int id;
String name;
public Person(int id,String name){
this.id = id;
this.name = name;
}
@Override
public String toString(){
return "编号:"+this.id+"姓名:"+this.name;
}
}
public class Demo2 {
public static void main(String[] args) {
Person p = new Person(110,"张三");
System.out.println(p);
}
}
运行结果如下图所示:
(5) toString()有何作用?
重写toString之后,我们直接输出一个对象的时候,就会输出符合我们所需求的格式数据。
2.equals( );
(1) equals(Object obj) 方法用于比较两个对象的内存地址,判断两个对象是否为同一个对象。
(2) 实例一:没有重写equals方法。
①实例:
class Person{
int id;
String name;
public Person(int id,String name){
this.id = id;
this.name = name;
}
}
public class Demo3 {
public static void main(String[] args){
Person p1 = new Person(110,"张三");
Person p2 = new Person(110,"狗蛋");
System.out.println("p1与p2是同一个对象吗?"+p1.equals(p2));//false
}
}
②运行结果:
③因为每new一次,Jvm都会开辟一块新的内存空间,所以每new一次,就是一个新的对象。但是在我们现实生活中只要两个人的身份证一致,那么就是同一个人。要实现这种需求也就是父类(Object)的功能无法满足子类的需求,需要重写父类的equals方法。
(3) 实例二:重写equals方法。
①实例:
class Person{
int id;
String name;
public Person(int id,String name){
this.id = id;
this.name = name;
}
@Override
public boolean equals(Object obj){
Person p = (Person)obj;
return this.id == p.id;
}
}
public class Demo3 {
public static void main(String[] args){
Person p1 = new Person(110,"张三");
Person p2 = new Person(110,"狗蛋");
System.out.println("p1与p2是同一个对象吗?"+p1.equals(p2));//true
}
}
②运行结果:
3.hashCode( );
(1) 该方法返回该对象的哈希码值(我们可以把哈希码就理解成是对象的内存地址);
(2) 实例一:没有重写hashCode方法。
①实例:
class Person{
int id;
String name;
public Person(int id,String name){
this.id = id;
this.name = name;
}
@Override
public boolean equals(Object obj){
Person p = (Person)obj;
return this.id == p.id;
}
}
public class Demo3 {
public static void main(String[] args){
Person p1 = new Person(110,"张三");
Person p2 = new Person(110,"狗蛋");
System.out.println("p1与p2是同一个对象吗?"+p1.equals(p2));//true
System.out.println("p1的哈希码:"+p1.hashCode());
System.out.println("p2的哈希码:"+p2.hashCode());
}
}
②运行结果:
(3) java中的规范:一般我们重写了一个类的equals方法,我们都会重写它的hashCode方法。
原因:因为当我们输出p1和p2是否是同一个对象的时候,结果是true,但是他们的哈希码却不一样,会给别人一种自相矛盾的感觉,既然是一个对象,那为什么哈希码会不同?
(4) 实例二:重写hashCode方法。
①实例:
class Person{
int id;
String name;
public Person(int id,String name){
this.id = id;
this.name = name;
}
@Override
public boolean equals(Object obj){
Person p = (Person)obj;
return this.id == p.id;
}
@Override
public int hashCode(){
return this.id;
}
}
public class Demo3 {
public static void main(String[] args){
Person p1 = new Person(110,"张三");
Person p2 = new Person(110,"狗蛋");
System.out.println("p1与p2是同一个对象吗?"+p1.equals(p2));//true
System.out.println("p1的哈希码:"+p1.hashCode());
System.out.println("p2的哈希码:"+p2.hashCode());
}
}
②运行结果: