浅谈Java操作符与其优先级

作者:风生水起 时间:2022-09-27 19:42:44 

几乎所有运算符都只能操作“主类型”(Primitives)。例外是“=”、“= =”和“! =”,它们能操作所有对象。除此以外,String类支持“+”和“+=”。

基本类型存储了实际的数值。而并非指向一个对象的引用。所以在为其赋值的时候,是直接把一个地方的内容复制到了另一个地方。例如,对基本数据类型使用a=b,那么b的内容就复制给了a。若接着修改了a,而b根本不会受这种修改的影响。(在上一篇java编程思想(2)中,我们就知道基本类型是存储在堆栈中的。假设a=4,那么堆栈中如果没有4,则会开辟一个空间,使值为4。a=b之后,b也指向了堆栈中的这个4。此时a再等于5。那么会重新在堆栈中寻找5,若没有则新开辟使之为5,然后a指向5。故不会影响b)

但是在为对象“赋值”的时候,情况会发生变化。首先我们知道,对对象的操作,我们真正操作的是对对象的引用。所以倘若"将一个对象赋值给另一个对象",实际上是将“引用”从一个地方复制到另一个地方。这意味着如果对对象使用c=d之后,那么c和d都将指向原来只有d指向的那个对象(两个遥控器(引用)都能操作按个电视机(对象)了)。

优先级:


     操作

优先级

结合性

1

后缀运算符

[ ] . ( ) (函数呼叫)

从左到右

2

单目运算符

! ~ ++ -- +(单操作数) –(单操作数)

从右到左

3

创建

new

从左到右

4

乘除

* / %

从左到右

5

加减

+ -

从左到右

6

移位

<< >> >>>

从左到右

7

关系

< <= > >= instanceof

从左到右

8

相等

== !=

从左到右

9

按位与

&

从左到右

10

按位异或

^

从左到右

11

按位或


从左到右

12

逻辑与

&&

从左到右

13

逻辑或


从左到右

14

条件

? :

从右到左

15

赋值

= += -= *= /= %= ^= <<= >>= >>>=

从右到左

(1)赋值

主类型使用“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;(可以正确编译) +=运算符无类型转换问题

(2)算术运算符

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

(3)自动递增、递减

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

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

(4)关系运算符

关系运算符包括<、>、<=、>=、= =、!=

等于和不等于适用于所有内建的数据类型,但其他比较不适用于boolean类型。

想对比两个对象的实际内容是否相同,必须使用所有对象都适用的特殊方法equals()。

equals()方法不适用于“主类型”,那些类型直接使用= =和!=即可。

equals()的默认是比较句柄。所以除非在自己的新类中改变了equals(),否则不可能表现出我们希望的行为

大多数Java类库都实现了equals(),所以它实际比较的是对象的内容,而非它们的句柄

= =和! =比较的是对象句柄,而不是对象的实际内容

(5)逻辑运算符

逻辑运算符&&、||、!能生成一个布尔值

&和&&都可作为逻辑运算符“与”使用,但是&&是“短路与”,运算时先判断符号前面的表达式的值,如果能够确定整个表达式的值,则不进行符号后面的表达式的运算。

另外,&可作为位运算符使用

(6)按位运算符

按位AND运算符(&)

按位OR运算符(|)

按位XOR(^,异或)

按位NOT(~,也叫作“非”运算符)属于一元运算符,生成与输入位的相反的值

(7)移位运算符

左移位运算符(<<)能将运算对象向左移动运算符右侧指定的位数(在低位补0)。

有符号右移位运算符(>>)将运算对象向右移动运算符右侧指定的位数。有符号右移位运算符使用了符号扩展:若值为正,则在高位插入0;若值为负,则在高位插入1

无符号右移位运算符(>>>),它使用了“零扩展”:无论正负,都在高位插入0

(8)三元IF-ELSE运算符

布尔表达式 ? 值0:值1 “布尔表达式”的结果为true,就计算“值0”,否则计算“值1”

(9)字符串运算符+


int x = 0, y = 1, z = 2;
System.out.println(“out:” + x + y + z);

在这里,Java编译程序会将x,y和z转换成它们的字串形式,而不是先把它们加到一起

运用“String +”时,若表达式以一个String起头,那么后续所有运算对象都会转换到字串。

想通过“加号”连接字串(使用Java的早期版本),请务必保证第一个元素是字串

(10)造型(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.

总结

多模字符串匹配算法原理及Java实现代码

Rxjava功能操作符的使用方法详解

浅谈java中字符串数组、字符串、整形之间的转换

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

来源:http://www.cnblogs.com/end/archive/2013/01/21/2870164.html

标签:java,运算符,优先级
0
投稿

猜你喜欢

  • C# File类中的文件读写方法详解

    2023-04-14 09:52:08
  • flutter material widget组件之信息展示组件使用详解

    2023-06-22 08:45:35
  • c#将字节数组转成易读的字符串的实现

    2022-03-02 21:38:31
  • Java Swing实现坦克大战游戏

    2021-12-16 21:04:03
  • C#用户定义类型转换详解

    2022-06-07 11:44:32
  • 解读List list=new ArrayList()是怎么回事

    2022-04-17 12:28:22
  • 如何基于java实现Gauss消元法过程解析

    2023-12-15 21:51:08
  • SSH原理及两种登录方法图文详解

    2023-11-14 11:10:53
  • C++内存对齐的实现

    2023-11-22 00:42:20
  • 详解Java中的时区类TimeZone的用法

    2023-11-29 02:03:09
  • 深入理解java重载和重写

    2022-09-28 12:19:32
  • Android之沉浸式状态栏的实现方法、状态栏透明

    2022-01-02 17:49:21
  • LRU缓存替换策略及C#实现方法分享

    2021-08-27 04:20:49
  • java对double数组排序示例分享

    2022-07-13 03:22:14
  • C#队列的简单使用

    2022-01-21 03:05:42
  • C# lambda表达式原理定义及实例详解

    2021-07-26 21:44:44
  • C# 静态变量与静态方法实例研究

    2023-04-23 04:26:00
  • Android中butterknife的使用与自动化查找组件插件详解

    2021-09-18 06:58:36
  • java实现简单的小超市程序

    2023-05-17 00:04:29
  • Java8 CompletableFuture 异步多线程的实现

    2023-07-21 08:07:15
  • asp之家 软件编程 m.aspxhome.com