Objek ialah kelas yang disediakan oleh Java secara lalai. Kecuali untuk kelas Objek, semua kelas di Jawa mempunyai hubungan warisan. Secara lalai, ia akan mewarisi kelas induk Objek. Iaitu, objek semua kelas boleh diterima menggunakan rujukan Object.
Contoh: Gunakan Object untuk menerima objek semua kelas
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
Jadi dalam pembangunan, kelas Object ialah jenis parameter bersatu tertinggi. Tetapi kelas Objek juga mempunyai beberapa kaedah yang jelas. Seperti berikut:
Berikut ialah tiga kaedah: kaedah toString(), kaedah equals(), kaedah hashcode()
Apabila kita ingin mencetak kandungan objek, kita boleh melakukannya dengan mengatasi kaedah toString dalam kelas Objek!
Yang berikut menerangkan mengapa kaedah toString() harus ditindih
Kod berikut ingin mencetak objek Orang:
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); } }
Lihat hasil pelaksanaan yang dicetak dan ia bukan objek. Kandungan khusus
Berikut ialah kod sumber kaedah println Dalam kod sumber, kaedah valueOf dalam kelas String kod sumber yang melompat ke valueOf, anda boleh menemuinya dalam badan kaedah Malah, kaedah toString dipanggil sekali lagi,
Pada masa ini, mari kita lihat yang khusus. pelaksanaan toString,
getClass ().getName() mengembalikan kelas runtime (Kelas) Objek ini dan mengembalikan nama entiti (kelas, antara muka, tatasusunan kelas, jenis asas atau kekosongan) yang diwakili oleh objek Kelas ini dalam bentuk String
Kaedah hashCode() mengembalikan "alamat"
Integer.toHexString(hashCode()) untuk mendapatkan nilai kod cincang (jenis int) objek ini, dan gunakan kelas Integer kelas pembalut untuk menjana kod cincang jenis int ini Nilai kod Yunani ditukar kepada integer tak bertanda heksadesimal, dan integer heksadesimal ditukar dinyatakan dalam bentuk rentetan
Jadi fungsi output println dilaksanakan dengan memanggil toString di lapisan bawah Jika kita ingin mencetak kandungan khusus objek, kita hanya perlu menulis semula kaedah toString dalam kelas Objek mengikut kami. idea sendiri
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); } }
Hasil pelaksanaan:
Dalam Java, apabila == dibandingkan:
Jika bahagian kiri dan kanan == ialah pembolehubah jenis asas, apa yang dibandingkan ialah Sama ada nilai dalam pembolehubah adalah sama
Jika ==Sisi kiri dan kanan ialah pembolehubah jenis rujukan, perbandingannya ialah sama ada alamat pembolehubah rujukan adalah sama
Jika anda mahu Untuk membandingkan kandungan objek, anda mesti menulis semula kaedah equals dalam Object, kerana kaedah equals juga membandingkan berdasarkan alamat secara lalai Berikut ialah kod sumber kaedah equals:
Kod perbandingan untuk. objek Contoh:
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)); } }
Hasil pelaksanaan:
Kaedah kod cincang digunakan untuk menentukan objek yang disimpan. dalam ingatan Sama ada kedudukannya sama
Fungsi hashCode() dalam jadual cincang adalah untuk mendapatkan kod cincang objek, dan kemudian tentukan kedudukan objek dalam jadual cincang.
Kod sumber kaedah hashCode:
Kaedah ini ialah kaedah asli dan lapisan bawah ditulis dalam kod C/C++ ia tidak boleh diperhatikan penyusunnya.
Kami percaya bahawa dua objek dengan nama yang sama dan umur yang sama adalah objek yang sama dan harus disimpan di lokasi yang sama
Lihat kod yang diberikan di bawah, tiada penggantian kaedah hashCode(), Kedua-dua objek mempunyai kandungan yang sama, tetapi nilai hash yang terhasil adalah berbeza:
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()); } }
Hasil pelaksanaan:
Jadi, jika kita mahu Jika dua objek mempunyai kandungan yang sama dan lokasinya dalam ingatan harus sama, anda perlu mengatasi kaedah 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()); } }
Hasil pelaksanaan:
Atas ialah kandungan terperinci Bagaimana untuk menggunakan kaedah dalam kelas Objek Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!