zoukankan      html  css  js  c++  java
  • instanceof 和isInstance

    Java中的instanceof关键字

    instanceof是Java的一个二元操作符,和==,>,<是同一类东东。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。

    用法: 
    result = object instanceof class 
    参数: 
    Result:布尔类型。 
    Object:必选项。任意对象表达式。 
    Class:必选项。任意已定义的对象类。 
    说明: 
    如果 object 是 class 的一个实例,则 instanceof 运算符返回 true。如果 object 不是指定类的一个实例,或者 object 是 null,则返回 false。

    但是instanceof在Java的编译状态和运行状态是有区别的:

    在编译状态中,class可以是object对象的父类,自身类,子类。在这三种情况下Java编译时不会报错。

    在运行转态中,class可以是object对象的父类,自身类,不能是子类。在前两种情况下result的结果为true,最后一种为false。

    但是class为子类时编译不会报错。运行结果为false。

    举个例子:

     String s = "I AM an Object!";
     boolean isObject = s instanceof Object; 

      我们声明了一个String对象引用,指向一个String对象,然后用instancof来测试它所指向的对象是否是Object类的一个实例,显然,这是真的,所以返回true,也就是isObject的值为True。
      instanceof有一些用处。比如我们写了一个处理账单的系统,其中有这样三个类:

       public class Bill {//省略细节}
      public class PhoneBill extends Bill {//省略细节}
      public class GasBill extends Bill {//省略细节}

      
      在处理程序里有一个方法,接受一个Bill类型的对象,计算金额。假设两种账单计算方法不同,而传入的Bill对象可能是两种中的任何一种,所以要用instanceof来判断:

     public double calculate(Bill bill) {
      if (bill instanceof PhoneBill) {
      //计算电话账单
      }
      if (bill instanceof GasBill) {
      //计算燃气账单
      }
      ...
      }

      这样就可以用一个方法处理两种子类。
      然而,这种做法通常被认为是没有好好利用面向对象中的多态性。其实上面的功能要求用方法重载完全可以实现,这是面向对象变成应有的做法,避免回到结构化编程模式。只要提供两个名字和返回值都相同,接受参数类型不同的方法就可以了: 

     public double calculate(PhoneBill bill) {
      //计算电话账单
      }
    
      public double calculate(GasBill bill) {
      //计算燃气账单
      }

      所以,使用instanceof在绝大多数情况下并不是推荐的做法,应当好好利用多态。

    java.lang.Class.isInstance()方法实例

    java.lang.Class.isInstance() 确定指定的对象赋值兼容此Class所表示的对象。它与Java语言instanceof运算符的动态等效。

    声明

    以下是java.lang.Class.isInstance()方法的声明

    public boolean isInstance(Object obj)

    参数

    • obj -- 这是要检查对象。

    返回值

    如果obj是这个类的一个实例此方法返回true。

    异常

    • NA

    例子

    下面的例子显示java.lang.Class.isInstance()方法的使用。

    package com.yiibai;
    
    import java.lang.*;
    
    public class ClassDemo {
    
       public static void main(String[] args) {
    
         // Long object represented by class object
         Class cls = Long.class;
            
         Long l = new Long(86576);
         Double d = new Double(3.5);
           
         // checking for Long instance
         boolean retval = cls.isInstance(l);
         System.out.println(l + " is Long ? " + retval);
    
         // checking for Long instance
         retval = cls.isInstance(d);
         System.out.println(d + " is Long ? " + retval);        
       }
    } 
  • 相关阅读:
    Composer autoload 自动加载
    权限问题
    加载适配器和布局之间的顺序关系--Unsolved
    listview和button
    线程练习中出现的错误
    线程02
    关于初始化成员变量
    可扩展列表
    Android开发中Handler的经典总结----转载
    线程01
  • 原文地址:https://www.cnblogs.com/lukelook/p/11300882.html
Copyright © 2011-2022 走看看