java.lang是提供利用 Java 編程語言進(jìn)行程序設(shè)計(jì)的####基礎(chǔ)類。
我們可以將該包大致分成以下幾類
- Object
- Class
- 數(shù)字與字符(包裝器)類
- 線程與進(jìn)程類
- Math類
- Runtime類
- System類
我們首先講講很重要的object類搁宾。有一句話是這樣的
在java里恒水,一切皆對(duì)象。
所以O(shè)bject類在java里占有舉足輕重的重要性顷蟆。
主要方法
首先我們看看Object類有哪些方法:
- private void registerNatives()
- Class< > getClass()
- int hashCode()
- boolean equals(Object obj)
- protected Object clone()
- String toString()
- void notify()
- void notifyAll()
- void wait(long timeout)
- void wait(long timeout, int nanos)
- void wait()
- protected void finalize()
1. private void registerNatives()
對(duì)象初始化的時(shí)候會(huì)自動(dòng)調(diào)用 這個(gè)方法诫隅。是在c(c++)中實(shí)現(xiàn)的本地方法腐魂,其主要作用是將C/C++中的方法映射到Java中的native方法,實(shí)現(xiàn)方法命名的解耦逐纬。
2. Class< > getClass()
返回的是此Object對(duì)象的類對(duì)象/運(yùn)行時(shí)類
3.int hashCode()
- 在一個(gè)應(yīng)用程序執(zhí)行期間蛔屹,如果一個(gè)對(duì)象的equals方法做比較所用到的信息沒有被修改的話,則對(duì)該對(duì)象調(diào)用hashCode方法多次豁生,它必須始終如一地返回同一個(gè)整數(shù)兔毒。
- 如果兩個(gè)對(duì)象相等(equal),那么必須擁有相同的哈希碼(hash code)
- 即使兩個(gè)對(duì)象有相同的哈希值(hash code),他們不一定相等.
根據(jù)上面可以看出:
一般重寫equals方法的時(shí)候hashcode方法也要被重寫的,因?yàn)橄嗟鹊膶?duì)象的hashcode一定相等
4.boolean equals(Object obj)
public boolean equals(Object obj) {
return (this == obj);
}
我們可以看到其實(shí)就是對(duì)兩個(gè)對(duì)象的內(nèi)存地址的比較甸箱。
ps:有些包裝類String 育叁、Math、Integer等重寫了equals()方法,就是對(duì)內(nèi)容的比較了摇肌。
5 protected Object clone()
這里涉及到深拷貝和淺拷貝的問題:
簡單的來說就是擂红,在有指針的情況下,淺拷貝只是增加了一個(gè)指針指向已經(jīng)存在的內(nèi)存围小,而深拷貝就是增加一個(gè)指針并且申請(qǐng)一個(gè)新的內(nèi)存昵骤,使這個(gè)增加的指針指向這個(gè)新的內(nèi)存,采用深拷貝的情況下肯适,釋放內(nèi)存的時(shí)候就不會(huì)出現(xiàn)在淺拷貝時(shí)重復(fù)釋放同一內(nèi)存的錯(cuò)誤
我們可以看到clone方法是protect 直接調(diào)用是不可以的变秦,但是protect在子類是可以調(diào)用的,在java所有的類都缺省繼承了Object類框舔。所以我們只需要關(guān)心重寫的clone這個(gè)方法蹦玫。重寫的方法需要繼承
public interface Cloneable {
}
然后在對(duì)象里重寫clone()方法
public Object clone(){
Object o=null;
try {
o=super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return o;
}
重寫了clone方法的當(dāng)前類的復(fù)制是深拷貝,但是如果再該類里面存在另一個(gè)對(duì)象沒有重寫clone方法就是淺拷貝刘绣。實(shí)例如下
public class ObjectUseDto implements Cloneable {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private ShallowCopy shallowCopy;
public ShallowCopy getShallowCopy() {
return shallowCopy;
}
public void setShallowCopy(ShallowCopy shallowCopy) {
this.shallowCopy = shallowCopy;
}
public Object clone() {
Object o = null;
try {
//Object中的clone()識(shí)別出你要復(fù)制的是哪一個(gè)對(duì)象樱溉。
o = super.clone();
} catch (CloneNotSupportedException e) {
System.out.println(e.toString());
}
return o;
}
}
class ShallowCopy {
private Integer age;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
調(diào)用方代碼
ObjectUseDto test=new ObjectUseDto();
test.setName("小花");
ShallowCopy shallowCopy=new ShallowCopy();
shallowCopy.setAge(11);
test.setShallowCopy(shallowCopy);
ObjectUseDto test2=(ObjectUseDto)test.clone();
System.out.println(test2.getName());
System.out.println(test2.getShallowCopy().getAge());
test.setName("大貓");
shallowCopy.setAge(88);
System.out.println(test2.getName());
System.out.println(test2.getShallowCopy().getAge());
輸出的結(jié)果
小花
11
小花
88
可以看出重寫了clone的是深拷貝,每次我們改變的都是原有對(duì)象纬凤。原有的對(duì)象發(fā)生了改變從‘小花’變成‘大貓’了 但是拷貝的對(duì)象并沒有發(fā)生改變福贞,再看原有的age從 11 變成了 88 。
6 String toString()
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
沒有被重寫的時(shí)候 表示沒有被覆蓋的時(shí)候停士,返回類名@哈希值挖帘,哈希值是十六進(jìn)制的
7 protected void finalize()
我們先說下finalize()方法
可以看做一個(gè)析構(gòu)方法 會(huì)在沒有引用的時(shí)候再垃圾回收之前被垃圾回收機(jī)制調(diào)用
后面的方法主要是與多線程相關(guān)的了。
8 void notify() 只能在同步控制方法或者同步控制塊里面使用
這個(gè)方法的主要功能是 喚醒在此對(duì)象監(jiān)視器上等待的單個(gè)線程
9 void notifyAll() 只能在同步控制方法或者同步控制塊里面使用
這個(gè)方法的主要功能是 喚醒在此對(duì)象監(jiān)視器上等待的所有線程
10 void wait() 只能在同步控制方法或者同步控制塊里面使用
這個(gè)方法的主要功能是 調(diào)用此方法所在的當(dāng)前線程等待恋技,直到在其他
線程上調(diào)用此方法的主調(diào)(某一對(duì)象)的notify()/notifyAll()方法拇舀。
在這里我們可以比較下sleep()的區(qū)別:
在調(diào)用sleep()方法的過程中,線程不會(huì)釋放對(duì)象鎖蜻底。
而當(dāng)調(diào)用wait()方法的時(shí)候骄崩,線程會(huì)放棄對(duì)象鎖,進(jìn)入等待此對(duì)象的等待鎖定池,只有針對(duì)此對(duì)象調(diào)用notify()方法后本線程才進(jìn)入對(duì)象鎖定池準(zhǔn)備獲取對(duì)象鎖進(jìn)入運(yùn)行狀態(tài)刁赖。
11 void wait(long timeout) 只能在同步控制方法或者同步控制塊里面使用
這個(gè)方法的主要功能是 線程等待 直到在其他線程上調(diào)用此方法的主調(diào)(某一對(duì)象)的notisfy()/notisfyAll()方法 或者等到一定時(shí)間
12 void wait(long timeout, int nanos) 只能在同步控制方法或者同步控制塊里面使用
這個(gè)方法的主要功能是 線程等待 直到在其他線程上調(diào)用此方法的主調(diào)(某一對(duì)象)的notisfy()/notisfyAll()方法 或者等到一定時(shí)間
native 關(guān)鍵字
我們可以看到在Object類里有很多的方法都聲明了native關(guān)鍵字那么native關(guān)鍵字有什么作用呢搁痛?
?說明其修飾的方法是一個(gè)原生態(tài)方法,方法對(duì)應(yīng)的實(shí)現(xiàn)不是在當(dāng)前文件宇弛,而是在用其他語言(如C和C++)實(shí)現(xiàn)的文件中鸡典。Java語言本身不能對(duì)操作系統(tǒng)底層進(jìn)行訪問和操作,但是可以通過JNI接口調(diào)用其他語言來實(shí)現(xiàn)對(duì)底層的訪問
final關(guān)鍵字
一旦聲明這個(gè)類枪芒,方法彻况,變量為final ,那么這個(gè)引用將不能被改變舅踪,當(dāng)再次嘗試初始化會(huì)編譯錯(cuò)誤
finalize() 方法:
可以看做一個(gè)析構(gòu)方法 會(huì)在沒有引用的時(shí)候再垃圾回收之前被垃圾回收機(jī)制調(diào)用