Javaでのequalsと強制タイプ変換


我々は通常"=="を用いて比較する2つのオブジェクトのメモリアドレスであり,2つのオブジェクトのメモリアドレスが等しいかどうかであるが,我々の比較は2つのオブジェクトの内容を比較する場合があるためobjectのequalsメソッドを用いることは不可能であり,実際にJDKではStringやMathなどのクラスがequalsメソッドを書き換えている.だからこれらのクラスの比較はその内容の比較です.
equlsのいくつかの性質を使用する
1、自己反転性:任意の非空値xに対して、x.equals(x)はすべて返されるtrueである
2、対称性:非空参照xとy,x.equals(y)はtrueを返し、y.equals(x)はtrueを返す
3、伝達性:任意の非空参照値x、y、zに対して、x.equals(y)がtrueを返し、y.equals(z)がtrueを返す場合、x.equals(z)はtrueを返す.
4、一貫性:オブジェクト上のequals比較で使用された情報が変更されていない場合、任意の非空参照値xおよびyに対して、x.equals(y)を複数回呼び出すと、常にtrueまたはfalseが返されます.
適切な比較方法を選択
floatとdoubleの比較には特定の方法が必要であることに注意してください.
1)オブジェクトドメイン,equalsメソッドを用いる.2)equalsまたは==を使用するタイプの安全な列挙.3)nullのオブジェクトドメイン:==およびequalsを使用します.4)配列ドメイン:Arraysを使用する.equals . 5)floatとdouble以外の元のデータ型:==を使用します.6)floatタイプ:Floatを使用する.foatToIntBitsをintタイプに変換し、==を使用します.7)doubleタイプ:Doubleを使用する.doubleToLongBitをlongタイプに変換し、==を使用します.
equals()でgetClassを使用してタイプ判定を行う
instanceofは1つのクラスがこのクラスであるか否かを判断するサブクラスであり、getClassは1つのクラスを取得するランタイムオブジェクトであり、equalsを使用すると継承関係とみなされやすいため、2つの異なるが継承関係を持つクラスを1つに分類する.しかしgetClassではこのようなエラーは発生しません.
package TwoWeek;
public class Equal {
	public static void main(String args[]){
        Student e2 = new Student("chenssy");  
        Person p1 = new Person("chenssy");  
        System.out.println(p1.equals(e2));  
	}
}
class Person{
	private String name;
	public Person(String name){
		this.name = name;
	}
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
	public boolean equals(Object object){  
        if(object.getClass() == Person.class){  
        	//       if(object instanceof Person)     true 
            Person p = (Person) object;  
            if(p.getName() == null || name == null){  
                return false;  
            }  
            else{  
                return name.equalsIgnoreCase(p.getName());  
                // String    String  ,      
            }  
        }  
        return false;  
    } 
}
class Student extends Person{  
    public Student(String name){  
        super(name);    
    } 
}  

強制型変換
Javaの継承では、子クラスが親クラスに変換され、強制タイプの変換を行う必要はありませんが、親クラスが子クラスに変換されるときはだめで、強制タイプの変換を行わなければなりませんが、親クラスが子クラスに変換されると必ず成功するかどうか、答えは否定的です.
タイプコンストラクタを使用してオブジェクトを構築すると、このオブジェクトのタイプは決定され、本質的には変化しません.
次の例を見てください.
Father father = new Son;ここでSonはFatherから継承されているので、Sonはより多くの属性を持っていると言えますが、これはアップグレードであり、本質的にはSonタイプですが、弱体化されています.これは可能です.では、それを強いタイプに復元します.
Son son = (Son) father; これは可能です.fatherの本質はSonタイプなので、これは本物に戻すだけです.
では、どのような場合にエラーが発生するのか、その本質がFatherタイプの場合にエラーが発生します.次のようになります.
Father father = new Father();
Son son = (Son) father; 
これでエラーが発生します.それ自体がfatherタイプなので、Sonの属性はありません.
したがって、継承では、子クラスは自動的に親に変換できますが、親クラスが子クラスに強制的に変換される場合、参照タイプが真のアイデンティティが子クラスである場合にのみ強制的に変換に成功します.そうしないと失敗します.