基础二:操作符

使用Java操作符

操作符接受一个或者多个参数,并生成一个新值。

操作符用于操作数,生成一个新值。 另外有些操作符可能会改变操作数自身的值,这被称为“副作用”。

这些能改变操作数的操作符最普遍的作用就是产生副作用。

几乎所有的操作符都只能操作“基本类型”。 例外的操作符是 = == 和 != 。

这些操作符能操作所有的对象。 除此之外,String类支持 + 和 +=.


优先级

当一个表达式中存在多个操作符时,操作符的优先级决定了各个部分的计算顺序。 最简单的规则就是先乘除后加减。另外也要明确括号的作用。

赋值

赋值使用操作符 “=” 。
它的意思是 取右边的值 ,把它赋值给左边。

右边可以是任意数、变量或者表达式(只要能生成一个值就行),左边必须是一个明确的已命名的变量。 也就是说,必须有一个物理空间可以存储等号右边的值。

比如 :

a = 4 ;

但是不能把任何东西赋值给一个常数,常数不能作为左值。比如(4 = a ; worong !)

对于基本数据类型的赋值:

    基本类型存储了实际的数值,而并非指向一个对象的引用,所以在为其赋值的时候,是直接将一个地方的内容复制到了另一个地方。 另外,对基本数据类型使用 a = b ,那么b的内容就复制给a,若紧接着修改a,b的值不受这种修改的影响

这里写图片描述

但是在为对象赋值的时候,情况却发生了变化:

        对一个对象进行操作时,我们真正操作的是对象的引用。 所以倘若“将一个对象赋值给另外一个对象”,实际上是将“引用”从一个地方复制到另外一个地方。  这意味着假若对对象使用c = d ,那么c和d都指向原来只有d指向的那个对象。

这里写图片描述

Tank类有两个实例 t1和t2, 分别对level域赋不同的值,然后将t2赋给t1,紧接着又修改t1.

由于赋值操作的是一个对象的引用,所有修改t1的同时,也改变了t2. 这是由于t1和t2包含的是相同的引用,他们指向相同的对象(原来t1包含的对对象的引用,是指向一个值为9的对象,在对t1赋值的时候,这个引用被覆盖了,也就是丢失了;而那个不再被引用的对象会有垃圾回收器自动清理)。

这种特使的现象被称为“别名现象”,是java操作对象的一种基本方式,如何避免的?可以这样写

t1.level = t2.level ;

这样便可以保持两个对象彼此独立,而不是将t1和t2绑定到相同的对象上。

算数操作符

+ - * / 加减乘除 以及取模操作符 %

要将x+4,并将结果赋值给x ,可以写成 x +=4 ;

通过Random类的对象,程序可以生成许多不同类型的随机数字,只需要调用
这里写图片描述

传递给netxtInt()的参数设置了所产生随机数的上线,而其下限为0 。 但是这个下限并不是我们所想要的,可以对结果进行+1操作。


自动递增和递减

++ –

举个例子 假设 a是一个int值,++a 就能等价于 a = a +1 ;

递增和递减操作符不仅改变了变量,并且以变量值作为生成的结果。

这两个操作符各有两种使用方式,通常称为前缀式和后缀式。

前缀递增: 表示 ++操作符位于变量或者表达式的前面,反之 后缀递增 ++操作符位于变量或者表达式的后面。

类似的,前缀递增递减 一样的..

**对于前缀形式:执行完运算后才得到值。
对于后缀形式:在运算之前就得到值**。

他们是除了那些设计赋值的操作符以外,唯一就有“副作用”的操作符。 也就是说,他们会改变操作数,而不仅仅是使用自己的值。

    int i = 1;
        System.out.println("i:" + i); // 1
        System.out.println("=======================");
        System.out.println("++i:" + ++i); // 2    先执行运算 i首先加1,此时i为2,并以变量(即i=2)的值作为结果
        System.out.println("i:" + i); // 2
        System.out.println("i++:" + i++); // 2  先给变量i赋值(i=2)因为是以变量的的值作为结果,所以 i++ 的值为2,在执行运算,运算后 i+1变为3
        System.out.println("i:" + i); // 3
        System.out.println("=======================");
        System.out.println("--i:" + --i); // 2   先运算,运算后3-1后 i为2 ,再赋值,此时i 为2
        System.out.println("i:" + i); // 2
        System.out.println("i--:" + i--); // 2
        System.out.println("i:" + i); // 1

这里写图片描述

关系操作符

关系操作符生成的是一个boolean结果。

真实则为true,反之false。

主要包括一下符号:

< 、 > 、<=、>= 、 == 以及 !=

测试对象的等价性

这里写图片描述

尽管对象的内容相同,但是对象的引用确实不同的,而 ==和 != 比较的是对象的引用。

如果相比较两个对象的实际内容是否相同,需要使用 equals().

这里写图片描述

假设我们创建了自己的类,就像下面那样

这里写图片描述

what the fuck ? 又是false了…..

这是因为 equals()的默认行为是比较引用, 所以除非在自己的新类中覆盖equals方法,否则不可能表现出我们希望的行为。

这里写图片描述

大多是java库都实现了equals方法,以便用来比较对象的内容,而非对象的引用。


逻辑操作符

与 && 或 || 非 ! ,返回一个布尔值。

直接常量

直接常量后面的后缀字符标识了它的类型。

若为 大写或者小写的L,代表long
F ,代表float
D,代表都变了

十六进制适用于所有整数数据类型,以前缀 0x或者0X,后面跟随0~9或者大写(或小写)的a~f来表示。

八进制数由前缀0以及后续的0~7的数字来表示。

按位操作符

用来操作二进制

&= 按位与赋值
|= 按位或赋值
^= 按位非赋值

移位操作符

也是用来操作二进制

= 右移赋值

= 无符号右移赋值
<<= 赋值左移

三目表达式

boolean-exp ? value0 : value1

boolean-exp 为true,则计算 value0 ,反之计算 value1 .


字符串操作符 + 和 +=

这个操作符在java中有一项特殊的用途: 连接不同的字符串

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小工匠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值