Java中使用的“instanceof”运算符是什么?
什么是instanceof
操作符用于? 我见过类似的东西
if (source instanceof Button) { //... } else { //... }
但是没有一个对我有意义。 我已经完成了我的研究,但只是用没有任何解释的例子。
instanceof
关键字是一个二元运算符,用于测试对象 (实例)是否为给定类型的子类型。
想像:
interface Domestic {} class Animal {} class Dog extends Animal implements Domestic {} class Cat extends Animal implements Domestic {}
设想一个用Object dog = new Dog()
创建的dog
对象 ,那么:
dog instanceof Domestic // true - Dog implements Domestic dog instanceof Animal // true - Dog extends Animal dog instanceof Dog // true - Dog is Dog dog instanceof Object // true - Object is the parent type of all objects
但是, Object animal = new Animal();
,
animal instanceof Dog // false
因为Animal
是Dog
的超类型,可能不那么“精致”。
和,
dog instanceof Cat // does not even compile!
这是因为Dog
既不是Cat
的亚型也不是超类型,也没有实现它。
注意上面用于dog
的变量是Object
类型的。 这是为了显示instanceof
是一个运行时操作,并将我们带入一个用例: 在运行时基于对象类型做出不同的反应 。
注意事项:对于所有类型T
expressionThatIsNull instanceof T
是false。
快乐的编码。
这是一个运算符,如果表达式的左边是右边类名的实例,则返回true。
想想这样。 说你街区的所有房屋都是用同样的蓝图建造的。 十屋(物),一套蓝图(班级定义)。
instanceof
是一个有用的工具,当你有一个对象的集合,你不知道他们是什么。 假设你有一个表单上的控件集合。 你想读取任何复选框的选中状态,但是你不能要求一个普通的旧对象的检查状态。 相反,您会看到每个对象是否为复选框,如果是,则将其转换为复选框并检查其属性。
if (obj instanceof Checkbox) { Checkbox cb = (Checkbox)obj; boolean state = cb.getState(); }
正如本网站所述 :
instanceof
运算符可用于测试对象是否是特定类型的…if (objectReference instanceof type)
一个简单的例子:
String s = "Hello World!" return s instanceof String; //result --> true
但是,在空引用变量/表达式上应用
instanceof
将返回false。String s = null; return s instanceof String; //result --> false
由于子类是其超类的“类型”,因此您可以使用
instanceof
来验证此…class Parent { public Parent() {} } class Child extends Parent { public Child() { super(); } } public class Main { public static void main(String[] args) { Child child = new Child(); return child instanceof Parent; } } //result --> true
我希望这有帮助!
这个操作符允许你确定一个对象的类型。 它返回一个boolean
值。
例如
package test; import java.util.Date; import java.util.Map; import java.util.HashMap; public class instanceoftest { public static void main(String args[]) { Map m=new HashMap(); System.out.println("Returns a boolean value "+(m instanceof Map)); System.out.println("Returns a boolean value "+(m instanceof HashMap)); System.out.println("Returns a boolean value "+(m instanceof Object)); System.out.println("Returns a boolean value "+(m instanceof Date)); } }
输出是:
Returns a boolean value true Returns a boolean value true Returns a boolean value true Returns a boolean value false
如果source
是一个object
变量, instanceof
是一种检查是否是Button
。
正如其他答案中所提到的, instanceof
典型用法是检查标识符是否指向更具体的类型。 例:
Object someobject = ... some code which gets something that might be a button ... if (someobject instanceof Button) { // then if someobject is in fact a button this block gets executed } else { // otherwise execute this block }
但请注意,左侧表达式的类型必须是右侧表达式的父类型 (请参阅JLS 15.20.2和Java Puzzlers,#50,pp114 )。 例如,以下内容将无法编译:
public class Test { public static void main(String [] args) { System.out.println(new Test() instanceof String); // will fail to compile } }
这不能编译消息:
Test.java:6: error: inconvertible types System.out.println(t instanceof String); ^ required: String found: Test 1 error
由于Test
不是String
的父类。 OTOH,这个编译完美,并按预期打印false
:
public class Test { public static void main(String [] args) { Object t = new Test(); // compiles fine since Object is a parent class to String System.out.println(t instanceof String); } }
public class Animal{ float age; } public class Lion extends Animal { int claws;} public class Jungle { public static void main(String args[]) { Animal animal = new Animal(); Animal animal2 = new Lion(); Lion lion = new Lion(); Animal animal3 = new Animal(); Lion lion2 = new Animal(); //won't compile (can't reference super class object with sub class reference variable) if(animal instanceof Lion) //false if(animal2 instanceof Lion) //true if(lion insanceof Lion) //true if(animal3 instanceof Animal) //true } }
可以用作平等检查的简写。
所以这个代码
if(ob != null && this.getClass() == ob.getClass) { }
可以写成
if(ob instanceOf ClassA) { }
该运算符仅用于对象引用变量。 运算符检查对象是否是特定类型(类类型或接口类型)。 instanceof
运算符写成:
( Object reference variable ) instanceof (class/interface type)
如果操作符左侧的变量引用的对象通过右侧的类/接口类型的“IS-A”检查,则结果为真。
instanceof运算符将对象与指定的类型进行比较。 您可以使用它来测试对象是否是类的实例,子类的实例或实现特定接口的类的实例。
http://download.oracle.com/javase/tutorial/java/nutsandbolts/op2.html
当你想知道特定对象的实例时,关键字实例是有帮助的。
假设你是抛出异常,当你有catch,然后执行sum自定义操作,然后再按照你的逻辑继续(抛出或日志等)
例如:1)用户创建自定义异常“InvalidExtensionsException”,并按逻辑进行抛出
2)现在在catch catch catch(Exception e){如果异常类型是“InvalidExtensionsException”
InvalidExtensionsException InvalidException =(InvalidExtensionsException)e;
3)如果你没有检查实例,并且异常类型是空指针异常,你的代码将会中断。
所以你的逻辑应该在if(e instanceof InvalidExtensionsException)的实例里面{InvalidExtensionsException InvalidException =(InvalidExtensionsException)e; }
上面的例子是错误的编码实践然而这个例子是帮助你了解它的实例的使用。
非常简单的代码示例:
If (object1 instanceof Class1) { // do something } else if (object1 instanceof Class2) { // do something different }
在这里小心点。 在上面的例子中,如果Class1是Object,那么第一个比较将始终为真。 所以,就像例外情况一样,等级顺序很重要!
你可以使用Map来对实例进行更高的抽象
private final Map<Class, Consumer<String>> actions = new HashMap<>();
然后有这样的地图添加一些行动:
actions.put(String.class, new Consumer<String>() { @Override public void accept(String s) { System.out.println("action for String"); } };
然后有一个不知道类型的对象,你可以从该地图得到具体的操作:
actions.get(someObject).accept(someObject)
instanceof运算符用于检查对象是否是指定类型的实例。 (类或子类或接口)。
instanceof也称为类型比较运算符,因为它将实例与类型进行比较。 它返回true或false。
class Simple1 { public static void main(String args[]) { Simple1 s=new Simple1(); System.out.println(s instanceof Simple1); //true } }
如果我们将instanceof运算符应用于任何具有空值的变量,则返回false。