オブジェクトは、Java によってデフォルトで提供されるクラスです。 Object クラスを除く、Java のすべてのクラスには継承関係があります。デフォルトでは、Object 親クラスを継承します。つまり、Object のリファレンスを使用して、すべてのクラスのオブジェクトを受け取ることができます。
例: Object を使用してすべてのクラスのオブジェクトを受け取る
class Person{} class Student{} public class Test { public static void main(String[] args) { function(new Person()); function(new Student()); } public static void function(Object obj) { System.out.println(obj); } } //执行结果: Person@1b6d3586 Student@4554617c
したがって、開発中、Object クラスは最も上位に統合されたパラメータのタイプになります。ただし、Object クラスには明確に定義されたメソッドもいくつかあります。次のように:
ここでは 3 つのメソッドを示します: toString() メソッド、equals() メソッド、hashcode() メソッド
オブジェクトの内容を印刷したい場合は、Object クラスの toString メソッドをオーバーライドすることで実行できます。
toString() メソッドをオーバーライドする必要がある理由を以下に説明します。
次のコードは、Person オブジェクトを出力します:
public class Person { String name; String gender; int age; public Person(String name, String gender, int age) { this.name = name; this.gender = gender; this.age = age; } public static void main(String[] args) { Person person = new Person("Jim","男", 18); System.out.println(person); } }
実行結果と出力された内容を確認します。は、オブジェクトの特定の内容ではありません。
ここで println メソッドのソース コードを確認してください。ソース コードでは、String クラスの valueOf メソッドが呼び出されます。 valueOf のソース コードを見ると、メソッド本体が実際にあることがわかります。 toString メソッドが再度呼び出されます。
# 次に、toString の具体的な実装を見てみましょう。#getClass() .getName() は、このオブジェクトのランタイム クラス (Class) を返し、表現されるエンティティ (クラス、インターフェイス、配列クラス、基本型または void) の名前を返します。この Class オブジェクトを String 形式で取得します。
hashCode() メソッドは「アドレス」を返します。
Integer.toHexString(hashCode()) このオブジェクトのハッシュ コード値を取得します (int 型) 、ラッパー クラス Integer クラスを使用して、この int 型値のハッシュ コードを取得し、それを 16 進数の符号なし整数に変換し、変換された 16 進数の整数を文字列の形式で表現します。
したがって、出力関数 println印刷オブジェクトの具体的な内容を実現したい場合は、Object クラスの toString メソッドを独自のアイデアに従って書き換えるだけで済みます。
public class Person { String name; String gender; int age; @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", gender='" + gender + '\'' + ", age=" + age + '}'; } public Person(String name, String gender, int age) { this.name = name; this.gender = gender; this.age = age; } public static void main(String[] args) { Person person = new Person("xin","男", 21); System.out.println(person); } }
実行結果:
3. オブジェクトの比較はメソッドと等しい
オブジェクト比較コード例:
class Person{ private String name ; private int age ; public Person(String name, int age) { this.age = age ; this.name = name ; } @Override public boolean equals(Object obj) { if (obj == null) { return false ; } if(this == obj) { return true ; } //不是Person类对象 if (!(obj instanceof Person)) { return false ; } Person person = (Person) obj ; // 向下转型,比较属性值 return this.name.equals(person.name) && this.age==person.age ; } } public class Test { public static void main(String[] args) { Person p1 = new Person("xin", 20); Person p2 = new Person("xin", 20); Person p3 = new Person("rong", 21); System.out.println(p1.equals(p2)); System.out.println(p1.equals(p3)); } }
実行結果:
##4. hashCode メソッド
ハッシュコード メソッドは、メモリに格納されているオブジェクトの位置が同じかどうかを判断するために使用されますhashCode メソッドのソース コード:
#このメソッドはネイティブ メソッドであり、最下層は C/C コードで記述されており、C/C コードでは観察できません。コンパイラ。同じ名前と同じ年齢を持つ 2 つのオブジェクトは同じオブジェクトであり、同じ場所に保存されるべきであると考えられます。
以下のコードを見てください。 hashCode() メソッド、2 つのオブジェクトの内容は同じですが、結果のハッシュ値は異なります:
class Person { public String name; public int age; public Person(String name, int age) { this.name = name; this.age = age; } } public class TestDemo4 { public static void main(String[] args) { Person per1 = new Person("xin", 21) ; Person per2 = new Person("xin", 21) ; System.out.println(per1.hashCode()); System.out.println(per2.hashCode()); } }
実行結果:
つまり、 2 つのオブジェクトを考えたい場合 2 つのオブジェクトが同じ内容を持ち、メモリ内のそれらの位置が等しい必要がある場合、hashCode() メソッドをオーバーライドする必要があります。import java.util.Objects; class Person { public String name; public int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public int hashCode() { return Objects.hash(name, age); } } public class TestDemo4 { public static void main(String[] args) { Person per1 = new Person("xin", 21) ; Person per2 = new Person("xin", 21) ; System.out.println(per1.hashCode()); System.out.println(per2.hashCode()); } }
以上がJavaオブジェクトクラスのメソッドの使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。