写出java.lang.Object类的六个常用方法
Posted sinoaccer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了写出java.lang.Object类的六个常用方法相关的知识,希望对你有一定的参考价值。
java是面向对象的语言,而Object类是java中所有类的顶级父类(根类)。
每个类都使用Object类作为超类,所有对象(包括数组)都实现这个类的方法,即使一个类没有用extends明确指出继承于某个类,那么它都默认继承Object类。
Object类中提供了很多方法,这里只取其中比较常用的方法做下简述。
1)public String toString() >>> 获取对象信息的方法
这个方法在打印对象时被调用,将对象的信息变为字符串返回,默认输出对象地址。
举个例子:
/**
* 定义一个类 并重写toString()方法
*/
public class Person { private String name; private int age; private char gender; @Override public String toString() { return "Person{" + "name=‘" + name + ‘‘‘ + ", age=" + age + ", gender=" + gender + ‘}‘; } public Person() { } public Person(String name, int age, char gender) { this.name = name; this.age = age; this.gender = gender; }
/** * 测试类 */ public class Test { public static void main(String[] args) { Person p1 = new Person("张三",22,‘男‘); Person p2 = new Person("李思",23,‘女‘); System.out.println(p1.toString()); System.out.println(p2.toString()); } }
运行结果:与重写的toString()结果结构一致。
2)public boolean equals(Object obj) >>> 对象相等判断方法
该方法用于比较对象是否相等,而且此方法必须被重写。
举个例子:
/** * 定义一个类 并重写equals方法 */ public class Person { private String name; private int age; private char gender; public Person() { } public Person(String name, int age, char gender) { this.name = name; this.age = age; this.gender = gender; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public char getGender() { return gender; } public void setGender(char gender) { this.gender = gender; } /** *重写equals方法 */ public boolean equals(Person p) { return super.equals(p); } }
/** * 测试类 */ public class Test { public static void main(String[] args) { Person p1 = new Person("张三",22,‘男‘); Person p2 = new Person("张三",23,‘男‘); Person p3 = new Person("张三",22,‘男‘); Integer a = 10; Integer b = 10; boolean flag1 = p1.equals(p2); boolean flag2 = p1.equals(p3); boolean flag3 = p1.getName().equals(p2.getName()); boolean flag4 = a.equals(b); System.out.println(flag1); System.out.println(flag2); System.out.println(flag3); System.out.println(flag4); } }
运行结果:equals比较的是地址,即使p1和p3的各个属性一样,但是通过创建对象两者在堆中的地址值是不一样的,因此结果为false。
需要注意的是基本数据类型是没有equals方法的。上述事例中Integer换成int会报错,p1.getGender().equals(p2.getGender())也是不对的。
3)public native int hashCode() >>> 对象签名
该方法用来返回其所在对象的物理地址(哈希码值),常会和equals方法同时重写,确保两个相等的对象拥有相等的.hashCode。
/** * 重写hashCode方法 */ @Override public int hashCode() { return super.hashCode(); }
/** * 测试类 */ public class Test { public static void main(String[] args) { Person p1 = new Person("张三",22,‘男‘); Person p2 = new Person("张三",22,‘男‘); int i1 = p1.getName().hashCode(); int i2 = p2.getName().hashCode(); int i3 = p1.hashCode(); int i4 = p2.hashCode(); System.out.println(i1); System.out.println(i2); System.out.println(i3); System.out.println(i4); } }
运行结果:
由此可见通过new的对象即使属性赋值一致,对象的hashCode也是不一样的。
4)public final native Class<?> getClass() >>> 返回此Object的运行时类
注意:此方法不可重写,要调用的话一般和getName()联合使用,如getClass().getName()
该方法在反射中有大用!
5)线程中常用的方法(此处合在一起说明)
public final void wait() >>> 多线程中等待功能
public final native void notify() >>> 多线程中唤醒功能
public final native void notifyAll() >>> 多线程中唤醒所有等待线程的功能
其中wait()方法还有另外两个带不同功能的方法:
public final native void wait(long timeout) >>> 要等待的最长时间,单位毫秒
public final void wait(long timeout, int nanos) >>> nanos额外时间,单位纳秒
6)protected native Object clone() >>> protected修饰的方法,功能是完成对象的浅复制(创建并返回此对象的一个副本----“副本”的准确含义可能依赖于对象的类)
只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException。
Java中除了8种基本类型传参数是值传递,其他的类对象传参数都是引用传递,我们有时候不希望在方法里将参数改变,这时就需要在类中复写clone方法(实现深复制)。
7)protected void finalize() >>> 垃圾回收(释放资源的方法)
该方法即使被调用也不知道什么时候执行,所以一般很少主动使用。
finalize()方法的用途:
无论对象是如何创建的,垃圾回收器都会负责释放对象占据的所有内存。这就将对finalize()的需求限制到一种特殊情况,即通过某种创建对象的方式以外的方式为对象分配了存储空间。这种情况一般发生在使用“本地方法”的情况下,本地方法是一种在Java中调用非Java代码的方式。
*>>Java的一大特点就是垃圾回收机制。关于垃圾回收需要注意以下几点:
1)对象可能不被垃圾回收。
只要程序没有濒临存储空间用完的那一刻,对象占用的空间就总也得不到释放。
2)垃圾回收并不等于“析构”。
3)垃圾回收只与内存有关。
使用垃圾回收的唯一原因就是为了回收程序不再使用的内存。
综上所述,Object类常用的六种方法是toString()、equals()、hashCode()、wait()、notify()、notifyAll()。
以上是关于写出java.lang.Object类的六个常用方法的主要内容,如果未能解决你的问题,请参考以下文章