Java 菜鳥(niǎo)教程

Java 流程控制

Java 數(shù)組

Java 面向?qū)ο?I)

Java 面向?qū)ο?II)

Java 面向?qū)ο?III)

Java 異常處理

Java 列表(List)

Java Queue(隊(duì)列)

Java Map集合

Java Set集合

Java 輸入輸出(I/O)

Java Reader/Writer

Java 其他主題

Java instanceof 關(guān)鍵字

在本教程中,您將在示例的幫助下詳細(xì)了解Java instanceof運(yùn)算符。

在Java中,instanceof關(guān)鍵字是二進(jìn)制運(yùn)算符。它用于檢查對(duì)象是否是特定類的實(shí)例。

運(yùn)算符還檢查對(duì)象是否是實(shí)現(xiàn)接口的類的實(shí)例(將在本教程后面討論)。

instanceof的語(yǔ)法為:

result = objectName instanceof className;

 instanceof運(yùn)算符的左操作數(shù)是對(duì)象名,右操作數(shù)是類名。如果對(duì)象是類的實(shí)例,則結(jié)果為true;如果不是,則為false。

示例1:instanceof

class Main {
    public static void main (String[] args) {
        String name = "nhooo";
        Integer age = 22;

        System.out.println("name是String的實(shí)例嗎: "+ (name instanceof String));
        System.out.println("age是Integer的實(shí)例嗎: "+ (age instanceof Integer));
    }
}

輸出

name是String的實(shí)例嗎: true
age是Integer的實(shí)例嗎: true

在上面的示例中,我們創(chuàng)建了一個(gè)String類型的對(duì)象name和另一個(gè)Integer類型的對(duì)象age。 然后,我們使用instanceof運(yùn)算符檢查名稱是否為String類型以及age是否為Integer類型。

instanceof 和 繼承

在繼承的情況下,instanceof運(yùn)算符用于檢查子類的對(duì)象是否也是超類的實(shí)例。

示例2:繼承中的instanceof

class Animal {
}

//Dog類是Animal的子類
class Dog extends Animal {
}

class Main {
    public static void main(String[] args){
        Dog d1 = new Dog();

        //檢查d1是否是Dog的對(duì)象
        System.out.println("d1是Dog的實(shí)例嗎: "+ (d1 instanceof Dog));
       
        //檢查d1是否是Animal的對(duì)象
        System.out.println("d1是Animal的實(shí)例嗎: "+ (d1 instanceof Animal));
    }
}

輸出

d1是Dog的實(shí)例嗎: true
d1是Animal的實(shí)例嗎: true

在上面的示例中,d1是Dog和Animal類的實(shí)例。 因此,d1 instanceof Dog 和 d1 instanceof Animal 都為true。

Object類

在Java中,所有類都繼承自O(shè)bject類,繼承Object類不使用extends關(guān)鍵字。這種繼承在Java中隱式發(fā)生。

示例3:Object類

class Animal {
}

class Dog {
}

class Cat {
}
class Main {
    public static void main(String[] args) {
        Dog d1 = new Dog();
        Animal a1 = new Animal();
        Cat c1 = new Cat();

        System.out.println("d1是Object類的實(shí)例嗎: "+ (d1 instanceof Object));
        System.out.println("a1是Object類的實(shí)例嗎: "+ (a1 instanceof Object));   
        System.out.println("c1是Object類的實(shí)例嗎: "+ (c1 instanceof Object));
    }
}

輸出

d1是Object類的實(shí)例嗎: true
a1是Object類的實(shí)例嗎: true
c1是Object類的實(shí)例嗎: true

在上面的實(shí)例中,我們分別創(chuàng)建了類Animal、Dog和Cat的對(duì)象a1、d1和c1。我們已經(jīng)使用instanceof操作符來(lái)檢查這些對(duì)象a1, d1, c1是否也是Object類的對(duì)象。輸出結(jié)果都為true(真)。

這是因?yàn)镺bject類是java.lang包中定義的根類。 所有其他類都是在Java中形成層次結(jié)構(gòu)的Object類的子類。

對(duì)象向上轉(zhuǎn)型和向下轉(zhuǎn)型

在Java中,子類的對(duì)象可以視為父類的對(duì)象。這稱為向上轉(zhuǎn)型。通俗地講即是將子類對(duì)象轉(zhuǎn)為父類對(duì)象。此處父類對(duì)象可以是接口。

Java編譯器自動(dòng)執(zhí)行向上轉(zhuǎn)型。

示例4:對(duì)象向上轉(zhuǎn)型

class Animal {
    public void displayInfo() {
        System.out.println("I am an animal.");
    }
}

class Dog extends Animal {
}

class Main {
    public static void main(String[] args) {
        Dog d1 = new Dog();
        Animal a1 = d1;
        a1.displayInfo();
    }
}

輸出

I am an animal.

在上面的實(shí)例中,我們創(chuàng)建了Dog類的對(duì)象d1。我們使用d1對(duì)象來(lái)創(chuàng)建Animal類的對(duì)象a1。這在Java中稱為向上轉(zhuǎn)型。

該代碼執(zhí)行沒(méi)有任何問(wèn)題。這是因?yàn)橄蛏限D(zhuǎn)型是由Java編譯器自動(dòng)完成的。

向下轉(zhuǎn)型是向上轉(zhuǎn)型的相反過(guò)程,也就是與向上轉(zhuǎn)型相反,即是把父類對(duì)象轉(zhuǎn)為子類對(duì)象。

在向下轉(zhuǎn)型的情況下,父類的對(duì)象被視為子類的對(duì)象。我們必須在Java中顯式地指示編譯器向下轉(zhuǎn)型。

示例5:對(duì)象向下轉(zhuǎn)型的問(wèn)題

class Animal {
}

class Dog extends Animal {
   public void displayInfo() {
       System.out.println("I am a dog.");
   }
}

class Main {
   public static void main(String[] args) {
       Animal a1 = new Animal();
       Dog d1 = (Dog)a1; // 向下類型轉(zhuǎn)換
 
       d1.displayInfo();
   }
}

運(yùn)行程序時(shí),將獲得名為的異常ClassCastException。讓我們看看這里發(fā)生了什么。

在這里,我們創(chuàng)建了一個(gè)父類Animal的對(duì)象a1。然后我們嘗試將a1對(duì)象強(qiáng)制轉(zhuǎn)換為子類Dog的對(duì)象d1。

這引起了問(wèn)題。 這是因?yàn)楦割怉nimal的a1對(duì)象也可能引用其他子類。 如果我們與Dog一起創(chuàng)建了另一個(gè)子類Cat; 動(dòng)物可能是貓,也可能是狗,引起歧義。

為了解決這個(gè)問(wèn)題,我們可以使用instanceof運(yùn)算符。這是如何做:

示例6:使用instanceof解決向下類型轉(zhuǎn)換

class Animal {
}

class Dog extends Animal {
  public void displayInfo() {
     System.out.println("I am a dog");
  }
}

class Main {
  public static void main(String[] args) {
    Dog d1 = new Dog();
    Animal a1 = d1;    // 向上轉(zhuǎn)型

    if (a1 instanceof Dog){
       Dog d2 = (Dog)a1;    // 向下轉(zhuǎn)型
       d2.displayInfo();
    }
  }
}

輸出

I am a dog

在上面的示例中,我們使用instanceof運(yùn)算符檢查a1對(duì)象是否為Dog類的實(shí)例。僅當(dāng)表達(dá)式a1 instanceof Dog為true時(shí)才進(jìn)行向下類型轉(zhuǎn)換。

接口 和 instanceof

instanceof運(yùn)算符還用于檢查類的對(duì)象是否也是實(shí)現(xiàn)該類的接口的實(shí)例。

示例7:接口中的instanceof

interface Animal {
}

class Dog implements Animal {
}

class Main {
   public static void main(String[] args) {
      Dog d1 = new Dog();
      System.out.println("d1對(duì)象是Animal的實(shí)例嗎: "+(d1 instanceof Animal));
   }
}

輸出

d1對(duì)象是Animal的實(shí)例嗎: true

在上面的示例中,我們創(chuàng)建了一個(gè)Dog實(shí)現(xiàn)Animal接口的類。

然后,創(chuàng)建Dog類的對(duì)象d1。我們已經(jīng)使用instanceof運(yùn)算符來(lái)檢查d1對(duì)象是否也是Animal接口的實(shí)例。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清