说明:
本系列博客是本人在工作中遇到的一些问题的整理,其中有些资料来源网络博客,有些信息来自出版的书籍,掺杂一些个人的猜想及验证,总结,主要目的是方便知识的查看,并非纯原创。本系列博客会不断更新。原创不容易,支持原创。对于参考的一些其他博客,会尽量把博客地址列在博客的后面,以方便知识的查看。
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
4、null instanceof 任何类型 = false
使用instanceof时在编译期间,就会判断操作符左边的对象是否在右边的类型继承层次中,如果不在同一个继承层次中编译就会报错。
但是这边有个疑问,dd instanceof A通过了编译,结果为false,具体细节不太清楚,为什么instanceof后的类型为接口能通过编译。
有意思的是,知乎上有个关于instanceof的讨论,有兴趣的可以看下,本人稍微看了下,反正是边看边笑,那感觉就像是学渣看学霸在讲题,呵呵呵呵
http://www.zhihu.com/question/21574535
相关推荐
JS 中 typeof 与 instanceof 的区别 在 JavaScript 中,typeof 和 instanceof 是两个常用的运算符,用来判断一个变量是否为空,或者是什么类型的。但是,这两个运算符之间还是有区别的。 typeof 运算符是一个一元...
### instanceof 关键字详解 在Java编程语言中,`instanceof`是一个十分重要的关键字,用于判断一个对象是否属于特定的类或接口。本文将详细解释`instanceof`的关键特性和使用场景,并通过示例代码加深理解。 #### ...
if ($header instanceof Div && $body instanceof Div && $footer instanceof Header1) { // 生成页面 } else { throw new InvalidArgumentException('Incorrect element types'); } } } ``` 在这个例子中,`...
在JavaScript中,`instanceof`和`prototype`是两个非常重要的概念,它们涉及到对象的类型检测和继承机制。本文将深入探讨这两个关键字的关系及其在实际编程中的应用。 首先,我们来理解`instanceof`操作符。`...
本文将深入探讨四种常用的方法来识别和判断JavaScript中的数据类型:`typeof`、`instanceof`、`constructor`以及`prototype`。 ### 1. `typeof` `typeof`操作符是最常见的类型检测方式之一,它返回一个表示未经计算...
在JavaScript编程语言中,`instanceof` 和 `typeof` 是两个非常重要的操作符,用于判断变量的类型。它们各自有着不同的用途和用法,对于理解和调试代码至关重要。 首先,我们来详细了解一下`instanceof`操作符。`...
在面向对象编程中,向下转型和`instanceof`运算符是两种重要的概念,尤其是在多态性的实现中扮演关键角色。本文将深入探讨这两个主题,并结合Delphi编程语言的背景进行阐述,尽管`instanceof`运算符在Java中更为常见...
ES5的instanceof手写实现
instanceof 马克-to-win java视频的详细的描述介绍
例如,`if (object instanceof MyClass)` 将返回 `true` 如果 `object` 是 `MyClass` 或其子类的实例。这个运算符在处理多态时非常有用,可以用来判断对象的实际类型,以便执行适当的操作。 在使用多态时,应避免...
15.instanceof运算符.zip15.instanceof运算符.zip15.instanceof运算符.zip15.instanceof运算符.zip15.instanceof运算符.zip15.instanceof运算符.zip15.instanceof运算符.zip15.instanceof运算符.zip15.instanceof...
在JavaScript中,typeof和instanceof是常用的两种检测数据类型的方式,它们各自有其适用的场景和特点。 ### typeof typeof 是一个一元运算符,它用于返回变量或表达式的类型。当使用typeof运算符时,它通常会返回...
特别是对于JavaScript中的instanceof操作符的深入理解,是前端开发者应该掌握的一个重要知识点。instanceof操作符常用于判断一个实例对象是否为某个类的实例,或者实例是否属于某个类的原型链上。 ### instanceof...
`instanceof`是JavaScript中的一个操作符,用于检查一个对象是否是特定构造函数的实例,或者更具体地说,是检查该对象的原型链上是否存在指定构造函数的`prototype`。这个操作符对于理解和处理对象继承关系非常关键...
"baseJS-instanceof.zip"这个压缩包文件显然聚焦于JavaScript的基础知识,特别是`instanceof`操作符的使用。在这里,我们将深入探讨`instanceof`在JavaScript中的工作原理、相关知识点以及在实际编程中的应用。 `...
在Java编程语言中,`instanceof`关键字是一个非常重要的工具,它用于判断对象是否属于某个类、接口或者其子类。这个关键字可以帮助开发者在运行时检查一个对象的类型,从而进行更加灵活的代码控制。本篇文章将深入...
面向对象编程是Java语言的核心特性之一,而`instanceof`关键字在Java中扮演着重要的角色。本章将深入探讨`instanceof`关键字的使用、原理以及它在实际开发中的应用场景。 `instanceof`关键字用于判断一个对象是否...
在JavaScript中,`instanceof`操作符用于检测一个对象是否属于某个类的实例。这个操作符在日常开发中被广泛使用,但有时它可能会表现出一些意外的行为,这可能被误认为是“bug”。本文将深入探讨`instanceof`的工作...