Object类
1、Object类介绍
在Java中,所有的类都直接的或间接的继承了Object类,Object类是所有类型的父类,是类结构中的根。全限定名为:java.lang.Object。如果一个类没有明确指定继承哪个类,那么它就默认的继承Object类。下面是jdk的api文档中的定义:
Object类中提供的所有方法如下:
如果不算方法重载的话,一共9种:
- clone():创建并返回此对象的副本。
- equals(Object obj) :指示一些其他对象是否等于此。
- finalize() :当垃圾收集确定不再有对该对象的引用时,垃圾收集器在对象上调用该对象。
- getClass() :返回此 Object的运行时类。
- hashCode() :返回对象的哈希码值。
- notify() :唤醒正在等待对象监视器的单个线程。
- notifyAll() :唤醒正在等待对象监视器的所有线程。
- toString() :返回对象的字符串表示形式。
- wait重载的3种:当前线程等待。
下面对常用的几种方法进行说明:getClass方法、hashCode方法、equals方法、toString方法。
2、getClass方法
此方法返回对象执行时的Class实例,此实例调用getName方法可以获取类的名称。以下是源码:
api文档说明如下:
以下进行测试,先创建一个Person类:
public class Person {
private String name;
private String sex;
private int age;
public Person() {
}
public Person(String name, String sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
测试方法:
public static void main(String[] args) {
Person per = new Person("云过梦无痕", "男", 25);
System.out.println(per.getClass());
System.out.println(per.getClass().getName());
}
控制台:
记住一点即可,getClass方法返回的是运行时类,然后通过getName方法可以获取完全限定类名。
3、hashCode方法
此方法返回对象的哈希码值。源码如下:
api文档说明:
测试:
public static void main(String[] args) {
Person per = new Person("云过梦无痕", "男", 25);
Person per2 = new Person("老云", "男", 25);
Person per3 = per;
System.out.println(per.hashCode());
System.out.println(per2.hashCode());
System.out.println(per3.hashCode());
}
执行,控制台:
不难发现,hashCode方法是与对象的引用地址相关的,如果是new出来的,那么它们的哈希码值一定不同。
4、equals方法
比较两个对象是否相等,比较的是对象的内容,注意区分equals和==。源码如下:
api文档:
测试:
public static void main(String[] args) {
Person per = new Person("云过梦无痕", "男", 25);
Person per2 = new Person("老云", "男", 25);
Person per3 = per;
System.out.println(per.equals(per2));
System.out.println(per == per2);
System.out.println(per.equals(per3));
System.out.println(per == per3);
String s1 = "yanchengzhi";
String s2 = "yanchengzhi";
System.out.println(s1.equals(s2));
System.out.println(s1 == s2);
}
执行,控制台:
注意区分equals与==的区别,equals是比较对象内容是否相同, == 是比较引用地址是否相同,String类型的话涉及到了常量池,这里略过。
5、toString方法
此方法会将一个对象返回为字符串形式,通常会重写toString方法。源码如下:
如果不重写此方法,那么返回的是:
对象的全限定名 + @ + 此对象的哈希码值的十六进制表示
api文档:
下面进行测试一下:
public static void main(String[] args) {
Person per = new Person("云过梦无痕", "男", 25);
System.out.println(per.toString());
}
执行,控制台:
然后我在Person类中覆盖toString方法:
@Override
public String toString() {
return "【name:" + this.getName() + "," + "sex:" + this.getSex()
+ "," + "age:" + this.getAge() + "】";
}
再执行,控制台:
api文档给我们的建议是:建议所有子类覆盖toString方法。
6、总结
Object中的有些方法是不能够重写的,方法前面加了final修饰符,而有些方法却可以覆盖,这也是出于安全考虑吧,注意即可。