在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
的对象应该被用作A
types的对象,那么你不应该知道这个对象实际上是typesC
还是D
的对象! 否则,它意味着你对待C
和D
即使它们有一些共同的参数。
因此,尽可能地避免使用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"); } }
这是我的来源 。