• Java 运算符


    位运算符

    Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。

    位运算符作用在所有的位上,并且按位运算。假设a = 60,b = 13;它们的二进制格式表示将如下:

    A = 0011 1100
    B = 0000 1101
    -----------------
    A&b = 0000 1100
    A | B = 0011 1101
    A ^ B = 0011 0001
    ~A= 1100 0011

    下表列出了位运算符的基本运算,假设整数变量A的值为60和变量B的值为13:

    操作符描述例子
    如果相对应位都是1,则结果为1,否则为0 (A&B),得到12,即0000 1100
    | 如果相对应位都是0,则结果为0,否则为1 (A | B)得到61,即 0011 1101
    ^ 如果相对应位值相同,则结果为0,否则为1 (A ^ B)得到49,即 0011 0001
    按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 (〜A)得到-61,即1100 0011
    <<  按位左移运算符。左操作数按位左移右操作数指定的位数。 A << 2得到240,即 1111 0000
    >>  按位右移运算符。左操作数按位右移右操作数指定的位数。 A >> 2得到15即 1111
    >>>  按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 A>>>2得到15即0000 1111

    实例

    public class Test {
      public static void main(String[] args) {
         int a = 60; /* 60 = 0011 1100 */ 
         int b = 13; /* 13 = 0000 1101 */
         int c = 0;
         c = a & b;       /* 12 = 0000 1100 */
         System.out.println("a & b = " + c );
     
         c = a | b;       /* 61 = 0011 1101 */
         System.out.println("a | b = " + c );
     
         c = a ^ b;       /* 49 = 0011 0001 */
         System.out.println("a ^ b = " + c );
     
         c = ~a;          /*-61 = 1100 0011 */
         System.out.println("~a = " + c );
     
         c = a << 2;     /* 240 = 1111 0000 */
         System.out.println("a << 2 = " + c );
     
         c = a >> 2;     /* 15 = 1111 */
         System.out.println("a >> 2  = " + c );
      
         c = a >>> 2;     /* 15 = 0000 1111 */
         System.out.println("a >>> 2 = " + c );
      }
    } 

    以上实例编译运行结果如下:

    a & b = 12
    a | b = 61
    a ^ b = 49
    ~a = -61
    a << 2 = 240
    a >> 2  = 15
    a >>> 2 = 15

    instanceof 运算符

    该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型)。

    instanceof运算符使用格式如下:

    ( Object reference variable ) instanceof  (class/interface type)

    如果运算符左侧变量所指的对象,是操作符右侧类或接口(class/interface)的一个对象,那么结果为真。

    下面是一个例子:

    String name = "James";
    boolean result = name instanceof String; // 由于 name 是 String 类型,所以返回真

    如果被比较的对象兼容于右侧类型,该运算符仍然返回true。

    看下面的例子:

    class Vehicle {}
     
    public class Car extends Vehicle {
       public static void main(String[] args){
          Vehicle a = new Car();
          boolean result =  a instanceof Car;
          System.out.println( result);
       }
    }

    以上实例编译运行结果如下:

    true

    实例类型
    1、在判断一个实例引用的类型时,使用的是实际类型,而不是声明的类型。在下面的代码中,
    Vehicle v2 = new Car();    // v2 是 Car 类型
    
    

    v2 是 Car 类型,而不是 Vehicle 类型。

    
    
    class Vehicle {}
    
    public class Car extends Vehicle {
        public static void main(String args[]){
            Car c1 = new Car();
    
            Vehicle v2 = new Car();    // v2 是 Car 类型
            Vehicle v3 = new Vehicle();
    
            //Car 是 Vehicle类型, Vehicle 不是 Car 类型
            boolean result1 =  c1 instanceof Vehicle;    // true
            boolean result2 =  v2 instanceof Car;        // true
            boolean result3 =  v2 instanceof Vehicle;    // true
            boolean result4 =  v3 instanceof Car;          // false
    
            System.out.println(result1);
            System.out.println(result2);
            System.out.println(result3);
            System.out.println(result4);
       }
    }
    
    

    2、子类是父类的类型,但父类不是子类的类型。

    子类的实例可以声明为父类型,但父类的实例不能声明为子类型。

    
    
    class Vehicle {}
    
    public class Car extends Vehicle {
        public static void main(String args[]){
            Vehicle v1 = new Vehicle(); //父类型
            Vehicle v2 = new Car(); //子类的实例可以声明为父类型
            Car c1 = new Car();    // 子类型
            Car c2 = new Vehicle(); //这句会报错,父类型的实例不能声明为子类型
    
            //Car(子类)是Vehicle(父类)类型, Vehicle(父类)不是Car(子类)类型
            boolean result1 =  c1 instanceof Vehicle;    // true
            boolean result2 =  c1 instanceof Car;        // true
            boolean result3 =  v1 instanceof Vehicle;    // true
            boolean result4 =  v1 instanceof Car;          // false
            boolean result5 =  v2 instanceof Vehicle;    // true
            boolean result6 =  v2 instanceof Car;          // true
    
            System.out.println(result1);
            System.out.println(result2);
            System.out.println(result3);
            System.out.println(result4);
            System.out.println(result5);
            System.out.println(result6);
       }
    }
    
    

    从执行结果来看,虽然 v2 被声明为了 Vehicle(父类),但它既是 instanceof Vehicle,又是 instanceof Car,所以 v2 其实是 Car(子类),否则 v2 instanceof Car 应该为 false。

     
  • 相关阅读:
    rabbitmq线上服务器与项目结合的问题总结
    关于RabbitMQ Queue Argument的简介
    rabbitmq代码配置
    python基础篇17-虚环境
    Java-实体与集合转换
    Java-精确计算工具类
    Java-汉字繁体拼音转换
    Java-集合条件筛选
    Java-发邮件
    Java-MD5
  • 原文地址:https://www.cnblogs.com/gopark/p/9500739.html
Copyright © 2020-2023  润新知