在java中使用“实例”

什么是“instanceof”运算符用于?

我了解到Java有instanceof操作符。 你能详细说明它在哪里使用,它的优点是什么?

基本上,你检查一个对象是否是一个特定类的实例。 您通常使用它,当您有一个超类或接口types的对象的引用或参数,并需要知道实际的对象是否有其他types(通常更具体)。

例:

 public void doSomething(Number param) { if( param instanceof Double) { System.out.println("param is a Double"); } else if( param instanceof Integer) { System.out.println("param is an Integer"); } if( param instanceof Comparable) { //subclasses of Number like Double etc. implement Comparable //other subclasses might not -> you could pass Number instances that don't implement that interface System.out.println("param is comparable"); } } 

请注意,如果您必须经常使用该操作符,通常暗示您的devise存在一些缺陷。 所以在一个devise良好的应用程序中,您应该尽可能less地使用该操作符(当然,这个通用规则也有例外)。

instanceof用于检查对象是否是类的实例,子类的实例还是实现特定接口的类的实例。

在这里阅读更多的Oracle语言定义。

instanceof可以用来确定一个对象的实际types:

 class A { } class C extends A { } class D extends A { } public static void testInstance(){ A c = new C(); A d = new D(); Assert.assertTrue(c instanceof A && d instanceof A); Assert.assertTrue(c instanceof C && d instanceof D); Assert.assertFalse(c instanceof D); Assert.assertFalse(d instanceof C); } 

然而,使用instanceof的devise通常被认为是糟糕的devise。 在一个好的devise中,如果实际typesC的对象应该被用作Atypes的对象,那么你不应该知道这个对象实际上是typesC还是D的对象! 否则,它意味着你对待CD即使它们有一些共同的参数。

因此,尽可能地避免使用instanceof ,并使用适当的接口使用多态 。

instanceof是一个关键字,可以用来testing对象是否是指定的types。

例如:

 public class MainClass { public static void main(String[] a) { String s = "Hello"; int i = 0; String g; if (s instanceof java.lang.String) { // This is going to be printed System.out.println("s is a String"); } else if (i instanceof Integer) { // This is going to be printed as autoboxing will happen (int -> Integer) System.out.println("i is an Integer"); } else if (g instanceof java.lang.String) { // This case is not going to happen because g is not initialized and // therefore is null and instanceof returns false for null. System.out.println("g is a String"); } } 

这是我的来源 。