Bagaimana menentukan sebuah objek's class?

Jika kelas B dan kelas C memperpanjang kelas A dan saya memiliki sebuah objek dari tipe B atau C, bagaimana saya bisa menentukan dari jenis ini adalah turunan?

Mengomentari pertanyaan (2)
Larutan
if (obj instanceof C) {
//your code
}
Komentar (6)

Gunakan Objek.getClass(). Kembali runtime jenis objek.

Komentar (3)

Beberapa jawaban yang tepat disajikan, tetapi masih ada banyak lagi metode: Kelas.isAssignableFrom() dan hanya mencoba untuk melemparkan objek (yang mungkin melemparkan ClassCastException).

Mungkin cara yang diringkas

Let's meringkas cara yang mungkin untuk menguji apakah sebuah objek obj adalah contoh dari jenis C:

// Method #1
if (obj instanceof C)
    ;

// Method #2
if (C.class.isInstance(obj))
    ;

// Method #3
if (C.class.isAssignableFrom(obj.getClass()))
    ;

// Method #4
try {
    C c = (C) obj;
    // No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}

// Method #5
try {
    C c = C.class.cast(obj);
    // No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}

Perbedaan null penanganan

Ada perbedaan dalam null penanganan meskipun:

  • Dalam pertama 2 metode ekspresi mengevaluasi untuk palsu jika obj adalah null (null adalah bukan contoh dari apa-apa).
  • 3 metode akan membuang NullPointerException jelas.
  • 4 dan ke-5 metode sebaliknya menerima null karena null dapat cor untuk semua jenis!

mengingat: null tidak contoh dari jenis apa pun, tapi itu dapat cast untuk setiap jenis.

Catatan

  • Kelas.getName() tidak boleh digunakan untuk melakukan "adalah contoh-" tes karena jika objek bukan tipe C, tapi sebuah subclass dari itu, mungkin memiliki nama yang sama sekali berbeda dan paket (oleh karena itu nama kelas akan jelas tidak cocok) tapi itu masih tipe C.
  • Untuk warisan alasan Kelas.isAssignableFrom() adalah tidak symmetric: obj.getClass().isAssignableFrom(C.class) akan kembali palsu jika jenis obj adalah sebuah subclass dari C.
Komentar (1)

Anda dapat menggunakan:

Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass' Class object

HTH. Tapi saya pikir sebagian besar waktu itu adalah praktik yang baik untuk digunakan untuk mengontrol aliran atau sesuatu yang serupa...

Komentar (1)

Penggunaan salah satu metode yang disarankan adalah dianggap sebagai kode bau yang berbasis di buruk OO desain.

Jika desain anda baik, anda tidak harus menemukan diri anda perlu untuk menggunakan getClass() atau instanceof.

Salah satu metode yang disarankan akan dilakukan, tetapi hanya sesuatu yang perlu diingat, desain-bijaksana.

Komentar (11)

Kita dapat menggunakan refleksi dalam hal ini

objectName.getClass().getName();

Contoh:-

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getClass().getName();

}

Dalam hal ini anda akan mendapatkan nama kelas objek yang lulus untuk HttpServletRequest antarmuka pustaka variabel.

Komentar (2)

Ada juga yang .isInstance metode "Kelas" kelas. jika anda mendapatkan sebuah objek's class melalui myBanana.getClass() dapat anda lihat jika anda objek myApple adalah sebuah instance dari kelas yang sama sebagai myBanana via

myBanana.getClass().isInstance(myApple)
Komentar (0)

memeriksa dengan isinstance() tidak akan cukup jika anda ingin tahu dalam jangka waktu. gunakan:

jika(someObject.getClass().sama dengan(C.class){ // melakukan sesuatu }

Komentar (0)