1.Object类简介
Class Object是类Object结构的根。 每个类都有Object作为超类。 在Java中只有基本数据类型不是对象不继承Object类,其他所有对象(包括数组)都实现了这个类的方法。
定义一个Java类如下:
public class Demo{
//测试类
}
定义一个继承Object的Java类如下:
public class Demo extends Object{
//测试类
}
这两个类是完全相同的,因为如果一个类不指定继承哪个父类的话,默认继承Object类。
在Object类中有一个空构造函数:
public Object()
使用Object类型可以接受所有对象:
public class Demo {
public static void main(String[] args) {
Object ob1=new Person();
Object ob2=new Dog();
}
}
class Person{
public Person(){
System.out.println("Person().....");
}
}
class Dog{
public Dog(){
System.out.println("Dog().....");
}
}
输出结果:
Person().....
Dog().....
2.Object类常用方法
2.1equals()方法
在基本数据类型中比较使用==,用来比较两个基本数据类型的值是否相等。
而对象的比较使用的是equals()方法,比较两个对象是否相等。
Object底层中equals()方法:
public boolean equals(Object obj) {
return (this == obj);
}
由此可知equals()方法的含义是指示一些其他对象是否等于此。
举个例子证明equals()方法比较的是两个对象而不是值:
public class Demo {
public static void main(String[] args) {
Person p1=new Person(20,"Ning");
Person p2=new Person(20,"Ning");
System.out.println(p1.equals(p2));
}
}
class Person{
private int age;
private String name;
public Person(){
}
public Person(int age,String name){
this.age=age;
this.name=name;
}
}
代码运行结果是false,这时就会有人疑惑到,明明这两个类成员变量是一致的,为什么还是输出false呢,原因就是equals比较的是p1和p2这两个对象的地址,在代码中new了两次,所以在堆内存中创建了两个对象,显然这两个对象的地址是不相同的,所以会输出false。
那有人就会问怎么使用equals()方法来比较两个对象的成员属性是否相同呢,这就需要在类中重写equals()方法来实现:
public class Demo {
public static void main(String[] args) {
Person p1=new Person(20,"Ning");
Person p2=new Person(20,"Ning");
System.out.println(p1.equals(p2));
}
}
class Person{
private int age;
private String name;
public Person(){
}
public Person(int age,String name){
this.age=age;
this.name=name;
}
public boolean equals(Person p){
if(this.age!=p.age){
return false;
}
else if(this.name!=p.name){
return false;
}else {
return true;
}
}
}
这个代码执行结果输出为true。
equals方法在非空对象引用上实现等价关系:
- 自反性 :对于任何非空的参考值x , x.equals(x)应该返回true 。
- 它是对称的 :对于任何非空引用值x和y , x.equals(y)应该返回true当且仅当y.equals(x)回报true 。
- 传递性 :对于任何非空引用值x , y和z ,如果x.equals(y)回报true个y.equals(z)回报true ,然后x.equals(z)应该返回true 。
- 它是一致的 :对于任何非空引用值x和y ,多次调用x.equals(y)始终返回true或始终返回false ,没有设置中使用的信息equals比较上的对象被修改。
- 对于任何非空的参考值x , x.equals(null)应该返回false 。
2.2toString()方法
toString()方法返回对象的字符串表示形式。 一般来说, toString方法返回一个“textually代表”这个对象的字符串。 结果应该是一个简明扼要的表达,容易让人阅读。 建议所有子类覆盖此方法。
该toString类方法Object返回一个由其中的对象是一个实例,该符号字符`的类的名称的字符串@ ”和对象的哈希码的无符号的十六进制表示。 换句话说,这个方法返回一个等于下列值的字符串: getClass().getName() + ‘@’ + Integer.toHexString(hashCode())
Object类中toString()方法源码:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
示例:
public class DemoToString {
public static void main(String [] args){
Object o1=new Object();
Object o2=new Object();
System.out.println(o1.toString()+'\n'+o2.toString());
}
}
输出结果:
java.lang.Object@1b6d3586
java.lang.Object@4554617c
输出结果为:对象的类型+@+内存地址值,但是在我们现实开发的过程中,我们往往希望看到属性对应字符串的输出形式,所以我们需要对toString()进行重写:
public class Demo {
public static void main(String[] args) {
Person p1=new Person(20,"Ning");
System.out.println(p1.toString());
}
}
class Person{
private int age;
private String name;
public Person(){
}
public Person(int age,String name){
this.age=age;
this.name=name;
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
输出结果:
Person{age=20, name='Ning'}
这里我们也可以直接输出对象p1,同样可以调用toStirng()方法,是因为System类中的println()方法:
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
如果传入的是一个对象,默认会调用toString()方法。
2.3其他方法
- clone() 返回值类型及修饰:protected Object
创建并返回此对象的副本。 - finalize() 返回值类型及修饰:protected void
当垃圾收集确定不再有对该对象的引用时,垃圾收集器在对象上调用该对象。 - getClass() 返回值类型及修饰:类<?>
返回此 Object的运行时类。 - hashCode() 返回值类型:int
返回对象的哈希码值。 - notify() 返回值类型:void
唤醒正在等待对象监视器的单个线程。 - notifyAll() 返回值类型:void
唤醒正在等待对象监视器的所有线程。 - wait() 返回值类型:void
导致当前线程等待,直到另一个线程调用该对象的 notify()方法或 notifyAll()方法。 - wait(long timeout) 返回值类型:void
导致当前线程等待,直到另一个线程调用 notify()方法或该对象的 notifyAll()方法,或者指定的时间已过。 - wait(long timeout, int nanos) 返回值类型:void
导致当前线程等待,直到另一个线程调用该对象的 notify()方法或 notifyAll()方法,或者某些其他线程中断当前线程,或一定量的实时时间。