Object类

Object类是所有Java类的根父类。如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object 类,public class Person { ... } 等价于public class Person extends Object { ... } ,因此Object类中的功能(属性、方法)就具有通用性。例如:

method(Object obj){…} //可以接收任何类作为其参数 
Person o=new Person(); 
method(o);

注意:数组也作为Object类的子类出现,可以调用Object类中声明的方法

int[] arr = new int[]{1,2,3};
System.out.println(arr.getClass().getSuperclass());

 

一、类结构剖析

1.1 属性

1.2 构造器

Object类只声明了一个空参的构造器:public Object()

1.3 方法

Modifier and Type Method and Description
protected Object clone() Creates and returns a copy of this object.
boolean equals(Object obj) Indicates whether some other object is "equal to" this one.
protected void finalize() Called by the garbage collector on an object when garbage collection determines that there are no more references to the object.
Class<?> getClass() Returns the runtime class of this Object.
int hashCode() Returns a hash code value for the object.
void notify() Wakes up a single thread that is waiting on this object's monitor.
void notifyAll() Wakes up all threads that are waiting on this object's monitor.
String toString() Returns a string representation of the object.
void wait() Causes the current thread to wait until another thread invokes the notify()method or the notifyAll() method for this object.
void wait(long timeout) Causes the current thread to wait until either another thread invokes the notify() method or the notifyAll() method for this object, or a specified amount of time has elapsed.
void wait(long timeout, int nanos) Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object, or some other thread interrupts the current thread, or a certain amount of real time has elapsed.

二、Object类的使用

2.1 equals()方法

equals方法在Object类中定义如下:

public boolean equals(Object obj) {
    return (this == obj);
}

2.1.1 ==操作符

  • 可以使用在基本数据类型变量和引用数据类型变量中

  • 如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等。(不一定类型要相同)

  • 如果比较的是引用数据类型变量:比较两个对象的地址值是否相同,即两个引用是否指向同一个对象实体

  • 补充: == 符号使用时,必须保证符号左右两边的变量类型必须一致(可自动转换的基本数据类型除外),否则编译出错。

//基本数据类型
int i = 10;
int j = 10;
double d = 10.0;
boolean b = true;
char c = 10;
System.out.println(i == j);//true
System.out.println(i == d);//true
//System.out.println(i == b);//boolean不参与
System.out.println(i == c);//true
char c1 = 'A';
char c2 = 65;
System.out.println(c1 == c2);//true
//引用类型:
Customer cust1 = new Customer("Tom",21);
Customer cust2 = new Customer("Tom",21);
System.out.println(cust1 == cust2);//false
String str1 = new String("Test");
String str2 = new String("Test");
System.out.println(str1 == str2);//false

2.1.2 equals()方法

语法格式:obj1.equals(obj2)

所有类都继承了Object,也就获得了equals()方法,并且可以重写。 equals()方法只能比较引用类型,Object类中定义的equals()方法作用与“==”相同,比较是否指向同一个对象

Customer cust1 = new Customer("Tom",21);
Customer cust2 = new Customer("Tom",21);
System.out.println(cust1.equals(cust2));//false

但对于类File、String、Date及包装类 (Wrapper Class)来说,他们都都重写了Object类中的equals()方法,重写以后,比较的不是两个引用的地址是否相同,而是比较两个对象的"实体内容"是否相同。

String str1 = new String("Test");
String str2 = new String("Test");
System.out.println(str1.equals(str2));//true
Date date1 = new Date(32432525324L);
Date date2 = new Date(32432525324L);
System.out.println(date1.equals(date2));//true

通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的"实体内容"是否相同。那么,我们就需要对Object类中的equals()进行重写。重写的原则也即比较两个对象的实体内容是否相同

IDE自动生成equals()方法:

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Person person = (Person) o;
    return age == person.age && Objects.equals(name, person.name);
}

手动重写equals()方法:

@Override
public boolean equals(Object obj) {
    if (this == obj) {
        return true;
    }
	if (obj instanceof Customer) {
        Customer cust = (Customer) obj;
        //比较两个对象的每个属性是否都相同
        return this.age == cust.age && this.name.equals(cust.name);
    } else {
        return false;
    }
}

2.1.3 ==操作符和equals()方法的区别

== 既可以比较基本类型也可以比较引用类型:对于基本类型就是比较值,对于引用类型就是比较内存地址。

equals的话,它是属于java.lang.Object类里面的方法,如果该方法没有被重写过默认也是==。通常情况下,自定义类会重写equals方法,比较类中的相应属性是否都相等。

2.2 toString()方法

Object类中toString()的定义:

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

toString()方法在Object类中定义,其返回值是String类型,返回类名和它的引用地址。

在进行String与其它类型数据的连接操作时,自动调用toString()方法:

Date now=new Date();
System.out.println(“now=”+now); 
//相当于
System.out.println(“now=”+now.toString());

 像String、Date、File、包装类等都重写了Object类中的toString()方法使得在调用对象的toString()时,返回"实体内容"信息。如String 类重写了toString()方法,返回字符串的值:

s1=“hello”;
System.out.println(s1);//相当于System.out.println(s1.toString());

基本类型数据转换为String类型时,调用了对应包装类的toString()方法:

int a=10; 
System.out.println(“a=”+a);

 可以根据需要在用户自定义类型中重写toString()方法,当调用此方法时,返回对象的"实体内容"。如Customer类:

@Override
public String toString() {
    return "Customer{" +
        "name='" + name + '\'' +
        ", age=" + age +
        '}';
}

 注意:

String s = "abc";
s = null;
System.out.println(s);//null
System.out.println(s.toString());//出现NullPointerException

 

版权声明:
作者:jackqiang
链接:http://www.jackqiang.com/javase/classes/1895/objectl/
来源:JackQiang's
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录