Использование "Экземпляра" в Java
Я узнал, что Java имеет instanceof
оператор. Можете ли вы уточнить, где он используется и каковы его преимущества?
4 ответа
По сути, вы проверяете, является ли объект экземпляром определенного класса. Вы обычно используете его, когда у вас есть ссылка или параметр на объект, который имеет суперкласс или тип интерфейса, и вам нужно знать, имеет ли реальный объект какой-либо другой тип (обычно более конкретный).
Пример:
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");
}
}
Обратите внимание, что если вам приходится использовать этот оператор очень часто, это, как правило, намек на то, что ваш дизайн имеет некоторые недостатки. Так что в хорошо разработанном приложении вы должны использовать этот оператор как можно меньше (конечно, есть исключения из этого общего правила).
instanceof
используется для проверки того, является ли объект экземпляром класса, экземпляром подкласса или экземпляром класса, который реализует определенный интерфейс.
instanceof
может использоваться для определения фактического типа объекта:
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 - это ключевое слово, которое можно использовать для проверки, относится ли объект к указанному типу.
Пример:
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");
}
if (i instanceof Integer) {
// This is going to be printed as autoboxing will happen (int -> Integer)
System.out.println("i is an Integer");
}
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");
}
}
Вот мой источник.