Object
1. java.lang.Object:所有的类都直接或者间接继承了Object类,任何对象都可以用Object类对象来接收,java中所有类的顶级父类,Object类是唯一一个没有父类的类。 所有的对象(数组)都实现类Object类的方法。
2. 重要方法:
1. protected Object clone()--理解;
2. protected void finalize()--理解:当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
3. public int hashCode() 返回该对象的哈希码值。
4. public String toString() 返回该对象的字符串表示--掌握。
5. public boolean equals(Object obj) 指示其他某个对象是否与此对象“相等”--重点。
6. Class<?> getClass()--掌握 返回此 Object 的运行时类。
7. public void wait()--掌握: 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
8. public void notify()--掌握: 唤醒在此对象监视器上等待的单个线程。
代码分析
protected Object clone()--理解;
//protected Object clone() 创建并返回此对象的一个副本。
//clone--克隆--一个对象要想被克隆,必须实现Cloneable接口
public class ObjectDemo01 implements Cloneable {
//public interface Cloneable {};该接口没有任何方法和属性,仅仅标志该对象可以被克隆
int i ;
public static void main(String[] args) throws CloneNotSupportedException {
ObjectDemo01 ob1 = new ObjectDemo01();
ob1.i = 5;
// 克隆ob1对象
ObjectDemo01 ob2 = (ObjectDemo01) ob1.clone();
//克隆完成后ob2中的属性和ob1相同
System.out.println(ob2.i);
//克隆出来的对象是否和元对象相同?
//验证:改变ob2中i的值,看ob1中该值是否变化?或者打印地址是否相同?
System.out.println(ob1==ob1);
//protected修饰词:本类中,子类中,同包类中使用。但子类中使用和子类对象使用是一回事吗?
}
Class<?> getClass() 返回此 Object 的运行时类。
public int hashCode() 返回该对象的哈希码值。
public class ObjectDemo2 {
public static void main(String[] args) {
//声明了一个o对象,实际上是一个String类型
Object o = "abc";
//获取o的运行时类型--实际类型
System.out.println(o.getClass());
//hashcode--哈希码--本质上是一串二进制数据,底层通过哈希算法算出来的
//散列--不连续的值--哈希码的取值范围和int取值范如果,不超过围一致--大约43亿个取值
//根据哈希算法算出来的哈希值会随机散列分布在这43一个取值范围中。
//在一个程序中,在同一条件下,同一对象的值计算的哈希码是一样的,不同对象的哈希值不一样。
//条件:比如计算机的内存使用,cpu的用率。每时每刻都不同,所以,同一对象的哈希码,在不同时刻的哈希值不一样。
//人为的人为哈希码是唯一的--所以往往会利用对象的哈希码作为地址是唯一的。
//默认情况对象的地址就是该对象哈希值16进制。
Object obj = new Object();
System.out.println(o.hashCode());
System.out.println(o.hashCode());
System.out.println(o.hashCode());
System.out.println(o.hashCode());
System.out.println(obj);//java.lang.Object@37748ba4
System.out.println(Integer.toHexString(obj.hashCode()));//37748ba4
System.out.println(obj.hashCode());
System.out.println(obj.hashCode());
System.out.println(obj.hashCode());
System.out.println(obj.hashCode());
//String toString() 返回该对象的字符串表示。
//当我们直接打印一个对象时,底层是调用对象的toString方法
//bin--二进制 Oct--8进制 dec--十进制 Hex--16进制
/*
* 默认情况下toString()方法
* public String toString()
* { return getClass().getName() + "@" +
* Integer.toHexString(hashCode()); }
* 一般在开发中,我们会重写toString()方法,方便调试。
*/
System.out.println(obj);
System.out.println(obj.toString());
}
}
/*比较两个对象是否相同
boolean equals(Object obj) 指示其他某个对象是否与此对象“相等”。 默认底层是按照对象的地址是否相等。
实际开发中我们一般要重写equals()方法。
public boolean equals(Object obj){
return (this == obj);
}*/
public boolean equals(Object obj){
//先判断俩对象的地址是否一样
if(this == obj){
return true;
}
//判断对象参数是否为空
if(obj==null){
return false;
}
//判断俩对象的类型是否相同
if(this.getClass()!=obj.getClass()){
return false;
}
//判断属性是否相等(根据实际要求填写)
//注意引用类型的判断,防止出现空指针的情况。
//this.name==p.name,判断两者是否为null
//this.name!=null&&this.name.equals(p.name),防止一个为空一个不为空
Person p = (Person)obj;
if(this.name==p.name||this.name!=null&&this.name.equals(p.name)){
return true;
}
return false;
}
下一篇:
基础系列【八】–包装类