instanceof: 왼쪽 객체가 오른쪽 클래스의 인스턴스인지 여부를 결정하는 Java 의 이진 연산자 입니다. 그렇다면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
예시 1:
String s = "I AM an Object!";
boolean isObject = s instanceof Object;
예: String 객체를 가리키는 String 객체 참조를 선언한 다음, 그것이 가리키는 객체가 Object 클래스의 인스턴스인지 테스트하기 위해 instanceof를 사용합니다. 분명히 이는 사실이므로 true를 반환합니다. isObject의 값이 true입니다.
예 2:
instanceof에는 몇 가지 용도가 있습니다.
예를 들어, 우리는 세 가지 클래스가 있는 청구서 처리 시스템을 작성했습니다.
public class Bill {
//省略细节}
public class PhoneBill extends Bill {
//省略细节}
public class GasBill extends Bill {
//省略细节}
Bill 유형의 개체를 받아들이고 금액을 계산하는 메서드가 핸들러에 있습니다.
두 가지 청구서 계산 방법이 다르고 수신 Bill 개체가 둘 중 하나일 수 있으므로 판단하는 데 인스턴스of가 사용된다고 가정합니다.
public double calculate(Bill bill) {
if (bill instanceof PhoneBill) {
//计算电话账单
}
if (bill instanceof GasBill) {
//计算燃气账单
}
...
}
이렇게 하면 하나의 메서드를 사용하여 두 하위 클래스를 모두 처리할 수 있습니다.
그러나 이러한 접근 방식은 종종 객체 지향 다형성을 활용하지 못한 것으로 간주됩니다.
실제로 위의 기능적 요구 사항은 메소드 오버로딩을 사용하여 완전히 실현될 수 있는데, 이는 구조적 프로그래밍 모드로 돌아가는 것을 피하기 위해 객체 지향 프로그래밍을 수행해야 하는 방식입니다.
이름과 반환 값은 같지만 매개변수 유형이 다른 두 가지 메서드를 제공하세요.
public double calculate(PhoneBill bill) {
//计算电话账单
}
public double calculate(GasBill bill) {
//计算燃气账单
}
따라서 대부분의 경우에 인스턴스 오브를 사용하는 것은 권장되지 않으며 다형성을 잘 활용해야 합니다.
instanceof는 일반적으로 객체 유형을 강제하는 데 사용됩니다.
예를 들면 다음과 같습니다.
//继承关系
class Manager extends Employee {
}
public void doSomething(Employee e) {
if ( e instanceof Manger){
Manager m = (Manager) e ;
}
}
예 3:
//判断里面的意思是:context对象是否来自actvity。
if (context instanceof Activity) {
Log.i(LOGTAG, "Callback Activity...");
Activity callbackActivity = (Activity) context;
callbackActivityPackageName = callbackActivity.getPackageName();
callbackActivityClassName = callbackActivity.getClass().getName();
}
Android의 컨텍스트는 애플리케이션 과 서비스를 나타낼 수도 있습니다 .