1、概述:java
Object類是全部Java類的祖先。每一個類都使用 Object 做爲超類。全部對象(包括數組)都實現這個類的方法。
在不明確給出超類的狀況下,Java會自動把Object做爲要定義類的超類。
可使用類型爲Object的變量指向任意類型的對象。
Object類是Java中惟一沒有父類的類
Object類有一個默認構造方法pubilc Object(),在構造子類實例時,都會先調用這個默認構造方法。
2、API預覽
程序員
Object()
默認構造方法
數組
clone()
建立並返回此對象的一個副本。
equals(Object obj)
指示某個其餘對象是否與此對象「相等」。
finalize()
當垃圾回收器肯定不存在對該對象的更多引用時,由對象的垃圾回收器調用此方法。
getClass()
返回一個對象的運行時類。
hashCode()
返回該對象的哈希碼值。
notify()
喚醒在此對象監視器上等待的單個線程。
notifyAll()
喚醒在此對象監視器上等待的全部線程。
toString()
返回該對象的字符串表示。
wait()
致使當前的線程等待,直到其餘線程調用此對象的 notify() 方法或 notifyAll() 方法。
wait(long timeout)
致使當前的線程等待,直到其餘線程調用此對象的 notify() 方法或 notifyAll() 方法,或者超過指定的時間量。
wait(long timeout, int nanos)
致使當前的線程等待,直到其餘線程調用此對象的 notify() 方法或 notifyAll() 方法,或者其餘某個線程中斷當前線程,或者已超過某個實際時間量。dom
3、方法使用說明
equals() (判斷兩個對象是否相等)ide
1)基本數據類型,也稱原始數據類型。byte,short,char,int,long,float,double,boolean 他們之間的比較,用雙等號(==),比較的是他們的值。 函數
2)複合數據類型(類) 當他們用(==)進行比較的時候,比較的是他們在內存中的存放地址,因此,除非是同一個new出來的對象,他們的比較後的結果爲true,不然比較後結果爲false。equals()這個方法的初始行爲是比較對象的內存地址,但在一些類庫當中這個方法被覆蓋掉了,如String,Integer,Date在這些類當中equals有其自身的實現,而再也不是比較類在堆內存中的存放地址了。工具
例:this
People p=new People(); p.setName("234"); People p2=new People(); p2.setName("234"); System.out.println(p.equals(p2)); //false System.out.println(p==p2);//false String s="123"; String s1=new String("123"); String s2=new String("123"); System.out.println(s==s1);//false System.out.println(s.equals(s1));//true System.out.println(s1==s2);//false System.out.println(s1.equals(s2));//true
Java語言規範要求equals方法具備下面的特色: spa
hashCode
的常規協定是(重寫equals()時,必須重寫hashcode()並保證此協定):線程
咱們會有這樣的協定,舉個例子:
class User { String name; public User(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public boolean equals(Object o) { User u = (User) o; return name.equals(u.getName()); } }
public static void main(String[] args) { List<User> list = new ArrayList<User>(); list.add(new User("lily")); Map<User, String> map = new HashMap<User, String>(); map.put(new User("lily"), "11"); System.out.println(list.contains(new User("lily"))); //true System.out.println(map.containsKey(new User("lily")));//false }
緣由就不寫了 。。本身領悟叭
toString()(返回該對象的字符串表示)
Object類中的toString()方法會打印出類名和對象的內存位置。幾乎每一個類都會覆蓋該方法,以便打印對該對象當前狀態的表示。大多數(非所有)toString()方法都遵循以下格式:類名[字段名=值,字段名=值...],固然,子類應該定義本身的toString()方法。該方法是很是重要的調試工具,不少標準類庫中的類都定義了toString()方法,以便程序員得到有用的調試信息
clone()(建立並返回此對象的一個副本)
建立對象的幾種方式:
class Store { public static List<String> store = new ArrayList<String>(); public static int limitSize = 5; }
生產者
class Producer implements Runnable { @Override public void run() { while (true) { synchronized (Store.store) { while (Store.store.size() == Store.limitSize) { try { Store.store.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("建立一個商品"); Store.store.add(UUID.randomUUID().toString()); Store.store.notifyAll(); } } } }
消費者
class Consumer implements Runnable { @Override public void run() { while (true) { synchronized (Store.store) { while (Store.store.size() == 0) { try { Store.store.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("消費一個商品"); Store.store.remove(0); Store.store.notifyAll(); } } } }
啓動生產者,消費者
public static void main(String[] args) { Thread producer = new Thread(new Producer()); Thread consumer = new Thread(new Consumer()); producer.start(); consumer.start(); }