结构
源码
package java.lang;
public class Object {
private static native void registerNatives();
/**
静态代码块 一进来就执行native 方法
*/
static {
registerNatives();
}
public final native Class> getClass();
public native int hashCode();
public boolean equals(Object obj) {
return (this == obj);
}
protected native Object clone() throws CloneNotSupportedException;
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
public final native void notify();
public final native void notifyAll();
public final native void wait(long timeout) throws InterruptedException;
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
timeout++;
}
wait(timeout);
}
public final void wait() throws InterruptedException {
wait(0);
}
protected void finalize() throws Throwable { }
}
示例类
package com.ghg.mybatis_study.test;
public class User {
private String userName;
private Integer age;
public User(String userName, Integer age) {
super();
this.userName = userName;
this.age = age;
}
public User() {
super();
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
registerNatives
private static native void registerNatives();
static {
registerNatives();
}
该方法被声明为是一个private static native方法,该方法的调用执行是在接下来声明的static块中:
该方法主要是为了服务于JNI(Java Native Interface)的,它主要是提供了java类中的方法与对应C++代码中的方法的映射,方便jvm查找调用C++中的方法。
getClass()方法
public final native Class> getClass();
该方法被声明为public final native方法,这说明该方法无法被重写,且是一个本地方法,通过API文档,我们可以了解到:该方法将返回对象的运行时类。例如
public static void main(String[] args) {
User user = new User();
System.out.println(user.getClass());
}
class com.ghg.mybatis_study.test.User
equals方法
public boolean equals(Object obj) {
return (this == obj);
}
可以看出默认情况下equals进行对象比较时只判断了对象是否是其自身,当我们有特殊的“相等”逻辑时,则需要覆盖equals方法。
public static void main(String[] args) {
User user1 = new User("张三",18);
User user2 = new User("张三",18);
System.out.println(user1.equals(user2));
}
false
重写equals
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof User))
return false;
User other = (User) obj;
return other.getUserName().equals(this.userName) && other.getAge().equals(this.age);
}
hashCode方法
public native int hashCode();
不是static的可以被重写
看下默认的
public static void main(String[] args) {
User user = new User();
System.out.println(user.getClass());
System.out.println(user.hashCode());
}
class com.ghg.mybatis_study.test.User
869295101
当我们覆盖了equals方法时,一定不能忘记覆盖hashCode方法。
重写hashCode
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((age == null) ? 0 : age.hashCode());
result = prime * result + ((userName == null) ? 0 : userName.hashCode());
return result;
}
toString
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
默认的toString方法仅仅返回类名+当前实例hashCode值的十六进制串
例如:
public static void main(String[] args) {
User user1 = new User("张三",18);
User user2 = new User("张三",18);
System.out.println(user1.equals(user2));
System.out.println(user1.toString());
System.out.println(user2.toString());
}
true
com.ghg.mybatis_study.test.User@bd8d8
com.ghg.mybatis_study.test.User@bd8d8
重写
@Override
public String toString() {
return "User [userName=" + userName + ", age=" + age + "]";
}
true
User [userName=张三, age=18]
User [userName=张三, age=18]
clone方法
protected native Object clone() throws CloneNotSupportedException;
clone方法将创建和返回该对象的一个拷贝。这个“拷贝”的精确含义取决于该对象的类。
一个标准的clone实现需要做到以下两点:
(1)调用super.clone()方法
(2)对于对象中的所有引用类型,均需要实现Cloneable接口,并重写clone方法,然后对每个引用执行clone方法。
wait、notify、notifyAll方法
public final void wait() throws InterruptedException {
wait(0);
}
public final native void notify();
public final native void notifyAll();
这三个方法都是public final native的。不可以被子类重新,且都是本地方法。这三个方法提供了java线程间等待、挂起等协同机制,是java多线程的基础
finalize
protected void finalize() throws Throwable { }
“当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法”。
“finalize方法可以采取任何操作,其中包括再次使此对象对其他线程可用;不过,finalize的主要目的是在不可撤消地丢弃对象之前执行清除操作”。
“Java 编程语言不保证哪个线程将调用某个给定对象的finalize方法”。
“对于任何给定对象,Java 虚拟机最多只调用一次finalize方法”。