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类型;
【Java编程原理-3.操作符】截尾和舍入
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

    推荐阅读