日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java public object_Java_Object

發(fā)布時(shí)間:2023/12/19 java 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java public object_Java_Object 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

說一下java中的Object類。

1、Object:

Object是java類庫中的一個(gè)特殊類,也是所有類的父類。

Object類定義了一些有用的方法,由于是根類,這些方法在其他類中都存在,一般是進(jìn)行了重載或重寫,實(shí)現(xiàn)了各自的具體功能。

1.1、Object中的equals()方法:

講到equals()方法 我們先看下 "==" 與 equals()的區(qū)別:

==是一個(gè)比較運(yùn)算符,對(duì)于基本數(shù)據(jù)類型來說,比較的是值;引用數(shù)據(jù)類型比較的是地址值(指是否為同一個(gè)對(duì)象的引用)(除非是同一個(gè)new出來的對(duì)象,==比較結(jié)果為true,否則均為false)。

equals()是一個(gè)方法,只能比較引用數(shù)據(jù)類型。重寫前比較的是地址值,重寫后一般是比較對(duì)象的屬性。

1.2、為什么要重寫equals()方法?

Object類中的equals()方法比較的是兩個(gè)對(duì)象的內(nèi)存地址,對(duì)象之間比較內(nèi)存地址一般是沒有意義的,所以我們一般會(huì)重寫equals()方法。

舉個(gè)栗子:

我們定義了一個(gè)學(xué)生類,學(xué)生的屬性為id和name,我們認(rèn)為id和name都相同的情況下,他們的equals是true。但是當(dāng)我們執(zhí)行代碼 控制臺(tái)輸出的卻是false。不符合我們的需求,我們需要重寫equals()方法。

public class Student {

public Integer id;

public String name;

public Student(Integer id,String name){

this.id = id;

this.name = name;

}

public static void main(String[] args) {

Student s1 = new Student(1,"Rain");

Student s2 = new Student(1,"Rain");

System.out.println(s1.equals(s2));

}

}

1.3、如何重寫equals()方法?

原則:

1)自反性:對(duì)于任何非空引用X,X.equals(X)應(yīng)該為true;

2)對(duì)稱性:對(duì)于任何引用X和Y,如果X.equals(Y)返回true,那么Y.equals(X)也應(yīng)該返回true;

3)傳遞性:對(duì)于任何引用X,Y,Z,如果X.equals(Y)返回true,Y.equals(Z)返回true,那么X.equals(Z)也應(yīng)該返回true;

4)一致性:如果X和Y引用的對(duì)象沒有發(fā)生變化,那么反復(fù)調(diào)用X.equals(Y)應(yīng)該返回相同的結(jié)果;

5)非空性:對(duì)于任意非空引用X,X.equals(null)應(yīng)該返回false。

一個(gè)栗子:

public class Coder {

public String name;

public int age;

public Coder(){}

public Coder(String name,int age){

this.name = name;

this.age = age;

}

public static void main(String[] args) {

Coder c1 = new Coder("R",26);

Coder c2 = new Coder("R",26);

System.out.println(c1.equals(c2));

}

public boolean equals(Object obj){

//判斷是否為同一對(duì)象

if(this == obj){

return true;

}

//判斷是否為null

if(null == obj){

return false;

}

//判斷兩者類型

if(this.getClass() != obj.getClass()){

return false;

}

//類型轉(zhuǎn)換

Coder coder = (Coder) obj;

//判斷數(shù)據(jù)

if(this.name.equals(coder.name) && this.age == coder.age){

return true;

}

return false;

}

}

因?yàn)橹貙懥薳quals()方法,控制臺(tái)輸出:true

2.1、Object中的hashCode()方法:

在java中,如果我們重寫了equals()方法,那么必定要重寫hashCode()方法。why?

首先我們需要知道hashCode的作用。java中hashCode的主要作用是 用增加哈希存儲(chǔ)結(jié)構(gòu)(HashMap,HashTable之類)的查找速度,這些哈希存儲(chǔ)結(jié)構(gòu)可以通過hashCode來確定對(duì)象在哈希存儲(chǔ)結(jié)構(gòu)中的存儲(chǔ)位置。通過這句描述我們知道:

1)hashCode主要作用在于增加數(shù)據(jù)在哈希家族中的查找速度;

2)如果hashCode相等,它們?cè)诠=Y(jié)構(gòu)中存儲(chǔ)位置相等,但是不是同一個(gè)對(duì)象。換句話說,hashCode相等,調(diào)用equals不一定相等;

3)如果equals相等,那么它們的存儲(chǔ)位置當(dāng)然相等,所以hashCode一定是相等的;

那么為什么必須要重寫hashCode()方法呢?簡(jiǎn)單來說,就是為了保證同一個(gè)對(duì)象,在equals相同的情況下hashCode值必定相同,如果重寫了equals()方法而未重寫hashCode()方法,可能就會(huì)出現(xiàn)兩個(gè)沒有關(guān)系的對(duì)象equals相同(因?yàn)閑quals都是根據(jù)對(duì)象的特征進(jìn)行重寫的),但hashCode不同。

一個(gè)栗子:

//重寫hashCode()

public int hashCode(){

final int prime = 31; //為什么是31?因?yàn)檫@個(gè)數(shù)需要是質(zhì)數(shù) 31是經(jīng) 驗(yàn)證的一個(gè)能夠很好的減少哈希碰撞的質(zhì)數(shù)

int result = 1;

result = prime * result + age;

result = prime * result + ((name == null)?0:name.hashCode());

return result;

}

3.1、Object中的getClass()方法:

getClass()方法返回對(duì)象所屬的類,是一個(gè)class對(duì)象。通過Class對(duì)象可以獲取該類的各種信息,包括類名、父類以及它所實(shí)現(xiàn)的接口名稱。

一個(gè)栗子:

public class Test02 {

public static void printClassInfo(Object obj){

System.out.println("類名:"+obj.getClass().getName());

System.out.println("父類:"+obj.getClass().getSuperclass().getName());

for(int i=0;i

System.out.println("實(shí)現(xiàn)的接口:"+obj.getClass().getInterfaces()[i]);

}

}

public static void main(String[] args) {

String strobj = new String();

printClassInfo(strobj);

}

}

控制臺(tái)輸出:

類名:java.lang.String

父類:java.lang.Object

實(shí)現(xiàn)的接口:interface java.io.Serializable

實(shí)現(xiàn)的接口:interface java.lang.Comparable

實(shí)現(xiàn)的接口:interface java.lang.CharSequence

OK,Object類的方法就介紹以上三個(gè)。

總結(jié)

以上是生活随笔為你收集整理的java public object_Java_Object的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。