Java编程原理-3.操作符

操作符

关系操作符

class Tank{
    int level;
}
public class Assignment {
    public static void main(String[] args){
        Tank t1 = new Tank();
        Tank t2 = new Tank();
        t1.level = 9;
        t2.level = 47;
        System.out.println ("1: t1.level:" + t1.level + ", t2.level:" + t2.level);
        t1 = t2;
        System.out.println ("1: t1.level:" + t1.level + ", t2.level:" + t2.level);
        t1.level = 27;
        System.out.println ("1: t1.level:" + t1.level + ", t2.level:" + t2.level);

    }
//out:  t1.level: 9, t2.level: 47
//      t1.level: 47, t2.level: 47
//      t1.level: 27, t2.level: 27

赋值操作是对象的应用,所以改变t1时也改变了t2

class Letter{
    char c;
}
public class Assignment {
    static void f(Letter y){
        y.c = 'z';
    }
    public static void main(String[] args){
        Letter x = new Letter();
        x.c = 'a';
        System.out.println("1: x.c: " + x.c);
        f(x);
        System.out.println("2: x.c: " + x.c);

    }
}

//out:  1: x.c: a
//      2: x.c: z
public class Assignment {
    public static void main(String[] args){
        Integer n1 = new Integer(47);
        Integer n2 = new Integer(47);
        System.out.println(n1 == n2);
        System.out.println( n1 != n2);
        System.out.println(n1.equals(n2));
    }
}
// out: false true true

因为两个Integer对象都是相同的,尽管对象内容相同但对象引用却不同,而==!=比较的是对象的引用. equals()的默认行为是比较引用。

class Value{
    int i;
}
public class Assignment {
    public static void main(String[] args){
        Value v1 = new Value();
        Value v2 = new Value();
        v1.i = v2.i = 100;
        System.out.println(v1.equals(v2));
    }
}
// out: false

按位操作符和移位操作符

按位操作符和移位操作符全部按二进位位进行计算


符号 名称 用法 运算规则
& 按位与运算符 同为1时值为1,负数按补码形式参与 0&0=0; 0&1=0; 1&0=0; 1&1=1
| 按位或运算符 只要有一个为1,其值为1,负数按补码形式参与 0|0=0; 0|1=1; 1|0=1; 1|1=1
^ 异或运算符 相应位为异时值为1 0^0=0; 0^1=1; 1^0=1; 1^1=0
~ 取反运算符 按位取反 ~1=0; ~0=1
>> 右移运算符 全部右移若干位,正数左补0,负数左补1,右边丢弃 每右移一位,相当于该数除以2
<< 左移运算符 全部左移若干位,右边补0,左边丢弃 每左移一位,相当于该数乘以2
>>> 无符号右移运算符 全部右移若干位,左边补0,右边丢弃 -



复合赋值运算符
位运算符和赋值运算符可以结合有如下运算符:
&=; |=; >>=; <<=; ^=

a &= b相当于a=a & b, 其他复合赋值运算符类似

不同长度的数据进行位运算
如果两个不同长度的数据进行位运算时,系统会将二者按右端对齐,然后进行位运算(long型数据与int型数据进行与运算)。右端对齐后,左边不足的位依下面三种情况补足:

  1. 如果整型数据为正数,左边补16个0。
  1. 如果整型数据为负数,左边补16个1。
  1. 如果整形数据为无符号数,左边也补16个0

三元操作符if-else

三元操作符也成为条件操作符,有三个操作数,和普通的if-else不同的是表达式如下:

boolean-exp ? value) : value1

如果boolean-exp(布尔表达式)的结果为true,就计算value0, 如果为false,就计算value1.
单元操作符景观高效率简介,但他很容易产生可读性很差的代码。他和if-else完全不同,因为它会产生一个值

类型转换操作符

Java中可以从任意基本数据类型转型到外的基本数据类型,boolean类型不可以转换为其他的数据类型.
整型,字符型,浮点型的数据在混合运算中相互转换,转换时遵循以下原则:

  1. 容量小的类型默认转换为容量大的数据类型;数据类型按容量大小排序为:
      byte,short,char,->int->long->float->double;
      byte,short,char之间不会相互转换他们三者在计算时首先会转换为int类型;
  2. 容量大的数据类型转换为容量小的数据类型时,要叫上强制转换符,
    但是可能造成精度降低或溢出(double转换成float时会溢出),使用时要格外注意;
  3. 有多种类型的数据混合运算时,系统会首先自动的将所有数据转换成容量最大的那一种数据类型,然后再进行计算;
  4. 实数常量,浮点型默认为double类型.整数常量默认为int类型;

截尾和舍入
float和double 转为整形时,总是对该数字进行截尾,如果想得到摄入的结果,需要用到java.land.Math中的roung()

public class Assignment {
    public static void main(String[] args){
        double above = 0.7, below = 0.4;
        float fabove = 0.7f, fbelow = 0.4f;
        System.out.println("(int)above: "+ (int)above);
        System.out.println("(int)below: "+ (int)below);
        System.out.println("(int)fabove: "+ (int)fabove);
        System.out.println("(int)fabove: "+ (int)fabove);
        System.out.println("Math.round(above): "+ Math.round(above));
        System.out.println("Math.round(below): "+ Math.round(below));
        System.out.println("Math.round(fabove): "+ Math.round(fabove));
        System.out.println("Math.round(fbelow): "+ Math.round(fbelow));
    }
}
//out:  (int)above: 0; (int)below: 0; (int)fabove: 0; (int)fabove: 0
//      Math.round(above): 1;  Math.round(below): 0;  
//      Math.round(fabove): 1; Math.round(fbelow): 0

你可能感兴趣的:(Java编程原理-3.操作符)