Java ´的示例;实例f´;

Java ´的示例;实例f´;,java,instanceof,Java,Instanceof,在上面的示例中,t1和t2是true。那么,我如何使用实例区分TableModel1和TableModel2?好吧,我不相信你能做到。从继承的角度来看,tableModel对于这两种类型都是完全有效的引用,因此instanceof在这两种情况下都将返回true。您不能。如果您确实需要区分这两种类型,请改用tableModel.getClass(),如下所示: public class TableModel2 extends TableModel1 { ... } TableModel2 tab

在上面的示例中,
t1
t2
true
。那么,我如何使用
实例区分
TableModel1
TableModel2

好吧,我不相信你能做到。从继承的角度来看,
tableModel
对于这两种类型都是完全有效的引用,因此
instanceof
在这两种情况下都将返回true。

您不能。如果您确实需要区分这两种类型,请改用
tableModel.getClass()
,如下所示:

public class TableModel2 extends TableModel1 { ... }

TableModel2 tableModel = new TableModel2();

boolean t1 = tableModel instanceof TableModel1;
boolean t2 = tableModel instanceof TableModel2;
请注意,尽管您故意试图打破OOP的基本原则之一,但在实际代码中使用它之前,请确保无法避免此技巧

那么,如何使用instanceof区分TableModel1和TableModel2呢

从技术上讲,您可以检查
tableModel
是否为
TableModel1
的实例,以及是否为
TableModel2
的实例:

boolean t1 = tableModel.getClass() == TableModel1.class;
boolean t2 = tableModel.getClass() == TableModel2.class;

但是,我希望尽可能强烈地鼓励您避免任何基于
instanceof
getClass()
的结果分支的代码。面对未来的变化,这样的代码非常脆弱。如果您发现自己正在按照这些思路做任何事情,这就很有可能是重新审视您的设计的好时机。

您不能使用
instanceof
,但可以使用
getClass
来完成:

(tableModel instanceof TableModel1) && !(tableModel instanceof TableModel2)
instanceof
操作符用于检查类层次结构,直至
java.lang.Object
,包括检查所有接口。它让您知道您拥有的对象的实例是否可以转换为您指定的类型,而不会触发类转换异常


另一方面,
getClass
返回给定对象的特定类。

的实例表示“是一个”

易于使用的类名:

boolean t2 = tableModel.getClass().equals(TableModel1.class); //False
boolean t2 = tableModel.getClass().equals(TableModel2.class); //True

公共类TableModel2扩展了TableModel1{…},因此“instanceOf”在此不起作用TableModel1和TableModel2它们都是TableModel1。所以,给出一个真实的例子。但是tableModel1不是TableModel2。如果添加
TableModel3
,会发生什么
TableModel25
?执行此操作之前,为tableModel添加了提供的空检查,其中as instanceof不需要它。
TableModel2 IS A TableModel1.
But TableModel1 IS NOT A TableModel2.
so

package main;

public class TempClass {
    public static void main(String[] args) {
        TableModel1 tableModel1 = new TableModel1();
        TableModel1 tableModel2 = new TableModel2();

        System.out.println(tableModel1 instanceof TableModel1);
        System.out.println(tableModel1 instanceof TableModel2);

        System.out.println(tableModel2 instanceof TableModel1);
        System.out.println(tableModel2 instanceof TableModel2);
    }

    public static class TableModel1 {
    }

    public static class TableModel2 extends TableModel1 {
    }
}

true
false

true
true
boolean t2 = tableModel.getClass().equals(TableModel1.class); //False
boolean t2 = tableModel.getClass().equals(TableModel2.class); //True
public class Test
{
    public class TableModel1
    {
    };

    public class TableModel2 extends TableModel1
    {
    };

    public TableModel2 tableModel = new TableModel2();

    public static void main(String[] args)
    {
        Test t = new Test();
        System.out.println("t1=" + t.tableModel.getClass().equals(TableModel1.class));
        System.out.println("t2=" + t.tableModel.getClass().equals(TableModel2.class));
    }
}