java编程思想--03操作符



几乎所有运算符都只能操作“主类型”(Primitives)。例外是“=”、“= =”和“! =”,它们能操作所有对象。除此以外,String类支持“+”和“+=”。
注:所谓“主类型”,即基本类型:boolean、char<16bits>、byte<8bits>、short<16bits>、int<32bits>、long<64bits>、float<32bits>、double<64bits>、void。

一、赋值
主类型使用“A=B”,那么B处的内容就复制到A。若修改A,那么B根本不会受修改的影响。
对象“赋值”的时候情况发生了变化。对一个对象进行操作时,我们真正操作的是它的句柄。所以倘若“从一个对象到另一个对象”赋值,实际就是将句柄从一个地方复制到另一个地方。这意味着假若为对象使用“C=D”,那么C和D最终都会指向最初只有D才指向的那个对象。
short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型)
short s1 = 1; s1 += 1;(可以正确编译) +=运算符无类型转换问题

二、算术运算符
Java的算术运算符:加号(+)、减号(-)、除号(/)、乘号(*)以及模数(%,从整数除法中获得余数)。整数除法会直接砍掉小数,而不是进位。

三、自动递增、递减
对于前递增和前递减(如++A或--A),会先执行运算,再生成值。
对于后递增和后递减(如A++或A--),会先生成值,再执行运算。

四、关系运算符
关系运算符包括<、>、<=、>=、= =、!=。
等于和不等于适用于所有内建的数据类型,但其他比较不适用于boolean类型。想对比两个对象的实际内容是否相同,必须使用所有对象都适用的特殊方法equals()。equals()方法不适用于“主类型”,那些类型直接使用= =和!=即可。equals()的默认是比较句柄。所以除非在自己的新类中改变了equals(),否则不可能表现出我们希望的行为大多数Java类库都实现了equals(),所以它实际比较的是对象的内容,而非它们的句柄= =和! =比较的是对象句柄,而不是对象的实际内容。

五、逻辑运算符
逻辑运算符&&、||、!能生成一个布尔值。
&和&&都可作为逻辑运算符“与”使用,但是&&是“短路与”,运算时先判断符号前面的表达式的值,如果能够确定整个表达式的值,则不进行符号后面的表达式的运算。另外,&可作为位运算符使用。

六、按位运算符
按位AND运算符(&)
按位OR运算符(|)
按位XOR(^,异或)
按位NOT(~,也叫作“非”运算符)属于一元运算符,生成与输入位的相反的值

七、移位运算符
左移位运算符(<<)能将运算对象向左移动运算符右侧指定的位数(在低位补0)。
有符号右移位运算符(>>)将运算对象向右移动运算符右侧指定的位数。有符号右移位运算符使用了符号扩展:若值为正,则在高位插入0;若值为负,则在高位插入1
无符号右移位运算符(>>>),它使用了“零扩展”:无论正负,都在高位插入0

八、三元IF-ELSE运算符
布尔表达式 ? 值0:值1   “布尔表达式”的结果为true,就计算“值0”,否则计算“值1”

九、字符串运算符+和+=
int x = 0, y = 1, z = 2;
System.out.println(“out:” + x + y + z);
在这里,Java编译程序会将x,y和z转换成它们的字串形式,而不是先把它们加到一起。
运用“String +”时,若表达式以一个String起头,那么后续所有运算对象都会转换到字串。
想通过“加号”连接字串(使用Java的早期版本),请务必保证第一个元素是字串。

十、造型(Cast)运算符
对于“缩小转换”(Narrowing Conversion)的操作(能容纳更多信息的数据类型,将其转换成容量较小的类型,例如int转short),此时就可能面临信息丢失的危险。此时,编译器会强迫我们进行明确造型。
对于“放大转换”(Widening conversion),则不必进行明确造型,因为新类型肯定能容纳原来类型的信息,不会造成任何信息的丢失。
布尔值(bollean)根本不允许进行任何造型处理,其它任何主类型可互相造型。
将float或double值造型成整数值后,总是将小数部分“砍掉”,不作任何进位处理。

Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math.round(11.5)==12      Math.round(-11.5)==-11
round方法返回与参数最接近的长整数,参数加1/2后求其floor,故(-11.5)+0.5=11。

十一、Java操作符的优先级和结合性

 优先级  操作符  结合性
 1  [ ] . ( ) (函数呼叫)  从左到右
 2  ! ~ ++ -- +(单操作数) –(单操作数) ( ) (类型转化) new  从右到左
 3  * / % 从左到右
 4  + -  从左到右
 5  <<   >>   >>>  从左到右
 6  <<=  >>= instance of  从左到右
 7  == !=  从左到右
 8  &  从左到右
 9  ^  从左到右
 10  |  从左到右
 11  &&  从左到右
 12  ||  从左到右
 13  ?   :  从右到左
 14  = += -= *= /= %= ^= <<= >>= >>>=  从右到左

运算符分类  听语音
运算符指明对操作数的运算方式。组成表达式的Java操作符有很多种。运算符按照其要求的操作数数目来分,可以有单目运算符、双目运算符和三目运算符,它们分别对应于1个、2个、3个操作数。运算符按其功能来分,有算术运算符、赋值运算符、关系运算符、逻辑运算符、位运算符和其他运算符。
算术
单目:+(取正)-(取负) ++(自增) - -(自减)
双目:+ - * / %(取余)
三目:a>b?true:false 说明:当a大于b的时候,为true(也就是冒号之前的值),否则为false;这整个运算符包括一个关系运算符(可以是“>”"<""!="等等),一个“?”,一个“:”,冒号前后需要有两个表达式或者是值或者是对象。
关系
等于符号:==,不等于符号:!= ,大于符号:>, 小于符号:<,大于等于符号:>= ,小于等于符号:<= 。
位与逻辑
位运算符 与(&)、非(~)、或(|)、异或(^)
&:双目运算符,运算时均把运算数转换为二进制再做比较,规则:当相同的位上均为1时结果为1,否则结 果为0.如:1010&1101,转为二进制:10001001101&1111110010比较结果为:1000000转为十进制: 64所以1010&1101=64;
| :当两边操作数的位有一边为1时,结果为1,否则为0。如1100|1010=1110
~:0变1,1变0
^:两边的位不同时,结果为1,否则为0.如1100^1010=0110
逻辑运算符
与(&&)、非(!)、或(||)
赋值
= += -= *= /= %= &= ^= |= <<= >>=
instanceof
该运算符是双目运算符,左面的操作元是一个对象,右面是一个类或接口。当左面的对象是右面的类(或右边类的子孙类)创建的对象、或者是右边接口的实现类(或实现类的子孙类)的对象时,该运算符运算结果是true,否则是false。
运算符综述
Java 的表达式就是用运算符连接起来的符合Java 规则的式子.运算符的优先级决定了表达式中运算执行的先后顺序.例如,x<y&&!z相当于(x<y)&&(!z),没有必要去记忆运算符号的优先级别,在编写程序时可尽量的使用括号来实现你想要的运算次序,以免产生难以阅读或含糊不清的计算顺序.运算符的结合性决定了并列相同级别的运算符的先后顺序,例如,加减的结合性是从左到右,8-5+3 相当于(8-5)+3.逻辑否运算符 的结合性是右到左, x 相当于!(!x).表3.4是Java所有运算符的优先级和结合性。
位移
<< 带符号左移 >>带符号右移 >>> 无号右移
运算符优先级
按优先级从高到低排列如下:[ ] ( ) ++ -- ! ~ instanceof * / % + - << >> >>> <> < = > \ == != &^& & || ? := op= 。
类型转换  听语音
强制和转换
Java语言和解释器限制使用强制和转换,以防止出错导致系统崩溃。整数和浮点数运算符间可以来回强制转换,但整数不能强制转换成数组或对象。对象不能被强制为基本类型。
Java中整数运算符在整数运算时,如果操作数是long类型,则运算结果是long类型,否则为int类型,绝不会是byte,short或char型。这样,如果变量i被声明为short或byte,i+1的结果会是int。如果结果超过该类型的取值范围,则按该类型的最大值取模。
运算符操作
一、运算符"+",如果必要则自动把操作数转换为String型。如果操作数是一个对象,它可定义一个方法toString()返回该对象的String方式,例如floata=1.0print(“Thevalueofais”+a+“\n”);+运算符用到的例子Strings=“a=”+a;+=运算符也可以用于String。注意,左边(下例中的s1)仅求值一次。s1+=a;//s1=s1+a//若a非String型,自动转换为String型。
二、整数算术运算的异常是由于除零或按零取模造成的。它将引发一个算术异常。下溢产生零,上溢导致越界。例如:加1超过整数最大值,取模后,变成最小值。一个op=赋值运算符,和上表中的各双目整数运算符联用,构成一个表达式。整数关系运算符<,>,<=,>=,==和!=产生boolean类型的数据。
三、数组运算符数组运算符形式如下:<expression>[<expression>]可给出数组中某个元素的值。合法的取值范围是从0到数组的长度减1。
四、对象运算符双目运算符instanceof测试某个对象是否是指定类或其子类的实例。例如:if(myObjectinstanceofMyClass){MyClassanothermyObject=(MyClass)myObject;…}是判定myObject是否是MyClass的实例或是其子类的实例。
五、浮点运算符浮点运算符可以使用常规运算符的组合:如单目运算符++、--,双目运算符+、-、*和/,以及赋值运算符+=,-=,*=,和/=。此外,还有取模运算:%和%=也可以作用于浮点数,例如:a%b和a-((int)(a/b)*b)的语义相同。这表示a%b的结果是除完后剩下的浮点数部分。只有单精度操作数的浮点表达式按照单精度运算求值,产生单精度结果。如果浮点表达式中含有一个或一个以上的双精度操作数,则按双精度运算,结果是双精度浮点数。
六、布尔运算符布尔(boolean)变量或表达式的组合运算可以产生新的boolean值,fales和true(记得是小写)。单目运算符!是布尔非。双目运算符&,|和^是逻辑AND,OR和XOR运算符,它们强制两个操作数求布尔值。为避免右侧操作数冗余求值,用户可以使用短路求值运算符&&和||。
七、用户可以使用==和!=,赋值运算符也可以用&=、|=、^=。三元条件操作符和C语言中的一样。
八、++运算符用于表示直接加1操作。增量操作也可以用加运算符和赋值操作间接完成。++lvalue(左值表示lvalue+=1,++lvalue也表示lvalue=lvalue+1。
九、--运算符用于表示减1操作。++和--运算符既可以作为前缀运算符,也可以做为后缀运算符。双目整数运算符是:运算符操作**+加-减*乘/除%取模&位与|位或^位异或<<左移 >>右移(带符号) >>>添零右移整数除法按零舍入。除法和取模遵守以下等式:
(a/b)*b+(a%b)==a
java运算符
&是位
&&是逻辑
当&两边是整数时执行的是位运算,而两边是boolean值时执行的是逻辑运算,
如:
3&6 就是执行的位运算,结果是一个整数:2
true&false 执行的就是逻辑运算,结果是一个boolean值:false
&的逻辑运算和&&逻辑运算是存在一定不同的
&逻辑运算时两边都会计算的,而&&则在左边为假时则直接返的是false不再计算右边
举个例子:
1:
int[] a={1,2,3};
if(a[0]==2&a[3]==4){System.out.println("true")}
2:
int[] a={1,2,3};
if(a[0]==2&&a[3]==4){System.out.println("true")}
这两个例子中,第一个会抛出异常,而第二个则什么不会输出也不会抛异常
这是因为第一个例子中if语句中用的是&,所以两边的都会计算,当计算a[3]==4时抛出数组下标越界异常
第二个例子则在计算第一个式子a[0]==2发现结果为假则不再计算右边,直接返回false,所以该例子不会输出任何东西 。
3:java中用的最多的一个三目运算符:A==3?b:c;
如果A=3成立的话结果是b,如果不成立的话结果是c;
运算符演示
在Java 中提供运算功能的就是运算符(Operator),算术运算符有加(+)、减(-)、乘(*)、除(/)这类的运算符。另外还有一个很常用的取模运算符(%)。这类以数学运算为主的运算符称为算术运算符(Arithmetic Operator)。
举几个算数运算的例子:
int a = 5+4; //a=9
int b = a*2; //b=18
int c = b/4; //c=4
int d = b-c; //d=14
int e = -d; //e=-14
int f = e%4; //f=-2
这里简单说一下取模运算符(%),其实就是取除法后的余数,例子中的int f = e%4,就是-14对4取余数,结果为-2。与C、 C++不同,对取模运算符%来说,其操作数可以为浮点数, 如 37.2%10=7.2
而且,Java对加运算符进行了扩展,使它能够进行字符串的连接,如"abc"+"de",得到字符串 "abcde"。但是这只是对于字符串连接的简单扩展,字符串并不支持诸如减法的其他运算。有趣的是,字符是支持加法和减法的,其参与运算的是这个字符的ASCII码值。例如b的ASCII码值比a大1,所以(‘b’-‘a’)的结果就是1。
三个移位
JAVA左移:<<带符号右移:>>
无符号右移:>>>“ < <”, “> > ”, “> > > ”在Java中是左移、有符号右移和无符号右移运算符。位移运算符只对int值进行操作,如果不是int,编译器会报错。在Java中,一个int的长度始终是32bit,也就是4个字节。
1)左移动运算符:
会将操作的数向左边移动,移动的位的个数由指定,左移(2)右移动运算符:
反过来,把操作数向右移动,移动的位个数同样由右操作数指定。(3)无正负号的右移运算符(>>>):
采用0补充,意思就是说
Test { main(String[] args) {
m=-7;
System.out.println("m的二 进 制码是:"+Integer.toBinaryString(m));
System.out.println("m>>2的二进制码是:"+Integer.toBinaryString(m>>2));
System.out.println("(m>>2)="+(m>>2));
System.out.println("m<<2的二进制码是:"+Integer.toBinaryString(m<<2));
System.out.println("(m<<2)=:"+(m<<2));
System.out.println("m>>>24的二进制码是:"+Integer.toBinaryString(m>>>24));
System.out.println(" m>>>24 :"+ (m>>>24));
}
}
-7的反码:11111111111111111111111111111000
补码:11111111111111111111111111111001

Java 运算符
计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。我们可以把运算符分成以下几组:

算术运算符
关系运算符
位运算符
逻辑运算符
赋值运算符
其他运算符
算术运算符
算术运算符用在数学表达式中,它们的作用和在数学中的作用一样。下表列出了所有的算术运算符。

表格中的实例假设整数变量A的值为10,变量B的值为20:

操作符 描述 例子
+ 加法 - 相加运算符两侧的值 A + B等于30
- 减法 - 左操作数减去右操作数 A – B等于-10
* 乘法 - 相乘操作符两侧的值 A * B等于200
/ 除法 - 左操作数除以右操作数 B / A等于2
% 取模 - 右操作数除左操作数的余数 B%A等于0
+ + 自增 - 操作数的值增加1 B + +等于21
-- 自减 -- 操作数的值减少1 B - -等于19
实例

下面的简单示例程序演示了算术运算符。复制并粘贴下面的Java程序并保存为Test.java文件,然后编译并运行这个程序:

public class Test {

  public static void main(String args[]) {
     int a = 10;
     int b = 20;
     int c = 25;
     int d = 25;
     System.out.println("a + b = " + (a + b) );
     System.out.println("a - b = " + (a - b) );
     System.out.println("a * b = " + (a * b) );
     System.out.println("b / a = " + (b / a) );
     System.out.println("b % a = " + (b % a) );
     System.out.println("c % a = " + (c % a) );
     System.out.println("a++   = " +  (a++) );
     System.out.println("a--   = " +  (a--) );
     // 查看  d++ 与 ++d 的不同
     System.out.println("d++   = " +  (d++) );
     System.out.println("++d   = " +  (++d) );
  }
}
尝试一下 »

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

a + b = 30
a - b = -10
a * b = 200
b / a = 2
b % a = 0
c % a = 5
a++   = 10
a--   = 11
d++   = 25
++d   = 27
关系运算符
下表为Java支持的关系运算符

表格中的实例整数变量A的值为10,变量B的值为20:

运算符 描述 例子
== 检查如果两个操作数的值是否相等,如果相等则条件为真。 (A == B)为假(非真)。
!= 检查如果两个操作数的值是否相等,如果值不相等则条件为真。 (A != B) 为真。
>  检查左操作数的值是否大于右操作数的值,如果是那么条件为真。 (A> B)非真。
<  检查左操作数的值是否小于右操作数的值,如果是那么条件为真。 (A <B)为真。
> = 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。 (A> = B)为假。
<= 检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。 (A <= B)为真。
实例

下面的简单示例程序演示了关系运算符。复制并粘贴下面的Java程序并保存为Test.java文件,然后编译并运行这个程序:

public class Test {

  public static void main(String args[]) {
     int a = 10;
     int b = 20;
     System.out.println("a == b = " + (a == b) );
     System.out.println("a != b = " + (a != b) );
     System.out.println("a > b = " + (a > b) );
     System.out.println("a < b = " + (a < b) );
     System.out.println("b >= a = " + (b >= a) );
     System.out.println("b <= a = " + (b <= a) );
  }
}
以上实例编译运行结果如下:

a == b = false
a != b = true
a > b = false
a < b = true
b >= a = true
b <= a = false
位运算符
Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。

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

A = 0011 1100
B = 0000 1101
-----------------
A&b = 0000 1100
A | B = 0011 1101
^ B = 0011 0001
~A= 1100 0011
下表列出了位运算符的基本运算,假设整数变量A的值为60和变量B的值为13:

操作符 描述 例子
& 按位与操作符,当且仅当两个操作数的某一位都非0时候结果的该位才为1。 (A&B),得到12,即0000 1100
| 按位或操作符,只要两个操作数的某一位有一个非0时候结果的该位就为1。 (A | B)得到61,即 0011 1101
^ 按位异或操作符,两个操作数的某一位不相同时候结果的该位就为1。 (A ^ B)得到49,即 0011 0001
〜 按位补运算符翻转操作数的每一位。 (〜A)得到-61,即1100 0011
<<  按位左移运算符。左操作数按位左移右操作数指定的位数。 A << 2得到240,即 1111 0000
>>  按位右移运算符。左操作数按位右移右操作数指定的位数。 A >> 2得到15即 1111
>>>  按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 A>>>2得到15即0000 1111
实例

下面的简单示例程序演示了位运算符。复制并粘贴下面的Java程序并保存为Test.java文件,然后编译并运行这个程序:

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 >> 15
a >>> 15
逻辑运算符
下表列出了逻辑运算符的基本运算,假设布尔变量A为真,变量B为假

操作符 描述 例子
&& 称为逻辑与运算符。当且仅当两个操作数都为真,条件才为真。 (A && B)为假。
| | 称为逻辑或操作符。如果任何两个操作数任何一个为真,条件为真。 (A | | B)为真。
! 称为逻辑非运算符。用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false。 !(A && B)为真。
实例

下面的简单示例程序演示了逻辑运算符。复制并粘贴下面的Java程序并保存为Test.java文件,然后编译并运行这个程序:

public class Test {
  public static void main(String args[]) {
     boolean a = true;
     boolean b = false;
     System.out.println("a && b = " + (a&&b));
     System.out.println("a || b = " + (a||b) );
     System.out.println("!(a && b) = " + !(a && b));
  }

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

a && b = false
a || b = true
!(a && b) = true
赋值运算符
下面是Java语言支持的赋值运算符:

操作符 描述 例子
= 简单的赋值运算符,将右操作数的值赋给左侧操作数 C = A + B将把A + B得到的值赋给C
+ = 加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数 C + = A等价于C = C + A
- = 减和赋值操作符,它把左操作数和右操作数相减赋值给左操作数 C - = A等价于C = C -
 A
* = 乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数 C * = A等价于C = C * A
/ = 除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数 C / = A等价于C = C / A
(%)= 取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数 C%= A等价于C = C%A
<< = 左移位赋值运算符 C << = 2等价于C = C << 2
>> = 右移位赋值运算符 C >> = 2等价于C = C >> 2
&= 按位与赋值运算符 C&= 2等价于C = C&2
^ = 按位异或赋值操作符 C ^ = 2等价于C = C ^ 2
| = 按位或赋值操作符 C | = 2等价于C = C | 2
实例

面的简单示例程序演示了赋值运算符。复制并粘贴下面的Java程序并保存为Test.java文件,然后编译并运行这个程序:

public class Test {
  public static void main(String args[]) {
     int a = 10;
     int b = 20;
     int c = 0;
     c = a + b;
     System.out.println("c = a + b = " + c );
     c += a ;
     System.out.println("c += a  = " + c );
     c -= a ;
     System.out.println("c -= a = " + c );
     c *= a ;
     System.out.println("c *= a = " + c );
     a = 10;
     c = 15;
     c /= a ;
     System.out.println("c /= a = " + c );
     a = 10;
     c = 15;
     c %= a ;
     System.out.println("c %= a  = " + c );
     c <<= 2 ;
     System.out.println("c <<= 2 = " + c );
     c >>= 2 ;
     System.out.println("c >>= 2 = " + c );
     c >>= 2 ;
     System.out.println("c >>= a = " + c );
     c &= a ;
     System.out.println("c &= 2  = " + c );
     c ^= a ;
     System.out.println("c ^= a   = " + c );
     c |= a ;
     System.out.println("c |= a   = " + c );
  }

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

c = a + b = 30
c += a  = 40
c -= a = 30
c *= a = 300
c /= a = 1
c %= a  = 5
c <<= 2 = 20
c >>= 2 = 5
c >>= 2 = 1
c &= a  = 0
c ^= a   = 10
c |= a   = 10
条件运算符(?:)
条件运算符也被称为三元运算符。该运算符有3个操作数,并且需要判断布尔表达式的值。该运算符的主要是决定哪个值应该赋值给变量。

variable x = (expression) ? value if true : value if false
实例

public class Test {
   public static void main(String args[]){
      int a , b;  
      a = 10;   
b = (a == 1) ? 20: 30;   
System.out.println( "Value of b is : " +  b );
      b = (a == 10) ? 20: 30;   
     System.out.println( "Value of b is : " + b );
   }
}
以上实例编译运行结果如下:

Value of b is : 30
Value of b is : 20
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
Java运算符优先级
当多个运算符出现在一个表达式中,谁先谁后呢?这就涉及到运算符的优先级别的问题。在一个多运算符的表达式中,运算符优先级不同会导致最后得出的结果差别甚大。

例如,(1+3)+(3+2)*2,这个表达式如果按加号最优先计算,答案就是 18,如果按照乘号最优先,答案则是 14。

再如,x = 7 + 3 * 2;这里x得到13,而不是20,因为乘法运算符比加法运算符有较高的优先级,所以先计算3 * 2得到6,然后再加7。

下表中具有最高优先级的运算符在的表的最上面,最低优先级的在表的底部。

类别 操作符 关联性
后缀 () [] . (点操作符) 左到右
一元 + + - !〜 从右到左
乘性  * /% 左到右
加性  + - 左到右
移位  >> >>>  <<  左到右
关系  >> = << =  左到右
相等  ==  != 左到右
按位与 & 左到右
按位异或 ^ 左到右
按位或 | 左到右
逻辑与 && 左到右
逻辑或 | | 左到右
条件 ?: 从右到左
赋值 = + = - = * = / =%= >> = << =&= ^ = | = 从右到左
逗号 , 左到右

位运算符主要针对二进制,它包括了:“与”、“非”、“或”、“异或”。从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算。下面详细介绍每个位运算符。
 

1.与运算符
与运算符用符号“&”表示,其使用规律如下:
两个操作数中位都为1,结果才为1,否则结果为0,例如下面的程序段。
public class data13
{
public static void main(String[] args)
{
int a=129;
int b=128;
System.out.println("a 和b 与的结果是:"+(a&b));
}
}
运行结果
a 和b 与的结果是:128
下面分析这个程序:
“a”的值是129,转换成二进制就是10000001,而“b”的值是128,转换成二进制就是10000000。根据与运算符的运算规律,只有两个位都是1,结果才是1,可以知道结果就是10000000,即128。
 

2.或运算符
或运算符用符号“|”表示,其运算规律如下:
两个位只要有一个为1,那么结果就是1,否则就为0,下面看一个简单的例子。
public class data14
{
public static void main(String[] args)
{
int a=129;
int b=128;
System.out.println("a 和b 或的结果是:"+(a|b));
}
}
运行结果
a 和b 或的结果是:129
下面分析这个程序段:
a 的值是129,转换成二进制就是10000001,而b 的值是128,转换成二进制就是10000000,根据或运算符的运算规律,只有两个位有一个是1,结果才是1,可以知道结果就是10000001,即129。
 

3.非运算符
非运算符用符号“~”表示,其运算规律如下:
如果位为0,结果是1,如果位为1,结果是0,下面看一个简单例子。
public class data15
{
public static void main(String[] args)
{
int a=2;
System.out.println("a 非的结果是:"+(~a));
}
}
 

4.异或运算符
异或运算符是用符号“^”表示的,其运算规律是:
两个操作数的位中,相同则结果为0,不同则结果为1。下面看一个简单的例子。
public class data16
{
public static void main(String[] args)
{
int a=15;
int b=2;
System.out.println("a 与 b 异或的结果是:"+(a^b));
}
}
运行结果
a 与 b 异或的结果是:13
分析上面的程序段:a 的值是15,转换成二进制为1111,而b 的值是2,转换成二进制为0010,根据异或的运算规律,可以得出其结果为1101 即13。


Java中的运算符(操作符)
    程序的基本功能是处理数据,任何编程语言都有自己的运算符。因为有了运算符,程序员才写出表达式,实现各种运算操作,实现各种逻辑要求。
   为实现逻辑和运算要求,编程语言设置了各种不同的运算符,且有优先级顺序,所以有的初学者使用复杂表达式的时候搞不清楚。这里详细介绍一下Java中的运算符。
    Java运算符很多,下面按优先顺序列出了各种运算符。
 
 
优先级 运算符分类 结合顺序 运算符




分隔符 左结合 .    []     ( )     ;      ,
一元运算符 右结合 !  ++     --     -   ~
算术运算符
移位运算符
左结合 *     /      %    +     -      <<   >>   >>>
关系运算符 左结合 <     >     <=   >=   instanceof(Java 特有)   = =  !=
逻辑运算符 左结合 ! &&  ||  ~  &  |  ^ 
三目运算符 右结合 布尔表达式?表达式1:表达式2
赋值运算符 右结合 =  *=     /=  %=   +=   -=    <<= >>= >>>=  &=  *=  |=
 
一、一元运算符
    因操作数是一个,故称为一元运算符。
运算符 含义 例子
- 改变数值的符号,取反 -x(-1*x)
~ 逐位取反,属于位运算符 ~x
++ 自加1 x++
-- 自减1 x--
++x 因为++在前,所以先加后用。
x++ 因为++在后,所以先用后加。
注意:a+ ++b和a+++b是不一样的(因为有一个空格)。
  int a=10;
  int b=10;
  int sum=a+ ++b;
  System.out.println("a="+a+",b="+b+",sum="+sum);
运行结果是: a=10,b=11,sum=21
  int a=10;
  int b=10;
  int sum=a+++b;
  System.out.println("a="+a+",b="+b+",sum="+sum);
运行结果是:a=11,b=10,sum=20
n=10;
m=~n;
变量n的二进制数形式:                 00000000 00000000 00000000 00001010
逐位取反后,等于十进制的-11: 11111111 11111111 11111111 11110101 
二、算术运算符
    所谓算术运算符,就是数学中的加、减、乘、除等运算。因算术运算符是运算两个操作符,故又称为二元运算符。
运算符 含义 例子
+ 加法运算 x+y
- 减法运算 x-y
* 乘法运算 x*y
/ 除法运算 x/y
% 取模运算(求余运算) x%y
    这些操作可以对不同类型的数字进行混合运算,为了保证操作的精度,系统在运算过程中会做相应的转化。数字精度的问题,我们在这里不再讨论。下图中展示了运算过程中,数据自动向上造型的原则。
 

 
    注:1、实线箭头表示没有信息丢失的转换,也就是安全性的转换,虚线的箭头表示有精度损失的转化,也就是不安全的。
      2、当两个操作数类型不相同时,操作数在运算前会子松向上造型成相同的类型,再进行运算。
示例如下:
 
[java] view plaincopy
int a=22;  
int b=5;  
double c=5;  
  
System.out.println(b+"+"+c+"="+(b+c));  
System.out.println(b+"-"+c+"="+(b-c));  
System.out.println(b+"*"+c+"="+(b*c));  
System.out.println(a+"/"+b+"="+(a/b));  
System.out.println(a+"%"+b+"="+(a%b));  
System.out.println(a+"/"+c+"="+(a/c));  
System.out.println(a+"%"+c+"="+(a%c));  
运行结果如下:
5+5.0=10.0
5-5.0=0.0
5*5.0=25.0
22/5=4
22%5=2
22/5.0=4.4
22%5.0=2.0
三、移位运算符
   移位运算符操作的对象就是二进制的位,可以单独用移位运算符来处理int型整数。
运算符 含义 例子
<< 左移运算符,将运算符左边的对象向左移动运算符右边指定的位数(在低位补0) x<<3
>> "有符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数。使用符号扩展机制,也就是说,如果值为正,则在高位补0,如果值为负,则在高位补1. x>>3
>>> "无符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数。采用0扩展机制,也就是说,无论值的正负,都在高位补0. x>>>3
 

 
 
以int类型的6297为例,代码如下:
[java] view plaincopy
System.out.println(Integer.toBinaryString(6297));   
System.out.println(Integer.toBinaryString(-6297));   
System.out.println(Integer.toBinaryString(6297>>5));   
System.out.println(Integer.toBinaryString(-6297>>5));   
System.out.println(Integer.toBinaryString(6297>>>5));   
System.out.println(Integer.toBinaryString(-6297>>>5));   
System.out.println(Integer.toBinaryString(6297<<5));   
System.out.println(Integer.toBinaryString(-6297<<5));  
 
  运行结果:
1100010011001
11111111111111111110011101100111
11000100
11111111111111111111111100111011
11000100
111111111111111111100111011
110001001100100000
11111111111111001110110011100000
注:x<<y 相当于 x*2y ;x>>y相当于x/2y
    从计算速度上讲,移位运算要比算术运算快。
    如果x是负数,那么x>>>3没有什么算术意义,只有逻辑意义。
四、关系运算符
Java具有完备的关系运算符,这些关系运算符同数学中的关系运算符是一致的。具体说明如下:
运算符 含义 例子
< 小于 x<y
> 大于 x>y
<= 小于等于 x<=y
>= 大于等于 x>=y
== 等于 x==y
!= 不等于 x!=y
instanceof操作符用于判断一个引用类型所引用的对象是否是一个类的实例。操作符左边的操作元是一个引用类型,右边的操作元是一个类名或者接口,形式如下:
obj instanceof ClassName      或者    obj instanceof InterfaceName
关系运算符产生的结果都是布尔型的值,一般情况下,在逻辑与控制中会经常使用关系运算符,用于选择控制的分支,实现逻辑要求。
需要注意的是:关系运算符中的"=="和"!="既可以操作基本数据类型,也可以操作引用数据类型。操作引用数据类型时,比较的是引用的内存地址。所以在比较非基本数据类型时,应该使用equals方法。
五、逻辑运算符
逻辑非关系值表
A !A
true false
false
true
 
逻辑与关系值表
A B A&&B
false false false
true false false
false true false
true true true
 
逻辑或关系值表
A B A||B
false false false
true false true
false true    true 
true true true
 
在运用逻辑运算符进行相关的操作,就不得不说“短路”现象。代码如下:
if(1==1 && 1==2 && 1==3){  }
代码从左至右执行,执行第一个逻辑表达式后:true && 1==2 && 1==3
执行第二个逻辑表达式后:true && false && 1==3
因为其中有一个表达式的值是false,可以判定整个表达式的值是false,就没有必要执行第三个表达式了,所以java虚拟机不执行1==3代码,就好像被短路掉了。
逻辑或也存在“短路”现象,当执行到有一个表达式的值为true时,整个表达式的值就为true,后面的代码就不执行了。
“短路”现象在多重判断和逻辑处理中非常有用。我们经常这样使用:
[java] view plaincopy
public void a(String str){  
  if(str!=null && str.trim().length()>0){  
      
  }  
}  
如果str为null,那么执行str.trim().length()就会报错,短路现象保证了我们的代码能够正确执行。
在书写布尔表达式时,首先处理主要条件,如果主要条件已经不满足,其他条件也就失去了处理的意义。也提高了代码的执行效率。
位运算是对整数的二进制位进行相关操作,详细运算如下:
非位运算值表
A ~A
1 0
  0 
1
与位运算值表
A B A&B
1 1 1
1 0 0
0 1 0
0 0 0

或位运算值表
A B A | B
1 1 1
1 0 1
0 1 1
0 0 0

异或位运算值表
A B A&B
1 1 0
1 0 1
0 1 1
0 0 0
示例如下:
[java] view plaincopy
int a=15;  
int b=2;  
  
System.out.println(a+"&"+b+"="+(a&b));  
System.out.println(a+"|"+b+"="+(a|b));  
System.out.println(a+"^"+b+"="+(a^b));  
运算结果如下:
15&2=2
15|2=15
15^2=13
程序分析:
a 1 1 1 1 15
b 0 0 1 0 2
a&b 0 0 1 0 2
a|b 1 1 1 1 15
a^b 1 1 0 1 13
按位运算属于计算机低级的运算,现在我们也不频繁的进行这样的低级运算了。
六、三目运算符
 三目运算符是一个特殊的运算符,它的语法形式如下:
布尔表达式?表达式1:表达式2
运算过程:如果布尔表达式的值为true,就返回表达式1的值,否则返回表达式2的值,例如:
int sum=90;
String str=sum<100 ? "失败" : "成功";
等价于下列代码:
String str=null;
if(num<100){
  str="失败";
}else{
  str="成功";
}
三目运算符和if……else语句相比,前者使程序代码更加简洁。
七、赋值运算符
赋值运算符是程序中最常用的运算符了,示例如下:
运算符 例子 含义
+= x+=y x=x+y
-= x-=y x=x-y
*= x*=y x=x*y
/= x/=y x=x/y
%= x%=y x=x%y
>>= x>>=y x=x>>y
>>>= a>>>=y x=x>>>y
<<= a<<=y x=x<<y
&= x&=y x=x&y
|= x|=y x=x|y
^= x^=y x=x^y
大家可以根据自己的喜好选择合适的运算符。
补充:
字符串运算符: + 可以连接不同的字符串。
转型运算符: () 可以将一种类型的数据或对象,强制转变成另一种类型。如果类型不相容,会报异常出来。

package com.zf.binary;


public class Test1 {

public static void main(String[] args) {

/* 符号为:最高位同时表示图号,0为正数,1为负数 */

/*
1、二进制转换为十进制

二进制转换为10进制的规律为: 每位的值 * 2的(当前位-1次方)
例如:
    00000001 = 0 * 2^7 + 0 * 2^6 + 0 * 2^5 + 0 * 2^4 + 0 * 2^3 + 0 * 2^2 + 0 * 2^1 + 1 * 2^0  = 1
    00000010 = 0 * 2^7 + 0 * 2^6 + 0 * 2^5 + 0 * 2^4 + 0 * 2^3 + 0 * 2^2 + 1 * 2^1 + 0 * 2^0  = 2
   
2、二进制的符号位:
最高位表示符号位,0表示正数  , 1表示负数


3、将二进制负数转换为十进制:先对该二进制数取反,然后加1,再转换为十进制,然后在前面加上负号
例如: 10101011 最高位为1,所以为负数
           第一步:取反: 01010100
           第二步:加1 : 01010101
           第三步:转换为10进制:85
           第四步:加上负号: -85
           所以      10101011 转换为十进制为 -85
          
    4、将十进制负数转换为二进制:先得到该十进制负数的绝对值,然后转换为二进制,然后将该二进制取反,然后加1
    例如:-85
    第一步:得到绝对值 85
    第二步:转换为二进制:01010101
    第二步:取反:                10101010
    第三步:加1:                 10101011
    所以,-85转换为二进制为  10101011
*/

/*
~ ‘非’ 运算符是将目标数的进制去反,即0变成1 ,1变成0
2的二进制码为 00000010 , 它取反为11111101 ,可见取反后结果为负数(二进制负数转换为十进制的步骤为:将二进制去反,然后+1)
将 11111101 转换为10进制 ,第一步去反 得到 00000010 然后 加1 得到 00000011 ,得到的结果为3 ,然后在前面加上负号就可以了
所以结果为-3
*/
System.out.println(~2);

/*
  ^ 异或 ,计算方式为:两个二进制数的位相同则为0 不同则为1
  23转换为二进制为:00010111
  12转换为二进制为:00001100
          计算结果为:00011011  =  27
*/
System.out.println(23 ^ 12);

/*
& 按位与 ,计算方式为:两个二进制数的位都为1则为1 ,否则为0
1的二进制为 :00000001
2的二进制为 :00000010
  结果为 :00000000 = 0
*/
System.out.println(1&2);

/*
  | 按位或 ,计算方式为:两个二进制位有一个为1就为1,否者为0
  5 的二进制为:00000101
  6 的二进制为:00000110
        结果为:00000111 = 7
*/
System.out.println( 5 | 6);


/*
  >> 有符号右移位  ,符号左边表示要被移位的数,右边表示需要移的位数,结果为正数则在左边补0,否则补1
  3 的二进制为:00000010
        向右移动1位:00000001 = 1
*/
System.out.println(3 >> 1);


}

}


1、大部分操作符只能操作基本类型(primitives),只有=、==和!=可以操作对象,另外String支持+和+=
2、在=两边,右值(rvalue)可以是常数、变量或表达式,左值(lvalue)必须是一个变量,即必须有物理空间来存储rvalue
3、对基本类型赋值,是将一个地方的内存复制到了另一个地方
[@more@]
1、大部分操作符只能操作基本类型(primitives),只有=、==和!=可以操作对象,另外String支持+和+=
2、在=两边,右值(rvalue)可以是常数、变量或表达式,左值(lvalue)必须是一个变量,即必须有物理空间来存储rvalue
3、对基本类型赋值,是将一个地方的内存复制到了另一个地方
4、为对象赋值时,只是将引用从一个地方复制到另一个地方,如对象a和b,使a=b,则a和b两个引用操作同一个对象,使用a.i改变对象中的i值后,打印b.i,可以看到也被改变了
5、向方法中传递一个对象做参数,实际传递的是对象的引用,所以方法中对对象所做的修改,在方法外仍然持续有效。
6、整数除法会直接去掉结果的小数位,不会进行四舍五入进位
7、用==和!=来比较引用时,指向同一对象的引用相等,否则不等
8、若要比较两个引用指向的两个对象内容是否相等,使用.equal()方法,自定义类型需要自行重载.equal()函数,否则.equal()函数默认比较引用,只有jdk自带类型的.equal()可以直接使用
9、逻辑与、逻辑或、逻辑非(&&、||、!)操作只可以应用于boolean值,不可用于比较非boolean值
10、boolean可以自动转成String
11、短路(short-circuiting)现象:一旦能够明确无误的确定整个表达式的值,程序就不再计算表达式余下的部分了,因此,一个逻辑表达式靠后的部分可能不会被运算。所以要注意是否在逻辑表达式中对变量值进行了修改操作,如果这一部分表达式没有运算,值也就没有被修改
12、位操作符(bitwise operator):按位与(&)、按位或(|)、按位非(~)、异或(^),位运算表达式不会短路
13、移位操作符(shift operator):左移位操作符(<<),低位补0;右移位操作符(>>),若符号为正,则高位补0,若符号为负,则高位补1,即始终维持符号不变;无符号右移位操作符(>>>),无论正负,高位都补0
14、boolean-exp ? value0 : value1,三元操作符,如果boolean表达式为true,则以value0为结果,否则以value1为结果
15、类型转换操作符(casting operator):就是强制转换,一般用于进行窄化转换(narrowing conversion)。java允许由低精度类型向高精度类型自动转换,如把int值赋给long,但反之则必须手工强制转换
16、boolean类型不能和除字符串外的任何类型相互转换。
17、表达式中出现的最大(所占位数最多,如double比int多,不是指数值最大)的数据类型决定了表达式最终结果的数据类型
18、Java中所有的数据类型在所有平台上的大小都是相同的,它被固定在语言中了
19、int(其它数值型也可以)数过大时可能产生溢出,但java无论是编译还是运行时,都不会报这个错误或异常,结果显然是错误的
20、控制程序流程时所用的判断必须是boolean,不允许使用普通数字,必须先转换成boolean,如if(a!=0)
21、迭代(iteration),也可以理解为循环
22、break强行退出循环,跳过循环语句,执行后面的代码,continue停止当次循环,开始下一次循环
23、无穷循环有两种形式:for(;;)或while(true),它们是等价的,使用时要小心,循环体内一定要有break或return之类的语句,且执行它们条件必须是可以满足的
24、可以为循环标上label,之后使用continue label或break label来控制程序流程,语法为在循环定义行前加上"label1:"
25、switch语句的条件和其中各个case都必须是int或char(直接用数字或单引号加字符,如'a'),每个case后别忘了break,否则无法退出来(当然某些特殊情况下你可能并不想退出来,而是想要一次执行多个case,default后就不需要break了,执行过default自然会退出,不过放一个break会使风格看起来更整齐)
26、Math.random()用于产生一个01之间的随机double数,严格的说,它的结果包括0,但不包括
1







猜你喜欢

转载自zhyp29.iteye.com/blog/2305192
今日推荐