侧边栏壁纸
博主头像
孔子说JAVA博主等级

成功只是一只沦落在鸡窝里的鹰,成功永远属于自信且有毅力的人!

  • 累计撰写 352 篇文章
  • 累计创建 135 个标签
  • 累计收到 10 条评论

目 录CONTENT

文章目录

java中instanceof、isInstance、.class、getClass()区别详解

孔子说JAVA
2022-10-02 / 0 评论 / 0 点赞 / 89 阅读 / 4,896 字 / 正在检测是否收录...
广告 广告

java 中的 instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。isInstance()方法是 Class 类的一个方法,用于检查给定对象是否是具有此Class表示的对象的实例,是一种非静态方法,只能通过类对象访问,作用同 instanceof,但是使用方式是有区别的。

1、instanceof、isInstance、.class、getClass()介绍

1.1 instanceof

instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例,使用方式:obj.instanceof(class),是指对象obj是不是class这种类型。

  1. 一个对象是本身类的一个对象

  2. 一个对象是本身类父类(父类的父类)和接口(接口的接口)的一个对象

  3. 所有对象都是Object

  4. 凡是null有关的都是false null.instanceof(class)

1.2 isInstance

isInstance()方法是 Class 类的一个方法,用于检查给定对象是否是具有此Class表示的对象的实例,是一种非静态方法,只能通过类对象访问,如果尝试使用类名称访问该方法,则会收到错误消息。使用方式:class.isInstance(obj),表示obj这个对象能不能被转化为class这个类。

  1. 一个对象是本身类的一个对象

  2. 一个对象能被转化为本身类所继承类(父类的父类等)和实现的接口(接口的父接口)强转

  3. 所有对象都能被Object的强转

  4. 凡是null有关的都是false class.inInstance(null)

  5. 在检查给定对象是否与其他对象兼容时, isInstance()方法不会引发异常。

1.3 类名.class 和 对象.getClass()

类名.class和对象.getClass()几乎没有区别,因为一个类被类加载器加载后,就是唯一的一个类。

image

2、实例讲解

2.1 类定义

定义一个Animal接口,再定义一个哺乳动物类 Suckler 实现 Animal 接口,猫科动物类 Cat 继承自 哺乳动物类 Suckler。

Animal.java(动物接口)

public interface Animal{
}

Suckler.java(哺乳动物类)

public class Suckler implements Animal {
}

Cat.java(猫科动物类)

public class Cat extends Suckler {

    public static void testInstance(Animal animal) {
        String simpleName = animal.getClass().getSimpleName();
        System.out.println("type " + simpleName);
        System.out.println(simpleName + " instanceof Suckler: " + (animal instanceof Suckler));
        System.out.println(simpleName + " instanceof Cat: " + (animal instanceof Cat));
        System.out.println("-----------------------------------------");

        System.out.println(simpleName + ": Suckler.isInstance(x): " + Suckler.class.isInstance(animal));
        System.out.println(simpleName + ": Cat.isInstance(x): " + Cat.class.isInstance(animal));
        System.out.println("-----------------------------------------");

        System.out.println(simpleName + ": x.getClass() == Suckler.class: " + (animal.getClass() == Suckler.class));
        System.out.println(simpleName + ": x.getClass() == Cat.class: " + (animal.getClass() == Cat.class));
        System.out.println("-----------------------------------------");

        System.out.println(simpleName + ": x.getClass().equals(Suckler.class)): " + (animal.getClass().equals(Suckler.class)));
        System.out.println(simpleName + ": x.getClass().equals(Cat.class)): " + (animal.getClass().equals(Cat.class)));
        System.out.println("*****************************************");
    }

    public static void main(String[] args) {
        // 哺乳动物
        Suckler suckler = new Suckler();
        // 猫
        Cat cat = new Cat();

        testInstance(suckler);
        testInstance(cat);
    }
}

2.2 测试

测试代码在Cat类中,执行Cat的main方法,输出结果如下:

type Suckler
Suckler instanceof Suckler: true
Suckler instanceof Cat: false
-----------------------------------------
Suckler: Suckler.isInstance(x) true
Suckler: Cat.isInstance(x) false
-----------------------------------------
Suckler: x.getClass() == Suckler.class true
Suckler: x.getClass() == Cat.class false
-----------------------------------------
Suckler: x.getClass().equals(Suckler.class)) true
Suckler: x.getClass().equals(Cat.class)) false
*****************************************
type Cat
Cat instanceof Suckler: true
Cat instanceof Cat: true
-----------------------------------------
Cat: Suckler.isInstance(x) true
Cat: Cat.isInstance(x) true
-----------------------------------------
Cat: x.getClass() == Suckler.class false
Cat: x.getClass() == Cat.class true
-----------------------------------------
Cat: x.getClass().equals(Suckler.class)) false
Cat: x.getClass().equals(Cat.class)) true
*****************************************

2.3 结果解析

2.3.1 instanceof 解析

如果对象是某个类或其子类的一个实例,则这个对象属于这个类型。

System.out.println(cat instanceof Suckler); // true
System.out.println(cat instanceof Cat);   // true

父类对象不是子类这种类型。

System.out.println(suckler instanceof Cat);  //false

null 不属于任何类型。

System.out.println(null instanceof Suckler);    //false
System.out.println(null instanceof Cat);    //false
System.out.println(null instanceof Object);  //false

所有类都属于 Object 类型。

System.out.println(suckler instanceof Object);   // true
System.out.println(cat instanceof Object); // true

2.3.2 isInstance 解析

如果对象是某个类或其子类的一个实例,则这个对象能被转化为这个类型。

System.out.println(Suckler.class.isInstance(suckler)); // true
System.out.println(Suckler.class.isInstance(cat));   // true

父类对象不能转化为子类型。

System.out.println(Cat.class.isInstance(suckler));   //false

null 不能转化为其他类型。

System.out.println(Suckler.class.isInstance(null));  //false
System.out.println(Cat.class.isInstance(null));  //false
System.out.println(Object.class.isInstance(null));  //false

非空对象都可以转化为 Object 类型。

System.out.println(Object.class.isInstance(suckler));  // true
System.out.println(Object.class.isInstance(cat));    // true

2.3.3 .class 和 .getClass() 解析

类名.class和对象.getClass()几乎没有区别,因为一个类被类加载器加载后,就是唯一的一个类。

System.out.println(suckler.getClass() == Suckler.class);  // true
System.out.println(suckler.getClass() == Cat.class);  // false
System.out.println(suckler.getClass().equals(Suckler.class));  // true
System.out.println(suckler.getClass().equals(Cat.class));  // false

System.out.println(cat.getClass() == Suckler.class);  // false
System.out.println(cat.getClass() == Cat.class);  // true
System.out.println(cat.getClass().equals(Suckler.class));  // false
System.out.println(cat.getClass().equals(Cat.class));  // true
0

评论区