`
JohnShen0708
  • 浏览: 59434 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java 中 instanceof 和 isInstance 的区别

 
阅读更多

今天百度了一下 instanceof 和 isInstance() 的区别,结果不理想。大多数人先贴一段测试代码,然后分别解释它们的用法,根本不是解释它们之间的区别。

本来想快点搜一下看个结论,不料还是被迫自己研究了一下。

 

先说结论,很简单:

instanceof 是静态比较。instanceof 后面的类名在编译时就已知且固定了,即 obj instanceof ClassA,ClassA 必须是已经存在的类名,不然编译都过不了。

isInstance() 是动态比较。isInstance() 的左边可以在运行时决定,即可以这样 objA.getClass().isInstance(objB),objA 可以作为某个方法的参数被传进来,这样可以动态的看两个对象是否类型兼容。

这是主要区别,如果硬要扯其它区别还有 instanceof 是 Java 内置的比较运算符,isInstance() 是个方法。

 

最后附一段测试代码(只示例用法,体现不了区别。注意子类和null):

class A {}
class B extends A {}
class C extends A {}
 
public class InstanceofDemo
{
  public static void main(String args[])
  {
    A a = new A();
    B b = new B();
    C c = new C();
 
    System.out.println("a instanceof A: " + (a instanceof A)); //true
    System.out.println("b instanceof A: " + (b instanceof A)); //true
    System.out.println("c instanceof A: " + (c instanceof A)); //true
    System.out.println("a instanceof B: " + (a instanceof B)); //false
    System.out.println("null instanceof A: " + (null instanceof A)); //false
    System.out.println("a.getClass().isInstance(a): " + a.getClass().isInstance(a)); //true
    System.out.println("a.getClass().isInstance(b): " + a.getClass().isInstance(b)); //true
    System.out.println("b.getClass().isInstance(c): " + b.getClass().isInstance(c)); //false
    System.out.println("b.getClass().isInstance(null): " + b.getClass().isInstance(null)); //false
  }
}

 

分享到:
评论

相关推荐

    详谈Java中instanceof和isInstance的区别

    在Java编程语言中,`instanceof` 和 `Class.isInstance()` 都是用来判断对象是否属于特定类型的工具,但它们之间存在一些微妙的区别。下面将详细解释这两种操作符的用法和差异。 首先,`instanceof` 关键字是Java...

    java中instanceof与Class的等价性代码示例

    在输出结果中,我们可以看到,`x instanceof Base` 和 `Base.isInstance(x)` 都返回 `true`,因为 `x` 是 `Derived` 类的一个实例,而 `Derived` 类继承自 `Base` 类。同样,`x instanceof Derived` 和 `Derived....

    Damaer#Coding#instanceof用法详解1

    1. instanceof关键字 2. isInstance()方法 3. instanceof,isInstance,isAssignableFrom区别是什

    Java高效编程指南

    - 了解类型擦除,避免在泛型方法中使用instanceof或Class.isInstance()。 - 避免使用通配符?的边界类型,除非必要。 4. 方法设计 - 方法应该做一件事,做好一件事,保持函数单一职责。 - 遵循Java命名规范,如...

    Java Reflection (JAVA反射)详解

    Java 反射(Java Reflection)是Java编程语言中的一种高级特性,它允许程序在运行时动态地获取类的信息(如类名、字段、方法等)并进行操作,从而增加了程序的灵活性和动态性。以下是对Java反射机制的详细解释: 1. ...

    Java程序设计示例教程.pdf

    在Java程序设计中,反射机制提供了强大的功能,包括但不限于访问私有成员、创建对象、调用方法和修改字段值。本教程以实例详细讲解了Java反射的使用。 首先,我们来看一个简单的例子,展示了如何使用反射列出`java....

    判断类的缓存大小

    通过对`instanceof`、`isInstance`和`isAssignableFrom`方法的详细介绍,我们可以了解到这些方法在Java中对于判断对象类型和进行类型转换的重要作用。理解并熟练掌握这些方法对于编写高效、健壮的Java应用程序具有...

    JAVA2 反射技术 pdf

    在Java中,`instanceof`是一个关键字,用于判断一个对象是否是某个类的实例。通过反射,我们也可以实现类似的功能: ```java public class InstanceDemo { public static void main(String[] args) { try { ...

    Java程序设计示例教程.docx

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息,并且可以直接操作类的内部属性,包括字段、方法和构造器等。反射在Java程序设计中有着广泛的应用,如JavaBean的可视化操作、...

    java面试题

    通过关键字instanceof或Class.isInstance()方法 49 67. 说出一些常用的类,包,接口,请各举5个 50 68. XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 51 69. jdbc 51 69.1. 简述 51 ...

    java泛型指南 经典

    泛型的引入极大地提高了 Java 语言的类型安全性和代码重用性。本文档旨在深入探讨 Java 泛型的基本概念、使用方法以及高级技巧。 #### 二、Java 泛型概述 Java 泛型是一种允许编译器检查类型安全性的功能,并允许...

    九歌在线java笔试题

    13. **RTTI(运行时类型信息)**:Java支持在运行时检查对象的实际类型,例如`instanceof`关键字和`Class`对象的`isInstance()`方法。 14. **Class.forName()与构造方法**:`Class.forName()`动态加载类并返回其...

    Java 反射详解

    在众多编程语言中,Java反射的灵活性和强大功能使其独树一帜,尤其是在Java Bean组件化、框架扩展性等方面发挥了关键作用。 #### 反射的基本概念与用途 ##### 反射的概念 反射机制允许程序在运行时获取类的信息,...

    Java对象类型的判断详解

    本文将深入探讨Java中三种主要的判断对象类型的手段:`instanceof`、`Class.equals()`以及`Class.isInstance()`和`Class.isAssignableFrom()`。 1. `instanceof` 关键字: `instanceof` 是Java中最常用的判断对象...

    Java开发技术大全 电子版

    3.4.3局部变量和成员变量的区别119 3.4.4方法的访问权限121 3.5方法的调用121 3.5.1方法调用的形式121 3.5.2方法调用的参数123 3.5.3隐含参数this127 3.6构造方法128 3.6.1无参数构造方法的定义和使用129 ...

    举例讲解Java的RTTI运行时类型识别机制

    在Java中,RTTI主要有两种表现形式:`instanceof`关键字和`Class`对象。 1. `instanceof`关键字:`instanceof`用于判断一个对象是否属于某个类或其子类(或者实现了某个接口)。例如,在上述代码中,我们可以通过`...

    类型转换方法

    在Java中,这可以通过`instanceof`关键字检查对象是否可以转换,然后使用`((BaseClass)obj)`进行转换。在C#中,可以使用`is`关键字和`as`运算符,如 `if (obj is BaseClass) { BaseClass baseObj = obj as BaseClass...

    利用Java反射机制实现对象相同字段的复制操作

    Java反射机制是Java语言中一个强大的工具,可以实现对象相同字段的复制操作。下面是对该机制的详细介绍和分析。 一、为什么需要对象相同字段的复制操作? 在项目开发中,我们经常需要在不同的对象之间复制值,这是...

    深入理解Java类型信息(Class对象)与反射机制

    在Java中,Class对象扮演了RTTI的角色,它在运行时提供了识别对象类型和类信息的能力。 传统RTTI假定在编译时已知所有类型,而Java的反射机制则允许在运行时动态地获取和使用类信息。Class类是Java的标准库中的一...

    常用数据类型使用转换详解

    本文将深入探讨在各种编程语言中,如Python、Java、C++、JavaScript等,如何使用和转换常见数据类型,帮助开发者更好地理解和应用这些知识。 1. **基本数据类型**: - **整型(Integer)**: 包括无符号整型和有...

Global site tag (gtag.js) - Google Analytics