文章目录
1.Object类简介
Object类是java默认的提供的一个类,Object类是所有类的父类,也就是说任何一个类的定义的时候,如果没有明确的继承一个父类的话,那么它就是Object的子类
以下两种类的定义的最终效果是完全相同的:
class Person{}
class Student extends Object{}
public class Main{
public static void main(String[] args) {
Object person = new Person();
Object student = new Student();
}
}
Object类属于java.lang(External Libraries->rt.jar->java->lang)包,此包下的所有类在使用的时候无需手动导入,系统会在程序编译期间自动导入
2.Object中常见的方法
2.1 clone方法
保护方法,实现对象的浅复制 ,只有实现了cloneable接口才能调用该方法,否则会抛出CloneNotSupportedException异常。
clone函数返回的是一个引用,指向的是新的clone出来的对象,此对象与原对象分别占用不同的堆空间。
protected native Object clone() throws CloneNotSupportedException;
package com.corn.objectsummary;
import com.corn.Person;
public class ObjectTest {
public static void main(String[] args) {
Object o1 = new Object();
// The method clone() from the type Object is not visible
Object clone = o1.clone();
}
}
2.2 getClass方法
final方法,返回Class类型的对象,反射来获取对象
返回此 Object 的运行时类。
public final native Class<?> getClass();
getClass()也是一个native方法,返回的是此Object对象的类对象/运行时类对象Class<?>。效果与Object.class相同。
首先解释下"类对象"的概念:在Java中,类是是对具有一组相同特征或行为的实例的抽象并进行描述,对象则是此类所描述的特征或行为的具体实例。作为概念层次的类,其本身也具有某些共同的特性,如都具有类名称、由类加载器去加载,都具有包,具有父类,属性和方法等。于是,Java中有专门定义了一个类,Class,去描述其他类所具有的这些特性,因此,从此角度去看,类本身也都是属于Class类的对象。为与经常意义上的对象相区分,在此称之为"类对象"。
可以通过 Class 类中的一个方法,获取对象的真实类的全名称。
package com.company;
public class Main{
public static void main(String[] args) {
Object o = new Object();
Class<?> aClass = o.getClass();
String name = aClass.getName();
System.out.println(name);
/*
java.lang.Object
*/
}
}
2.3. toString方法
该方法用得比较多,一般子类都有覆盖,来获取对象的信息。
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
getClass().getName() + “@” + Integer.toHexString(hashCode()) 这返回的是:类的全路径名称+它的哈希码值在实际的开发中对我们来说是没有意义的所以我们一般会重写该方法。
2.4 finalize方法
该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。
2.5equals方法
比较对象的内容是否相等
public boolean equals(Object obj) {
return (this == obj);
}
public boolean equals();
指示其他某个对象是否与此对象“相等”
Object o1=new Object();
Object o2=new Object();
System.out.println(o1.equals(o2));//false
System.out.println(o1==o2);//false
默认方法是比较的是对象的引用是否相同。由于比较对象的引用对于我们在实际开发中没有意义,一般还是要重写该方法。
package com.company;
public class Main{
public static void main(String[] args) {
String s1=new String("cc");
String s2=new String("cc");
Object o1=new Object();
Object o2=new Object();
System.out.println(s1.equals(s2));//true String重写了Object
System.out.println(s1==s2);//false ==比较的是他们引用的是否是用一个对象
System.out.println("********************");
System.out.println(o1.equals(o2));//false
System.out.println(o1==o2);//false
}
}
==号和equals方法的区别
“==” 是一个比较运算符号,既可以比较基本数据类型,也可以比较引用数据类型,基本数据类型比较的是值,引用数据类型比较的是地址值
equals() 方法是一个方法,只能比较引用数据类型,所有的对象都会继承 Object 类中的方法,没有重写 Object 类中的 equals 方法,equals方法和==号比较引用数据类型无区别,重写后的equals方法比较的是对象中的属性。
2.6 hashCode方法
该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。
public native int hashCode();
返回对象的哈希值
package com.company;
public class Main{
public static void main(String[] args) {
Object o1 = new Object();
int hashcode1 =o1.hashCode();
System.out.println(hashcode1);
Object o2 = new Object();
int hashcode2 = o2.hashCode();
System.out.println(hashcode2);
/*
460141958
1163157884
*/
}
}
2.7 wait方法
wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。
调用该方法后当前线程进入睡眠状态,直到以下事件发生。
- 其他线程调用了该对象的notify方法。
- 其他线程调用了该对象的notifyAll方法。
- 其他线程调用了interrupt中断该线程。
- 时间间隔到了。
此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。
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 > 0) {
timeout++;
}
wait(timeout);
}
2.8 notify方法
该方法唤醒在该对象上等待的某个线程。
public final native void notify();
2.9 notifyAll方法
该方法唤醒在该对象上等待的所有线程。
public final native void notifyAll();
+;
}
wait(timeout);
}
## 2.8 notify方法
该方法唤醒在该对象上等待的某个线程。
```java
public final native void notify();
2.9 notifyAll方法
该方法唤醒在该对象上等待的所有线程。
public final native void notifyAll();