Javaの基本:キーワードinstanceof

 

Javaでは、instanceof演算子の前者の演算子は参照変数であり、後者のオペランドは通常、前のオブジェクトが後者のクラスであるか、そのサブクラスであるかを判断するために使用されるクラス(インターフェイスにすることができます)です。クラスインスタンス。そうである場合はtrueを返し、そうでない場合はfalseを返します。

つまり、instanceofキーワードを使用して判断を下す場合、instanceof演算子の左右のオペランドには継承または実現の関係が必要です。

InstanceofはJavaの二項演算子であり、左側にオブジェクト、右側にクラスがあります。オブジェクトが右側のクラスまたはサブクラスによって作成されたオブジェクトの場合はtrueを返し、それ以外の場合はfalseを返します。

  • クラスのインスタンスには、それ自体のインスタンスと、すべての直接または間接のサブクラスのインスタンスが含まれます。
  • instanceofの左側で明示的に宣言された型と右側のオペランドは、同じ型であるか、継承関係を持っている必要があります。つまり、同じ継承ツリーにある必要があります。そうでない場合、コンパイルエラーが発生します。
     

左側のオブジェクトインスタンスを基本データ型にすることはできません 

左側のオブジェクトインスタンスと右側のクラスは同じ継承ツリー上にありません

nullがinstanceofを持つ任意のタイプと比較される場合、それはfalseです。

 

継承ツリー使用して、instanceofの戻り値を決定します

interface Man{}
class Person1 implements Man{}    
class Student extends Person1 {}    
class Postgraduate extends Student {}    
class Animal {}    
public class Ex_instanceOf 
{    
	public static void main(String[] args) {    
	   System.out.println("Student 的对象是谁的实例?");
	   instanceofTest(new Student()); 
	   System.out.println("Animal 的对象是谁的实例?");
	   instanceofTest(new Animal());
	   System.out.println("Postgraduate 的对象是谁的实例?");
	   instanceofTest(new Postgraduate());
	   //一个类的实例是这个类本身的实例,也是他父类,父类的父类的实例,也是实现的接口的实例
	}      
	public static void instanceofTest(Object p) {
		if (p instanceof Animal)
			System.out.println(p.getClass() + "类的实例  是类Animal的实例");
		if (p instanceof Postgraduate)
			System.out.println(p.getClass() + "类的实例  是类Postgraduate的实例");
		if (p instanceof Student)
			System.out.println(p.getClass() + "类的实例  是类Student的实例");
		if (p instanceof Person1)
			System.out.println(p.getClass() + "类的实例  是类Person的实例");
		if (p instanceof Man)
			System.out.println(p.getClass() + "类的实例  是接口Man的实例");
		if (p instanceof Object)
			System.out.println(p.getClass() + "类的实例  是类Object的实例");
 
	}
}

上記の継承ツリーから、特定のクラス(インターフェイスは特別なクラスと見なすこともできます)のオブジェクトが別のクラス(またはインターフェイス)のインスタンスであるかどうかを確認できます。矢印の方向を押すだけで、

このオブジェクトのクラスは、この継承ツリーブランチ(複数のブランチが存在する場合があります)の終了点であり、途中で通過するクラス(このクラスまたはインターフェイスを含む)はすべてこのオブジェクトのインスタンスです。

出力結果は次のとおりです。

Student 的对象是谁的实例?
class t20170722FromInternet.Student类的实例  是类Student的实例
class t20170722FromInternet.Student类的实例  是类Person的实例
class t20170722FromInternet.Student类的实例  是接口Man的实例
class t20170722FromInternet.Student类的实例  是类Object的实例
Animal 的对象是谁的实例?
class t20170722FromInternet.Animal类的实例  是类Animal的实例
class t20170722FromInternet.Animal类的实例  是类Object的实例
Postgraduate 的对象是谁的实例?
class t20170722FromInternet.Postgraduate类的实例  是类Postgraduate的实例
class t20170722FromInternet.Postgraduate类的实例  是类Student的实例
class t20170722FromInternet.Postgraduate类的实例  是类Person的实例
class t20170722FromInternet.Postgraduate类的实例  是接口Man的实例
class t20170722FromInternet.Postgraduate类的实例  是类Object的实例

特定のクラス(インターフェイスは特別なクラスと見なすこともできます)のオブジェクトが別のクラス(またはインターフェイス)のインスタンスであるかどうかを判断するときは、最初に上方変換を実行してから、instanceofキーワードを使用して判断する必要があります。基本動作仕様です。

interface A{
    void say();
}
class B implements A{ 
    public void say()
    {
        System.out.println("B实现的say()方法");
    }
}
class C implements A{
    public void say()
    {
        System.out.println("C实现的say()方法");
    }
}
 
public class TestDemo{
    public static void main(String[] args) {
	    A a= new B();  //接口不能new
	    System.out.println(a instanceof B);   //true;发生了A a= new B();
            System.out.println(a instanceof C);   //false;没有发生A a = new C();      
    }
}

クラスのインスタンスがクラス自体のインスタンスである場合、それはその親クラスのインスタンス、その親クラスの親クラス、
およびそれによって実装されたインターフェイスのインスタンスおよびオペレーターによって宣言されたタイプでもあります。instanceofの左側と右側オペランドは同じタイプである必要があります。そうでない場合、右側は左側の親クラスの継承関係です。

instanceofキーワードの場合、左側は参照型の変数である必要があります

boolean b5 = null instanceof String; 
//false;这是instanceof 特有的规则:若左操作数为null, 结果就直接返回false, 不再运算右操作数是什么类。
boolean b4 = 'A' instanceof Character; 
//编译不通过;'A'在此处视为基本数据类型char,instanceof操作符只能用作对象的判断

 

おすすめ

転載: blog.csdn.net/PrisonJoker/article/details/105525428