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));
}
}