java?Object類中常用API分享
java常用API-Object
Object類是java中所有類的祖宗類,因此,java中所有的類的對象都可以直接使用Object類中提供的一些方法
Clone-對象克隆
clone 就是復(fù)制 , 在Java語言中, clone方法被對象調(diào)用,所以會復(fù)制對象。所謂的復(fù)制對象,首先要分配一個和源對象同樣大小的空間,在這個空間中創(chuàng)建一個新的對象。
這和new 也是大同小異的:
new與clone創(chuàng)建對象的區(qū)別
new操作符的本意是分配內(nèi)存。程序執(zhí)行到new操作符時, 首先去看new操作符后面的類型,根據(jù)類型分配內(nèi)存,再調(diào)用構(gòu)造函數(shù),填充對象的各個域,這一步就叫對象的初始化。初始化完畢后,可以把他的引用(地址)發(fā)布到外部,在外部就可以通過引用操縱這個對象。 clone在第一步是和new相似的,都是分配內(nèi)存,調(diào)用clone方法時,分配的內(nèi)存和源對象一樣,然后再使用源對象中對應(yīng)的各個域,填充新對象的域。同樣可以可以把這個新對象的引用發(fā)布到外部 。
基本使用
本次就用users這個類來做實(shí)驗(yàn)
當(dāng)然要注意的是在使用clone的時候,需要對象重寫clone方法,對象才可以使用,并且要實(shí)現(xiàn)Cloneable這個接口
public class Users implements Cloneable { ? ?private String name; ? ?private String address; ? ?private int age; ? ?private char sex; ? ?private String[] obj; ? ? ?public Users() { ? } ? ? ?public Users(String name, String address, int age, char sex, String[] obj) { ? ? ? ?this.name = name; ? ? ? ?this.address = address; ? ? ? ?this.age = age; ? ? ? ?this.sex = sex; ? ? ? ?this.obj = obj; ? } ? ? ?public String getName() { ? ? ? ?return name; ? } ? ? ?public void setName(String name) { ? ? ? ?this.name = name; ? } ? ? ?public String getAddress() { ? ? ? ?return address; ? } ? ? ?public void setAddress(String address) { ? ? ? ?this.address = address; ? } ? ? ?public int getAge() { ? ? ? ?return age; ? } ? ? ?public void setAge(int age) { ? ? ? ?this.age = age; ? } ? ? ?public char getSex() { ? ? ? ?return sex; ? } ? ? ?public void setSex(char sex) { ? ? ? ?this.sex = sex; ? } ? ? ?public String[] getObj() { ? ? ? ?return obj; ? } ? ? ?public void setObj(String[] obj) { ? ? ? ?this.obj = obj; ? } ? ?// 重寫clone方法 ? @Override ? ?protected Object clone() throws CloneNotSupportedException { ? ? ? ?return super.clone(); ? } }
然后就可以進(jìn)行簡單的克隆了
public class ObjectDemo1 { ? ?public static void main(String[] args) throws CloneNotSupportedException { ? ? ? ?String[] s1={"hh","feig"}; ? ? ? ?String[] s2={"hh","feiwg"}; ? ? ? ?Users users=new Users("張三","重慶市",19,'男',s1); ? ? ? ?Users users1=new Users("張三","重慶市",19,'男',s2); ? ? ? ?Users clone = (Users) users.clone(); ? ? ? ?System.out.println(clone); ? ? ? ?// 如果相等說明是同一個對象,就是淺拷貝 ? ? ? System.out.println(clone);//Users{name='張三', address='重慶市', age=19, sex=男, obj=[hh, feig]} ? ? } }
淺拷貝和深拷貝
上面age是基本數(shù)據(jù)類型, 對它的拷貝直接將一個4字節(jié)的整數(shù)值拷貝過來就行。但name是String類型的, 只是一個引用, 指向一個真正的String對象,對它的拷貝有兩種:
- 淺拷貝: 直接將源對象中的name的引用值拷貝給新對象的name字段;
- 深拷貝: 根據(jù)User源對象中的name指向的字符串對象創(chuàng)建一個新的相同的字符串對象,將這個新字符串對象的引用賦給新拷貝的User對象的name字段。
Java中的clone方法是淺拷貝。
public class ObjectDemo1 { ? ?public static void main(String[] args) throws CloneNotSupportedException { ? ? ? ?String[] s1={"hh","feig"}; ? ? ? ?String[] s2={"hh","feiwg"}; ? ? ? ?Users users=new Users("張三","重慶市",19,'男',s1); ? ? ? ?Users users1=new Users("張三","重慶市",19,'男',s2); ? ? ? ?Users clone = (Users) users.clone(); ? ? ? ?System.out.println(clone); ? ? ? ?// 如果相等說明是同一個對象,就是淺拷貝 ? ? ? ?System.out.println(clone.getObj() == users.getObj());// true ? ? } }
== 如果兩方是對象,那么比較的就是地址,所有上面克隆的對象和源對象的數(shù)組是指向的同一個地址,所以是淺拷貝
如果想要實(shí)現(xiàn)深拷貝, 可以通過覆蓋重寫Object中的clone方法的方式。 要在clone對象時進(jìn)行深拷貝,就要implements Clonable接口,覆蓋并實(shí)現(xiàn)clone方法,除了調(diào)用父類中的clone方法得到新的對象, 還要將該類中的引用變量也clone出來。如果只是用Object中默認(rèn)的clone方法,是淺拷貝的。
public class ObjectDemo1 { ? ?public static void main(String[] args) throws CloneNotSupportedException { ? ? ? ?String[] s1={"hh","feig"}; ? ? ? ?String[] s2={"hh","feiwg"}; ? ? ? ?Users users=new Users("張三","重慶市",19,'男',s1); ? ? ? ?Users users1=new Users("張三","重慶市",19,'男',s2); ? ? ? ?Users clone = (Users) users.clone(); ? ? ? ?System.out.println(clone); ? ? ? ?// 如果相等說明是同一個對象,就是淺拷貝 ? ? ? ?System.out.println(clone.getObj() == users.getObj());// false ? ? } }
toString-返回對象的字符串形式
一般都是讓對象重寫的方法,如果不重寫那么返回的就是一個地址
主要作用:就是方便返回子類對象的內(nèi)容
public class ObjectDemo1 { ? ?public static void main(String[] args) throws CloneNotSupportedException { ? ? ? ?String[] s1={"hh","feig"}; ? ? ? ?String[] s2={"hh","feiwg"}; ? ? ? ?Users users=new Users("張三","重慶市",19,'男',s1); ? ? ? ?Users users1=new Users("張三","重慶市",19,'男',s2); ? ? ? ?//沒有重寫toString 方法 ? ? ? ? // System.out.println(users.toString()); 直接打印是一個地址 ? ? ? ?System.out.println(users.toString()); //常用API2.Users@cbdc0179 ? } }
當(dāng)我們在對象中重寫了toString 方法后:
返回的數(shù)據(jù)的樣式是可以根據(jù)自己的需求來進(jìn)行修改的
@Override public String toString() { ? ?return "Users{" + ? ? ? ? ? ?"name='" + name + ''' + ? ? ? ? ? ?", address='" + address + ''' + ? ? ? ? ? ?", age=" + age + ? ? ? ? ? ?", sex=" + sex + ? ? ? ? ? ?", obj=" + Arrays.toString(obj) + ? ? ? ? ? ?'}'; }
public class ObjectDemo1 { ? ?public static void main(String[] args) throws CloneNotSupportedException { ? ? ? ?String[] s1={"hh","feig"}; ? ? ? ?String[] s2={"hh","feiwg"}; ? ? ? ?Users users=new Users("張三","重慶市",19,'男',s1); ? ? ? ?Users users1=new Users("張三","重慶市",19,'男',s2); ? ? ? ?//沒有重寫toString 方法 ? ? ? ? // System.out.println(users.toString()); 直接打印是一個地址 ? ? ? ?System.out.println(users.toString()); // //Users{name='張三', address='重慶市', age=19, sex=男, obj=[hh, feig]} ? } }
equals(Object o )-判斷兩個對象是否相等
一般都是讓對象重寫的方法,如果不重寫那么就是基礎(chǔ)的‘’==‘’ 判斷,主要比較的就是兩個對象的地址
public boolean equals(Object obj) { ? ?return (this == obj); }
主要作用:就是方便對象中特定內(nèi)容的值是否相等
public class ObjectDemo1 { ? ?public static void main(String[] args) throws CloneNotSupportedException { ? ? ? ?String[] s1={"hh","feig"}; ? ? ? ?String[] s2={"hh","feiwg"}; ? ? ? ?Users users=new Users("張三","重慶市",19,'男',s1); ? ? ? ?Users users1=new Users("張三","重慶市",19,'男',s2);\ ? ? ? ?//是兩個不同的對象,地址是不相同的 ? ? ? System.out.println(users.equals(users1)); //false ? } }
當(dāng)我們在對象中重寫了equals 方法后,就可以根據(jù)需要來比較對象里面的值
比如只比較age,或者sex等等
@Override public boolean equals(Object o) { ? ?if (this == o) return true; ? ?if (o == null || getClass() != o.getClass()) return false; ? ?Users users = (Users) o; ? ?return age == users.age && sex == users.sex && Objects.equals(name, users.name) && Objects.equals(address, users.address) && Arrays.equals(obj, users.obj); }
public class ObjectDemo1 { ? ?public static void main(String[] args) throws CloneNotSupportedException { ? ? ? ?String[] s1={"hh","feig"}; ? ? ? ?String[] s2={"hh","feiwg"}; ? ? ? ?Users users=new Users("張三","重慶市",19,'男',s1); ? ? ? ?Users users1=new Users("張三","重慶市",19,'男',s2);\ ? ? ? ?//是兩個不同的對象,地址是不相同的 ? ? ? System.out.println(users.equals(users1)); //false ? } }
toString存在的意義: toString()方法存在的意義就是為了被子類重寫,以便返回對象具體的內(nèi)容。
equals存在的意義:直接比較兩個對象的地址是否相同完全可以用“==”替代equals,equals存在的意義就是為了被子類重寫,以便子類自己來定制比較規(guī)則(比如比較對象內(nèi)容)。
到此這篇關(guān)于java Object類中常用API分享的文章就介紹到這了,更多相關(guān)java object API內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot Redis實(shí)現(xiàn)接口冪等性校驗(yàn)方法詳細(xì)講解
這篇文章主要介紹了SpringBoot Redis實(shí)現(xiàn)接口冪等性校驗(yàn)方法,近期一個老項(xiàng)目出現(xiàn)了接口冪等性校驗(yàn)問題,前端加了按鈕置灰,依然被人拉著接口參數(shù)一頓輸出,還是重復(fù)調(diào)用了接口,通過復(fù)制粘貼,完成了后端接口冪等性調(diào)用校驗(yàn)2022-11-11Java實(shí)現(xiàn)獲取cpu、內(nèi)存、硬盤、網(wǎng)絡(luò)等信息的方法示例
這篇文章主要介紹了Java實(shí)現(xiàn)獲取cpu、內(nèi)存、硬盤、網(wǎng)絡(luò)等信息的方法,涉及java使用第三方j(luò)ar包針對本機(jī)硬件的cpu、內(nèi)存、硬盤、網(wǎng)絡(luò)信息等的讀取相關(guān)操作技巧,需要的朋友可以參考下2018-06-06SpringBoot?+DynamicDataSource切換多數(shù)據(jù)源的全過程
這篇文章主要介紹了SpringBoot?+DynamicDataSource切換多數(shù)據(jù)源的全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01手寫redis@Cacheable注解?參數(shù)java對象作為key值詳解
這篇文章主要介紹了手寫redis@Cacheable注解?參數(shù)java對象作為key值詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01解決@JsonInclude(JsonInclude.Include.NON_NULL)不起作用問題
這篇文章主要介紹了解決@JsonInclude(JsonInclude.Include.NON_NULL)不起作用問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06java中ArrayList 、LinkList的區(qū)別分析
java中ArrayList 、LinkList的區(qū)別分析,需要的朋友可以參考一下2013-05-05使用@Autowired注解警告Field injection is not recommended的解決
這篇文章主要介紹了使用@Autowired注解警告Field injection is not recommended的解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04將Java項(xiàng)目打包成可執(zhí)行的jar包
這篇文章主要介紹了將Java項(xiàng)目打包成可執(zhí)行的jar包,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06