目录
1.Object类的概述
Object类在java里面是一个比较特殊的类,java语言开发者为了让这个类组织结构比较方便,它提供了一个最上层的类,相当于所有的类都是从这个类继承,这个类就叫Object类。所以Object类是所有java类的根基类,是所有java类的老祖宗。所有的类,不管是谁,都是从它继承下来的,如下图所示。
Object 类位于 java.lang 包中,编译时会自动导入,我们创建一个类时,如果没有明确继承一个父类,那么它就会自动继承 Object,成为 Object 的子类。
显式继承:
public class demo extends Object{
}
隐式继承:
public class demo {
}
Object类是所有java类的祖先(根基类)。每个类都使用 Object 作为超类(父类)。所有对象(包括数组)都实现这个类里所包含的方法。
2.Object类中的常用方法
1.toString()
Object中toString() 方法用于返回对象的字符串表示形式。
public class Student {
private String name;//姓名
private int age;//年龄
private int num;//学号
public Student(){//无参构造方法
}
public Student(String name, int age, int num) {//有参的构造方法
this.name = name;
this.age = age;
this.num = num;
}
}
首先创建一个Student类,随便声明几个成员变量和构造方法
public class Test {
public static void main(String[] args) {
Student stu1 = new Student("张三",10,100001);//先创建一个Student类的对象
System.out.println(stu1.toString());
System.out.println(stu1);
}
}
再创建一个测试类Test,在Test类中创建main方法,用有参构造方法创建一个Student的对象stu1,并输出student对象
在这可以看到,我们在Student类中并没有定义toString()方法,但是我们调用toString()的时候也没有报错,也可以执行。这是因为Student类继承Object类,而根据我们在继承那学到的,当时用一个方法时,如果子类中没有重写的话,会默认调用父类中的方法,在这块,我们就是使用的是Object类中的toString()方法。还有就是直接输出student对象和调用toStudent()方法,效果是相同的,即就是直接输出student时会默认调用toString()方法。
现在我们看一下我们到底用的是不是Object类中的toString()方法(不会查看源码的同学去我的博客里找一下查看源码的方法)
toString()方法体中
return getClass().getName() + "@" + Integer.toHexString(hashCode());
其中getClass()方法是获得创建stu1对象的Student类的Class类对象(这个就比较难,现在不会也没关系,有兴趣的可以百度学习),简单理解就是getClass()方法可以获得到Student类的所有信息。getClass().getName()可以得到该类的路径;然后后面加的"@"符号是开发者自己定义,在后面的Integer.toHexString(hashCode()),先讲括号里的hashCode()方法,这个方法的作用就是从内存中拿到stu1对象的地址,而1b6d3586看起来怪怪的是因为通过类名Ingeter调用toHexString()方法,将hashCode()方法获得到的内存地址转换成16进制(为什么用16进制而不用其它进制?我认为是转化为16进制比较短,方便肉眼对比两个或多个物理地址是否相同)
注意:
String、Date、File、包装类等都重写了Object类中的toString()方法。使得在调用对象的toString()时,返回"实体内容"信息
2.equals()
Object类中的equals() 方法用于比较两个对象是否相等。
equals() 方法比较两个对象,是判断两个对象引用指向的是同一个对象,即比较 2 个对象的内存地址是否相等"=="是一个效果。
还使用上面创建的Student类
public class Student {
private String name;//姓名
private int age;//年龄
private int num;//学号
public Student(){//无参构造方法
}
public Student(String name, int age, int num) {//有参的构造方法
this.name = name;
this.age = age;
this.num = num;
}
}
首先创建一个Student类,随便声明几个成员变量和构造方法
public class Test {
public static void main(String[] args) {
Student stu1 = new Student("张三", 10, 100001);//先创建一个Student类的对象stu1
Student stu2 = new Student("张三", 10, 100001);//再创建一个Student类的对象stu2
//此时stu1与stu2的内容相同
//因为Student类没有重写equlas(),所以我们调用的就是Object类中的equlas()方法
System.out.println(stu1==stu2);
System.out.println(stu1.equals(stu2));
}
}
再创建一个测试类Test,在Test类中创建main方法,用有参构造方法创建Student的对象stu1和stu2,用"=="和equals()方法比较一下stu1和stu2,并输出。
可以看出两个效果相同,查看一下Object类中equals()方法的源码(不会的同学在我博客里找)
return (this == obj);
其中的this就是指的是stu1,obj就是stu2,所以Object类中equals()底层源码就是用"=="号
注意:
这是说的equals()方法是Object类中的,而java中的大部分类都把equals()方法重写,例如String、Date、File、包装类等都重写了Object类中的equals()方法。
3.hashCode()
Object类中的hashCode() 方法用于获取对象的 hash 值。
还使用上面创建的Student类
public class Student {
private String name;//姓名
private int age;//年龄
private int num;//学号
public Student(){//无参构造方法
}
public Student(String name, int age, int num) {//有参的构造方法
this.name = name;
this.age = age;
this.num = num;
}
}
首先创建一个Student类,随便声明几个成员变量和构造方法
public class Test {
public static void main(String[] args) {
Student stu1 = new Student();
Student stu2 = new Student();
System.out.println(stu1.hashCode());
System.out.println(stu2.hashCode());
}
}
再创建一个测试类Test,在Test类中创建main方法,用有参构造方法创建Student的对象stu1和stu2,通过引用变量调用hashCode(),并输出。
输出就是stu1与stu2在内存中的地址,查看源码
可以看到这个方法是没有方法体的,就像抽象方法一样,这个给大家普及一下,这是本地方法就是电脑操作系统的方法,是由C语言或者C++实现的,java只是负责调用,本地方法native关键字修饰。
注意:
因为hashCode()是本地方法,所以就没有重写这一说。
最后,觉得有用的话,可以点赞、收藏,加关注哟,要不下次就找不见了哟!