`
ywu
  • 浏览: 457447 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

instanceof

阅读更多

说明:

本系列博客是本人在工作中遇到的一些问题的整理,其中有些资料来源网络博客,有些信息来自出版的书籍,掺杂一些个人的猜想及验证,总结,主要目的是方便知识的查看,并非纯原创。本系列博客会不断更新。原创不容易,支持原创。对于参考的一些其他博客,会尽量把博客地址列在博客的后面,以方便知识的查看。

 

instanceof是Java的一个二元操作符,用于判断关键字左边的对象是否是它右边的类型的实例,返回值为boolean类型。

 

看下如下情形,A为接口,B实现接口A,C继承类B,D没有显式继承任何类,也没有实现接口:

/**

 * Created with IntelliJ IDEA.

 * User: yejunwu123@gmail.com

 * Date: 2014-08-17 20:24

 * Description:接口

 */

public interface A {

}

 

/**

 * Created with IntelliJ IDEA.

 * User: yejunwu123@gmail.com

 * Date: 2014-08-17 20:25

 * Description:父类,实现接口A

 */

public class B implements A{

}

 

/**

 * Created with IntelliJ IDEA.

 * User: yejunwu123@gmail.com

 * Date: 2014-08-17 20:25

 * Description:子类,继承B

 */

public class C extends B{

}

 

/**

 * Created with IntelliJ IDEA.

 * User: yejunwu123@gmail.com

 * Date: 2014-08-19 11:04

 * Description:

 */

public class D {

}

 

看下测试类:
图中有红线的是编译不通过的,注释掉

/**

 * Created with IntelliJ IDEA.

 * User: yejunwu123@gmail.com

 * Date: 2014-08-17 20:26

 * Description:

 * 测试java中的instanceof关键字

 * A为接口

 * 类B实现接口A

 * 类C继承类B

 */

public class InstanceofTest {

    public static void main(String[] args) {

        //创建对象

        A ab = new B();

        A ac = new C();

 

        B bb = new B();

        B bc = new C();

 

        C cc = new C();

 

        D dd = new D();

 

        //..instanceof A

        System.out.println("ab instanceof A = " + (ab instanceof A));

        System.out.println("ac instanceof A = " + (ac instanceof A));

        System.out.println("bb instanceof A = " + (bb instanceof A));

        System.out.println("bc instanceof A = " + (bc instanceof A));

        System.out.println("cc instanceof A = " + (cc instanceof A));

        System.out.println("dd instanceof A = " + (dd instanceof A));

        System.out.println("null instanceof A = " + (null instanceof A));

        System.out.println("-------------------------------------");

        //..instanceof B

        System.out.println("ab instanceof B = " + (ab instanceof B));

        System.out.println("ac instanceof B = " + (ac instanceof B));

        System.out.println("bb instanceof B = " + (bb instanceof B));

        System.out.println("bc instanceof B = " + (bc instanceof B));

        System.out.println("cc instanceof B = " + (cc instanceof B));

        //System.out.println("dd instanceof B = " + (dd instanceof B));

        System.out.println("null instanceof B = " + (null instanceof B));

        System.out.println("-------------------------------------");

        //..instanceof C

        System.out.println("ab instanceof C = " + (ab instanceof C));

        System.out.println("ac instanceof C = " + (ac instanceof C));

        System.out.println("bb instanceof C = " + (bb instanceof C));

        System.out.println("bc instanceof C = " + (bc instanceof C));

        System.out.println("cc instanceof C = " + (cc instanceof C));

        //System.out.println("dd instanceof C = " + (dd instanceof C));

        System.out.println("null instanceof C = " + (null instanceof C));

        System.out.println("-------------------------------------");

        //..instanceof D

        System.out.println("ab instanceof D = " + (ab instanceof D));

        System.out.println("ac instanceof D = " + (ac instanceof D));

        //System.out.println("bb instanceof D = " + (bb instanceof D));

        //System.out.println("bc instanceof D = " + (bc instanceof D));

        //System.out.println("cc instanceof D = " + (cc instanceof D));

        System.out.println("dd instanceof D = " + (dd instanceof D));

        System.out.println("null instanceof D = " + (null instanceof D));

    }

}

 

看下测试结果:

ab instanceof A = true

ac instanceof A = true

bb instanceof A = true

bc instanceof A = true

cc instanceof A = true

dd instanceof A = false

null instanceof A = false

-------------------------------------

ab instanceof B = true

ac instanceof B = true

bb instanceof B = true

bc instanceof B = true

cc instanceof B = true

null instanceof B = false

-------------------------------------

ab instanceof C = false

ac instanceof C = true

bb instanceof C = false

bc instanceof C = true

cc instanceof C = true

null instanceof C = false

-------------------------------------

ab instanceof D = false

ac instanceof D = false

dd instanceof D = true

null instanceof D = false

 

不难看出对象的实际类型(注意是实际类型,new关键字后的类型,而不是引用的类型)instanceof关键字后的类型的关系:

1、对象 instanceof 本身类型 = true;ab instanceof B = true,bb instanceof B = true,ac instanceof C = true,bc instanceof C = true,cc instanceof C = true

2、对象 instanceof 本身类型的父类 = true;ac instanceof B = true,bc instanceof B = true,

cc instanceof B = true

3、对象 instanceof 本身类型实现的接口 = true;ab instanceof A = true,ac instanceof A = true,

bb instanceof A = true,bc instanceof A = true,cc instanceof A = true

4null instanceof 任何类型 = false

 

使用instanceof时在编译期间,就会判断操作符左边的对象是否在右边的类型继承层次中,如果不在同一个继承层次中编译就会报错。

 

但是这边有个疑问,dd instanceof A通过了编译,结果为false,具体细节不太清楚,为什么instanceof后的类型为接口能通过编译。

 

有意思的是,知乎上有个关于instanceof的讨论,有兴趣的可以看下,本人稍微看了下,反正是边看边笑,那感觉就像是学渣看学霸在讲题,呵呵呵呵

http://www.zhihu.com/question/21574535

 

 

 

  • 大小: 86.2 KB
分享到:
评论

相关推荐

    JS中typeof与instanceof的区别

    JS 中 typeof 与 instanceof 的区别 在 JavaScript 中,typeof 和 instanceof 是两个常用的运算符,用来判断一个变量是否为空,或者是什么类型的。但是,这两个运算符之间还是有区别的。 typeof 运算符是一个一元...

    instanceof关键字.md

    ### instanceof 关键字详解 在Java编程语言中,`instanceof`是一个十分重要的关键字,用于判断一个对象是否属于特定的类或接口。本文将详细解释`instanceof`的关键特性和使用场景,并通过示例代码加深理解。 #### ...

    PHP强制对象类型之instanceof操作符

    if ($header instanceof Div && $body instanceof Div && $footer instanceof Header1) { // 生成页面 } else { throw new InvalidArgumentException('Incorrect element types'); } } } ``` 在这个例子中,`...

    instanceof 和 prototype 关系

    在JavaScript中,`instanceof`和`prototype`是两个非常重要的概念,它们涉及到对象的类型检测和继承机制。本文将深入探讨这两个关键字的关系及其在实际编程中的应用。 首先,我们来理解`instanceof`操作符。`...

    JS:typeof instanceof constructor prototype区别

    本文将深入探讨四种常用的方法来识别和判断JavaScript中的数据类型:`typeof`、`instanceof`、`constructor`以及`prototype`。 ### 1. `typeof` `typeof`操作符是最常见的类型检测方式之一,它返回一个表示未经计算...

    instanceof 判断引用类型,typeof判断基本类型。

    在JavaScript编程语言中,`instanceof` 和 `typeof` 是两个非常重要的操作符,用于判断变量的类型。它们各自有着不同的用途和用法,对于理解和调试代码至关重要。 首先,我们来详细了解一下`instanceof`操作符。`...

    向下转型和instanceof运算符的应用.pdf

    在面向对象编程中,向下转型和`instanceof`运算符是两种重要的概念,尤其是在多态性的实现中扮演关键角色。本文将深入探讨这两个主题,并结合Delphi编程语言的背景进行阐述,尽管`instanceof`运算符在Java中更为常见...

    instanceof.js ES5的instanceof手写实现

    ES5的instanceof手写实现

    instanceof关键字---马克-to-win java视频

    instanceof 马克-to-win java视频的详细的描述介绍

    java基础——方法的重写、多态+instanceof(csdn)————程序.pdf

    例如,`if (object instanceof MyClass)` 将返回 `true` 如果 `object` 是 `MyClass` 或其子类的实例。这个运算符在处理多态时非常有用,可以用来判断对象的实际类型,以便执行适当的操作。 在使用多态时,应避免...

    15.instanceof运算符.zip

    15.instanceof运算符.zip15.instanceof运算符.zip15.instanceof运算符.zip15.instanceof运算符.zip15.instanceof运算符.zip15.instanceof运算符.zip15.instanceof运算符.zip15.instanceof运算符.zip15.instanceof...

    详解JavaScript中typeof与instanceof用法

    在JavaScript中,typeof和instanceof是常用的两种检测数据类型的方式,它们各自有其适用的场景和特点。 ### typeof typeof 是一个一元运算符,它用于返回变量或表达式的类型。当使用typeof运算符时,它通常会返回...

    08-手写instanceof.md

    特别是对于JavaScript中的instanceof操作符的深入理解,是前端开发者应该掌握的一个重要知识点。instanceof操作符常用于判断一个实例对象是否为某个类的实例,或者实例是否属于某个类的原型链上。 ### instanceof...

    js中的instanceof操作符1

    `instanceof`是JavaScript中的一个操作符,用于检查一个对象是否是特定构造函数的实例,或者更具体地说,是检查该对象的原型链上是否存在指定构造函数的`prototype`。这个操作符对于理解和处理对象继承关系非常关键...

    前端面试题之baseJS-instanceof.zip

    "baseJS-instanceof.zip"这个压缩包文件显然聚焦于JavaScript的基础知识,特别是`instanceof`操作符的使用。在这里,我们将深入探讨`instanceof`在JavaScript中的工作原理、相关知识点以及在实际编程中的应用。 `...

    Java中instanceOf关键字的用法及特性详解.rar

    在Java编程语言中,`instanceof`关键字是一个非常重要的工具,它用于判断对象是否属于某个类、接口或者其子类。这个关键字可以帮助开发者在运行时检查一个对象的类型,从而进行更加灵活的代码控制。本篇文章将深入...

    第05章 面向对象(下) 09 Instanceof关键字

    面向对象编程是Java语言的核心特性之一,而`instanceof`关键字在Java中扮演着重要的角色。本章将深入探讨`instanceof`关键字的使用、原理以及它在实际开发中的应用场景。 `instanceof`关键字用于判断一个对象是否...

    JavaScript的instanceof有bug?

    在JavaScript中,`instanceof`操作符用于检测一个对象是否属于某个类的实例。这个操作符在日常开发中被广泛使用,但有时它可能会表现出一些意外的行为,这可能被误认为是“bug”。本文将深入探讨`instanceof`的工作...

Global site tag (gtag.js) - Google Analytics