1. 程式人生 > >Java中的Object-equals()方法

Java中的Object-equals()方法

簡單的說,這個類時所有類的始祖,就和C#一樣,所有的類都是從這個類繼承而來,而在C++沒有這樣的一個類。如果沒有明確指出超類(就是父類,Java這麼稱呼吧,不太習慣),超類就是Object。

在Java中只有字元型,數值型和布林型不是物件,其他都可以從Object繼承而來。

首先,Object定義了一些基本的類方法,例如equals,toString簡直和C#一樣。還有hashCode方法。

equals方法在Object類中可以比較是否引用同一個物件,這樣解釋合情合理,只是對於大多數的類來說,直接使用真的有點雞肋,所以我們需要重寫這個類的實現。

下面是Object的equals的API,先了解下通用的equals:

(1)static boolean equals(Obicet,Object);

(2)static boolean equals(type[] a,type[] b);

第一個是之前說過的比較是否引用同一個物件,第二個是比較陣列,如果陣列的大小每個下標的值都相同的那麼兩個陣列就相等(這個還是非常好用的)。

舉例說明一下吧,比較兩個僱員相等,我們從薪資,姓名id比較都相等的話就想等。

下面是我編寫這樣的一個equals。職工類和經理類,經理類繼承與職工類。經理類比職工類多一個例項域獎金prizes。這樣的話會編寫一個子類的equals。

class Employee{
	private String name;
	private int id;
	private double salary;
	private static int nextId=1;
	public Employee(String n,double sal) {
		name=n;
		salary=sal;
		id=0;
	}
	public void setId() {
		id=nextId;
		nextId++;
	}
	public int getId() {
		return id;
	}
	public double getSalary() {
		return salary;
	}
	public String getName() {
		return name;
	}
	public static int getNextId() {
		return nextId;
	}
	public boolean equals(Object other) {
		if(this==other)//比較是否引用同一物件
			return true;
		if(other==null)
			return false;
		if(getClass()!=other.getClass())
			return false;
		Employee aother=(Manager)other;
		return salary==aother.salary
				&&id==aother.id
				&&Object.equals(name,aother.name);
		
	}
	public static void main(String[] args) {
		Employee e=new Employee("wudi",100000);
		System.out.println(e.getName()+":"+e.getSalary());
		System.out.println(nextId);//比較每一項的資料值,物件比較使用equals,數值比較使用==
	}		
}
class Manager extends Employee{
	private double prizes;
	public Manager(String aname,double asalary,double aprizes) {
		super(aname, asalary);
		prizes=aprizes;
	}
	public boolean equals(Object employee) {
		if(!(super.equals(employee)))
			return false;
		Manager otherEmployee=(Manager)employee;
		return prizes==otherEmployee.prizes;
	}
	
}
上面的getClass是返回物件的類,類似於C++的typeof吧。
編寫一個完美的equals的建議:

1)顯示的命名Obect,後面將轉換它,特別容易忘記

2)檢查this==other是否引用同一物件

3)檢測other是否為空,為空的話不想等

4)比較this和other是否是同一個類的物件

在這裡注意:如果每個子類都重新定義了equals的話使用getClass,所有子類都有統一的定義的話使用instanceof比較好。

這裡如果子類沒有改變的話可以這樣寫if(!(other instanceof Employee))return false;

5)把Obiect轉換為對應的類,比如上面的Empolyee類物件,然後比較每一項的資料值,物件比較使用equals,數值比較使用==

子類改變的話呼叫super即可。

相關推薦

JavaObject-equals方法

簡單的說,這個類時所有類的始祖,就和C#一樣,所有的類都是從這個類繼承而來,而在C++沒有這樣的一個類。如果沒有明確指出超類(就是父類,Java這麼稱呼吧,不太習慣),超類就是Object。 在Java中只有字元型,數值型和布林型不是物件,其他都可以從Object繼承而來。

java的API,學習object的類equals方法的問題,

一、什麼是API 即:Application Programing interface應用程式介面。就是javajdk中提供給我們使用的類,已經封裝好的,直接拿來用就行了。 二、Object類 object類是所有類的父類,在lang包中,lang包不用匯入。 介面中沒有構造方法

Java Object克隆clone方法的使用

測試程式碼 package test04; // // protected Object clone()建立並返回物件一個副本。因為是protected型別的方法,只能在子類訪問 // 如果使用clone(),需要重寫此方法。 // 注意和Student

在定義類時,何時需要重寫Objectequals方法

在比較兩個物件時可以使用==和 equals()。==用於比較兩個物件的引用地址是否相等,而equals()方法主要用於比較兩個物件的內容是否相等。和equals()的差別請參見“和equals()有什麼區別?”的解答。 在 Object 中已定義了 equals()方法,但是該方法直接採用

Java關於==和equal的區別以及equals方法重寫

例子i: string1="aaa"; string2="aaa"; String string3=new String("aaa"); String string4=new String("aaa"); string1==string2 // true; . string1.equals(string2)

Javaequals方法 和 == 的區別和聯絡

淺談Java中的equals和==  在初學Java時,可能會經常碰到下面的程式碼: String str1 = new String("hello"); String str2 = new String("hello"); System.out.print

執行緒sleep方法Object的wait方法的區別

這兩者的施加者是有本質區別的. sleep()是讓某個執行緒暫停執行一段時間,其控制範圍是由當前執行緒決定,也就是說,線上程裡面決定.好比如說,我要做的事情是 "點火->燒水->煮麵",而當我點完火之後我不立即燒水,我要休息一段時間再燒.對於執行的主動權是由我

Java判斷相等==和equals方法

 Java中判斷兩個變數是否相等有兩種方式:一種是利用==運算子,另一種是利用equals方法。如果變數是基本型別,那麼使用==和使用equals會得到相同的結果,都是判斷變數的值是否相對。如果變數是

java的synchronize修飾方法

        Synchronize對方法的修飾可分為對一般方法的修飾和對靜態方法的修飾,首先看Synchronize對一般方法的修飾。         Synchronize對一般方法的修飾和對程

Java學習筆記13equals方法;toString()方法

test pre 輸出 setname ring ash rgs println pub equals()方法;   equals方法是Object類中的方法;Object是所有類的祖宗,所以所有類都有equals()方法;   boolean equals(Objec

== 與 equals方法的區別

return 使用 自定義類 [] true 適用於 內容 lean 編譯 * equals()方法的使用 * * 1.java.lang.Object類中的equals()方法的定義: * * public boolean equals(Object obj

javaObject類的getClass方法有什麽用以及怎麽使用?

全部 pan spa 下載 index person finalize Beginner ret Object類的getClass的用法: (視頻下載) (全部書籍) Object類中有一個getClass方法,m a r k- t o- w i n:它會返回一個你

事件繫結的call方法和apply方法

今天對於call方法和apply方法有些懵,所以去看了些別人的總結,感覺有了點概念,把一些大佬寫的東西中自己感覺易懂的解釋和經典的案例記錄一下。 定義 call方法: 語法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定義:呼叫一個物件的一個

JQuery的trim方法去掉前後空格

function bt_submit(){ var $title = $.trim($("#title").val()); if($title=="") { ShowMessage("運營商名稱不能為空","#ff0000"); retu

tp 的I方法

tp  中I方法,取義Input,用來獲取前臺提交的過來的資料 下面我來說I()方法的使用技巧 I('post.name',' ','htmlspecialchars');獲取_$POST['name

Javaequals和hashCode方法詳解

Java中的equals方法和hashCode方法是Object中的,所以每個物件都是有這兩個方法的,有時候我們需要實現特定需求,可能要重寫這兩個方法,今天就來介紹一些這兩個方法的作用。 equa

Android開發使用startActivityForResult方法從Activity A跳轉Activity B出現B退出時A也同時退出的解決辦法

最近一個 App 中用到了 startActivityForResult() 方法,使用的時候卻出現了一些問題,比如我在 Activity A 中呼叫該方法向 Activity B 中跳轉,如果 B 中完成一系列操作之後用 setResult(resultcode, intent); f

為什麼在重寫equals方法時,一般都會重寫HashCode方法

重寫equals()方法主要是為了方便比較兩個物件內容是否相等。hashCode()方法用於返回呼叫該方法的物件的雜湊碼值,此方法將返回整數形式的雜湊碼值。 一個類如果重寫了 equals()方法,通常也有必要重寫 hashCode()方法,目的是為了維護hashCode()方法的常規協定,

如何覆寫javaequals和hashcode方法

          這篇文章算是一個翻譯,原文在:點選開啟連結,但我並沒有一字不差全部翻譯,只是選出一些重點,大家有興趣可以看看原文。           Equals和 hashCode是java中一個物件的兩個基本方法和core java的重要組成部分。Equals用

為什麼一個好的類需要覆寫toString、hashCodeequals方法

第一:覆寫Object類中的toString方法public class Client { public static void main(String[] args) { System.out.println(new Person("張三"