📜  Java的instanceof及其应用

📅  最后修改于: 2020-03-24 05:07:35             🧑  作者: Mango

instanceof是一个关键字,用于检查引用变量是否包含给定类型的对象引用。
以下是一个Java程序,用于显示instanceof的不同行为。

// Java 用于显示instanceof的不同行为
class Parent {  }
class Child extends Parent { }
class Test
{
    public static void main(String[] args)
    {
        Child cobj = new Child();
        // 简单的例子
        if (cobj instanceof Child)
           System.out.println("cobj是Child的对象");
        else
           System.out.println("cobj不是Child的对象");
        // instanceof对父类也返回真
        if (cobj instanceof Parent)
           System.out.println("cobj是Parent的对象");
        else
           System.out.println("cobj不是Parent的对象");
        // instanceof 对所有祖先类返回true
        if (cobj instanceof Object)
           System.out.println("cobj是Object的对象");
        else
           System.out.println("cobj不是Object的对象");
    }
}

输出:

cobj是Child的对象
cobj是Parent的对象
cobj是Object的对象

instanceof为null返回false

// Java展示instanceof为null返回false
class Test {  }
class Main
{
    public static void main(String[] args)
    {
        Test tobj = null;
        // 一个简单的例子
        if (tobj instanceof Test)
           System.out.println("tobj是Test的对象");
        else
           System.out.println("tobj不是Test的对象");
    }
}

输出:

tobj不是Test的对象

父类对象不是子类的实例

// Java展示父类对象不是子类的实例
class Parent {  }
class Child extends Parent { }
class Test
{
    public static void main(String[] args)
    {
        Parent pobj = new Parent();
        if (pobj instanceof Child)
           System.out.println("pobj是Child的对象");
        else
           System.out.println("pobj不是Child的对象");
    }
}

输出:

pobj不是Child的对象

引用子类对象的父引用是子类的一个实例

// Java引用子类对象的父引用是子类的一个实例

class Parent {  }
class Child extends Parent { }
class Test
{
    public static void main(String[] args)
    {

        Parent cobj = new Child();
        if (cobj instanceof Child)
           System.out.println("cob是Child的实例");
        else
           System.out.println("cob不是Child的实例");
    }
}

输出:

cob是Child的实例

当父类型的引用,引用子对象时,将访问父类数据成员。我们可以使用类型转换访问子数据成员。
语法:

(((child_class_name)Parent_Reference_variable).func.name()

当我们进行类型转换时,检查类型转换是否有效总是一个好主意。instanceof在这里帮助了我们。我们总是可以首先使用instancef检查有效性,然后进行类型转换。

// Java使用instancef检查有效性,然后进行类型转换
class Parent
{
    int value = 1000;
}
class Child extends Parent
{
    int value = 10;
}
// 测试代码
class Test
{
    public static void main(String[] args)
    {
        Parent cobj = new Child();
        Parent par = cobj;
        // 使用instanceof,在类型转换之前检查par的有效性
        if (par instanceof Child)
        {
            System.out.println("数据从 " +
                "父类引用被访问 " +
                                     ((Child)par).value);
        }
    }
}

输出:

数据从 父类引用被访问 10