Java常用API之Object

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()方法,或者某些其他线程中断当前线程,或一定量的实时时间。

猜你喜欢

转载自blog.csdn.net/weixin_45772185/article/details/115263943