更新時(shí)間:2019-09-16 11:27:48 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2601次
今天動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)小編為大家介紹“java中object類的常用方法”,希望通過此文大家能夠知道object類的常用方法,下面就隨小編一起看看java中object類的常用方法有哪些?
一、clone
1、clone()方法
在實(shí)際編程過程中,常常遇到這種情況:有一個(gè)對(duì)象A,在某一時(shí)刻A中已經(jīng)包含了一些有效值,此時(shí)可能會(huì)需要一個(gè)和A完全相同新對(duì)象B,并且此后對(duì)B任何改動(dòng)都不會(huì)影響到A中的值,也就是說,A與B是兩個(gè)獨(dú)立的對(duì)象,但B的初始值是由A對(duì)象確定的。在Java語(yǔ)言中,用簡(jiǎn)單的賦值語(yǔ)句是不能滿足這種需求的。實(shí)現(xiàn)clone()方法是滿足需求最簡(jiǎn)單,也是最高效的手段。
clone()將返回Object對(duì)象的一個(gè)拷貝。要說明的有兩點(diǎn):一是拷貝對(duì)象返回的是一個(gè)新對(duì)象,而不是一個(gè)引用。二是拷貝對(duì)象與用 new操作符返回的新對(duì)象的區(qū)別就是這個(gè)拷貝已經(jīng)包含了一些原來(lái)對(duì)象的信息,而不是對(duì)象的初始信息。
2、例子
public class Test implements Cloneable{
private double value;
public Test(double value) {
this.value = value;
}
public void setValue(double value) {
this.value = value;
}
public double getValue() {
return this.value;
}
public Object clone() {
Test copy = null;
try {
copy = (Test) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return copy;
}
}
public class Main {
public static void main(String[] args) {
Test dh = new Test(100.00);
Test dhClone = (Test) dh.clone();
System.out.println("Original:" + dh.getValue()); //Original:100.0
System.out.println("Clone :" + dhClone.getValue()); //Clone :100.0
dh.setValue(200.00);
dhClone.setValue(400.00);
System.out.println("Original:" + dh.getValue()); //Original:200.0
System.out.println("Clone :" + dhClone.getValue()); //Clone :400.0
}
}
3、Shallow Cloning
public class Test {
private double value;
public Test(double value) {
this.value = value;
}
public void setValue(double value) {
this.value = value;
}
public double getValue() {
return this.value;
}
public class ShallowClone implements Cloneable {
public Test holder = new Test(0.0);
public Object clone() {
ShallowClone copy = null;
try {
copy = (ShallowClone) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return copy;
}
}
public class Main {
public static void main(String[] args) {
ShallowClone dh = new ShallowClone();
dh.holder.setValue(100.00);
ShallowClone dhClone = (ShallowClone ) dh.clone();
System.out.println("Original:" + dh.holder.getValue()); //Original:100.0
System.out.println("Clone :" + dhClone.holder.getValue()); //Clone :100.0
dh.holder.setValue(200.00);
System.out.println("Original:" + dh.holder.getValue()); //Original:200.0
System.out.println("Clone :" + dhClone.holder.getValue()); //Clone :200.0
}
}
此例子中當(dāng)ShallowClone類使用super.clone()調(diào)用Object類的clone()方法時(shí),它會(huì)接收自身的淺拷貝。也就是說,它與其克隆共享其實(shí)例變量中使用的holder對(duì)象。
4、Deep Cloning
在深層克隆中,需要克隆對(duì)象的所有引用實(shí)例變量引用的所有對(duì)象。
public class Test implements Cloneable{
private double value;
public Test(double value) {
this.value = value;
}
public void setValue(double value) {
this.value = value;
}
public double getValue() {
return this.value;
}
public Object clone() {
Test copy = null;
try {
copy = (Test) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return copy;
}
}
public class DeepClone implements Cloneable {
public Test holder = new Test(0.0);
public Object clone() {
DeepClone copy = null;
try {
copy = (DeepClone) super.clone();
copy.holder = (Test) this.holder.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return copy;
}
}
public class Main {
public static void main(String[] args) {
DeepClone dh = new DeepClone();
dh.holder.setValue(100.00);
DeepClone dhClone = (DeepClone) dh.clone();
System.out.println("Original:" + dh.holder.getValue()); //Original:100.0
System.out.println("Clone :" + dhClone.holder.getValue()); //Clone :100.0
dh.holder.setValue(200.00);
System.out.println("Original:" + dh.holder.getValue()); //Original:200.0
System.out.println("Clone :" + dhClone.holder.getValue()); //Clone :100.0
}
}
二、equals
1、概述
equals 方法默認(rèn)比較的是兩個(gè)對(duì)象的引用是否指向同一個(gè)內(nèi)存地址。hashCode 是一個(gè) native 本地方法,默認(rèn)的 hashCode 方法返回的就是對(duì)象對(duì)應(yīng)的內(nèi)存地址。
equals 方法是基類 Object 的方法,創(chuàng)建的所有的對(duì)象都擁有這個(gè)方法,并有權(quán)利去重寫這個(gè)方法。該方法返回一個(gè) boolean 值,代表比較的兩個(gè)對(duì)象是否相同,這里的相同的條件由重寫 equals 方法的類來(lái)解決。
String str1 = "abc";
String str2 = "abc";
str1.equals(str2);//true
String 類重寫了 equals 方法,否則兩個(gè) String 對(duì)象內(nèi)存地址肯定不同。
2、equals()方法的實(shí)現(xiàn)的規(guī)范
假設(shè)x,y和z是三個(gè)對(duì)象的非空引用。
自反性。表達(dá)式x.equals(x)應(yīng)該返回true。
對(duì)稱性。如果x.equals(y)返回true,y.equals(x)必須返回true。
傳遞性。如果x.equals(y)返回true,y.equals(z)返回true,則x.equals(z)必須返回true。
一致性。如果用于equals比較的對(duì)象信息沒有被修改的話,多次調(diào)用時(shí) x.equals(y) 要么一致地返回 true 要么一致地返回 false。
與空引用的比較:任何類的對(duì)象不應(yīng)等于空引用。表達(dá)式x.equals(null)應(yīng)始終返回false。
3、equals 與 == 的區(qū)別
(1)若 == 兩側(cè)都是基本數(shù)據(jù)類型,則判斷的是左右兩邊操作數(shù)據(jù)的值是否相等
(2)若 == 兩側(cè)都是引用數(shù)據(jù)類型,則判斷的是左右兩邊操作數(shù)的內(nèi)存地址是否相同。若此時(shí)返回 true , 則該操作符作用的一定是同一個(gè)對(duì)象。
(3)Object 基類的 equals 默認(rèn)比較兩個(gè)對(duì)象的內(nèi)存地址,在構(gòu)建的對(duì)象沒有重寫 equals 方法的時(shí)候,與 == 操作符比較的結(jié)果相同。
(4)equals 用于比較引用數(shù)據(jù)類型是否相等。在滿足equals 判斷規(guī)則的前體系,兩個(gè)對(duì)象只要規(guī)定的屬性相同我們就認(rèn)為兩個(gè)對(duì)象是相同的。
public class Test {
public String name="abc";
public static void main(String[] args) {
Test test=new Test();
Test testb=new Test();
String a=new String("a");
String b=new String("a");
System.out.println(test.equals(testb));//false
System.out.println(test==testb);//false
System.out.println(test.name.equals(testb.name));//true
System.out.println(a==b);//false
System.out.println(a.equals(b));//true
}
}
4、equals()和hashCode()的聯(lián)系
調(diào)用 equals 返回 true 的兩個(gè)對(duì)象必須具有相等的哈希碼。
如果兩個(gè)對(duì)象的 hashCode 返回值相同,調(diào)用它們 equals 方法不一返回 true 。
三、getClass
Object類中包含一個(gè)方法名叫g(shù)etClass,利用這個(gè)方法就可以獲得一個(gè)實(shí)例的類型類。類型類指的是代表一個(gè)類型的類,因?yàn)橐磺薪允菍?duì)象,類型也不例外,在Java使用類型類來(lái)表示一個(gè)類型。所有的類型類都是Class類的實(shí)例。
一般情況下,getclass()方法和class方法是等價(jià)的,都可以獲得一個(gè)類型名,例:
class A{
public void func(){
}
}
public class Test {
public static void main(String[] args) {
A a = new A();
System.out.println(a.getClass()+" "+A.class); //class A class A
}
}
getclass()和class的區(qū)別
getClass() 是一個(gè)類的實(shí)例所具備的方法,而class() 方法是一個(gè)類的方法。
getClass() 是在運(yùn)行時(shí)才確定的,而class() 方法是在編譯時(shí)就確定了。
四、toString
toString()是Object類的一個(gè)公有方法,而所有類都繼承自O(shè)bject類。所以所有類即使不實(shí)現(xiàn)toString方法,也會(huì)存在從Object類繼承來(lái)的toString。Object類提供了toString()方法的默認(rèn)實(shí)現(xiàn)。它返回一個(gè)以下格式的字符串:
<fully qualified class name>@<hash code of object in hexadecimal>
例子:
import java.util.ArrayList;
public class ObjectDemo {
public static void main(String[] args) {
Integer i = new Integer(50);
ArrayList list = new ArrayList();
list.add(50);
list.add("Hello World");
System.out.println("" + i.toString()); //50
System.out.println("" + list.toString()); //[50, Hello World]
}
}
類可以實(shí)現(xiàn)toString方法,在控制臺(tái)中打印一個(gè)對(duì)象會(huì)自動(dòng)調(diào)用對(duì)象類的toString方法,所以我們可以實(shí)現(xiàn)自己的toString方法在控制臺(tái)中顯示關(guān)于類的有用信息。
public class Main{
public static void main(String[] argv){
MyClass obj = new MyClass(123);
String objStr = obj.toString();
System.out.println(objStr);
}
}
class MyClass {
private int value;
public MyClass(int value) {
this.value = value;
}
public void setValue(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public String toString() {
String str = String.valueOf(this.value);
return str;
}
}
以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)小編介紹的“java中object類的常用方法有哪些?”的內(nèi)容,希望對(duì)大家有幫助,更多java最新資訊請(qǐng)繼續(xù)關(guān)注動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)官網(wǎng),每天會(huì)有精彩內(nèi)容分享與你。
相關(guān)免費(fèi)視頻教程推薦
java入門學(xué)習(xí)零基礎(chǔ)教程下載——Object類簡(jiǎn)介:http://www.dabaquan.cn/xiazai/2586.html
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743