Java基础,Object类

版权声明:Songcz原创,如有转载请注明出处 https://blog.csdn.net/weixin_43701058/article/details/90079908

基本描述

(1)Object类位于java.lang包中,java.lang包包含着Java最基础和核心的类,在编译时会自动导入;
(2)Object类是所有Java类的祖先。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。可以使用类型为Object的变量指向任意类型的对象

即一个类如果不指名继承与那个类那么他就是Object的子类。Object类是爸爸hhh。
因此它的方法被所有Java类公用。

public class test extends Object{

}

Object的主要方法:
1.getClass() 方法:可以看出被final修饰,不可被子类重写,此方法相关详情可以点击此处

public final native Class<?> getClass();

native可以理解用来调用C中的实现。

2.hashCode() 方法:说到hashCode()就不得不提
3.equals() 方法:

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

可以看出hashCode的返回值是int型,equals的返回值是boolean型。
hashCode方法的主要作用是为了配合基于散列的集合一起使用。
如果每一次都进行equals方法比较,效率过低。
所以先接收一个元素时根据该对象的内存地址算出hashCode,看它属于哪一个区间,再这个区间里调用equals方法。

以向HashSet()中添加一个元素为例
1.调用对象的hashCode()方法,得到该对象的hashCode值;
2.根据hashCode值决定该对象在HashSet中的存储位置;
3.If hashCode值不同,把元素存储到hashCode()指定的位置;
4.else hashCode值相同,继续判断,对象和集合对象的equals()做比较。
5.if(true)视为同一个对象,不保存在hashSet中();
6.if(false)存储在之前对象的同位链表上(拉链法解决hash冲突,在新版的jdk中如果链表上元素较多将变成树)。

这里对equals方法要说明下,其实在Object中equals和“==”是一样的,String,Array中equals比较内容是在其类中对equals重写的结果。

public class test extends Object{
	public static void main(String[] args){
		test a = new test();
		test b = new test();
		
		String c = new String("123");
		String d = new String("123");
		
		System.out.println(a.equals(b));
		System.out.println(a==b);
		
		System.out.println(c.equals(d));
		System.out.println(c==d);
	}
}

输出结果
在这里插入图片描述
Amaing吧,如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址。补充下equals这个是Object的方法自然只能用于类,不能用于基本数据类型比较。你也“.”不出来啊。
4.toString() 方法:Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。该方法用得比较多,一般子类都有覆盖。

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

例子

扫描二维码关注公众号,回复: 6214882 查看本文章
public class test extends Object{
	public static void main(String[] args){
		test a = new test();
		System.out.println(a.toString());
	}
}

运行结果:test@15db9742

多线程:
5.wait() 方法:使一个线程进入等待状态,这里就可以看出他和sleep方法的重大区别,wait()在属于Object类,sleep()方法在Thread类中。
在调用sleep()方法的过程中,线程不会释放对象锁。
而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()/notifyAll()方法后本线程才进入对象锁定池准备。(本片博客不针对与多线程这里就不多说了)
6.notify() 方法:唤醒一个线程。
7.notifyAll() 方法:唤醒全部线程。

 public final native void notify();
 public final native void notifyAll();
 public final native void wait(long timeout) throws InterruptedException;
 public final void wait() throws InterruptedException {
        wait(0);
 }//wait还有几个..

猜你喜欢

转载自blog.csdn.net/weixin_43701058/article/details/90079908